На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Недоработки и проблемы с mapVisibilityZone

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Недоработки и проблемы с mapVisibilityZone
 
Доброго времени суток.

При работе с функцией mapVisibilityZone столкнулся с двумя нюансами:
1. После построения зоны видимости вся карта получает вертикальное смещение после отрисовки, а после удаления зоны видимости с экрана возвращается назад на полученное ранее смещение.
2. Результат построения зоны видимости зависит от выбранной проекции и удаления от меридиана, чьё направление больше всех совпадает с направлением на верх экрана. Т.е. при удалении от вертикальной линии на карте, загруженной в проекции Гаусса-Крюгера, получаю результат повёрнутый на угол, соответствующий наклону меридианов. Растр просто не проецируется на карту, а загружается как изображение при рендеринге.

Спасибо.
С уважением,
Александр
 
Здравствуйте!

Не могли бы Вы прислать небольшой пример кода для воспроизведения проблемы и, при необходимости, тестовые данные.
 
Цитата
Александр Савелов написал:
Здравствуйте!

Не могли бы Вы прислать небольшой пример кода для воспроизведения проблемы и, при необходимости, тестовые данные.
К сожалению выдрать кусок кода из проекта, в котором я работаю, не представляется возможным, поэтому я опишу как это определяю:
Пользователю предоставляется инструмент, при помощи которого задаётся область обсчёта зоны видимости:
http://imageup.ru/s2832391
Координаты всех точек геодезические и при отрисовке конвертируются в пиксели. После построения зоны видимости получаю это:
http://imageup.ru/s2832402
Смещение экрана тут не показать, так что добавлю только самокомментированный код генерации зоны:
Код
    TBUILDZONEVISIBILITY bzv;
    memset( &bzv, 0, sizeof( TBUILDZONEVISIBILITY));
    double x, y;
    m_projection->geo2Plane( center.m_lat, center.m_lon, x, y);
    bzv.PointCenter.x = x;
    bzv.PointCenter.y = y;
    bzv.RadiusMeter = distance;
    bzv.Azimuth = azimuth * M_PI / 180.;
    bzv.Angle = viewAngle * M_PI / 180.;
    bzv.DeltaHight = height;
    bzv.DeltaObservation = 0;
    bzv.VisionRst = 0;
    bzv.StyleRst = 1;
    bzv.ColorRst = 0xFF;
    bzv.Inversion = 0;
    rstNum = mapVisibilityZone( m_hMap, namerst, &bzv);

Азимут определяется так:
Код
    double resAzimuth = 0;
    HOBJ obj = mapCreateObject( m_hMap);
    mapAppendSemantic( obj, 67, "13", 5);
    mapRegisterObject( obj, 81110000, LOCAL_LINE);
    mapAppendPointGeo( obj, lat0 * TO_RAD, lon0 * TO_RAD);
    mapAppendPointGeo( obj, lat1 * TO_RAD, lon1 * TO_RAD);
    resAzimuth = mapSideAzimuth( obj, 1, 0);
    mapClearObject( obj);
    mapFreeObject( obj);
    return resAzimuth * 180. / M_PI;

Угол области видимости считается методами геометрии через теорему косинусов и с ним проблем нет, как видно из приложенных картинок.
Строить можно на любой карте в проекции Гаусса-Крюгера.
Изменено: Александр Лазарев - 10.08.2017 16:12:14
 
1. Проблему со смещением при построении зоны видимости воспроизвели, исправим. Спасибо!
2. Уточните, пожалуйста, величину радиуса построения зоны, при котором возникают неоднозначности результата построения.
 
Цитата
Александр Савелов написал:
1. Проблему со смещением при построении зоны видимости воспроизвели, исправим. Спасибо!
2. Уточните, пожалуйста, величину радиуса построения зоны, при котором возникают неоднозначности результата построения.
Дело не в радиусе зоны, а в отдалении в горизонтальном направлении от вертикально расположенного меридиана. Чем дальше, тем больше заметно искажение. На приложенных изображениях видно, как наклонено экранное отображение меридиана.
Если азимут на карте совпадает с направлением на экранный север, то искажений нет.
Изменено: Александр Лазарев - 11.08.2017 12:05:40
 
Здравствуйте!

Поле Azimuth структуры TBUILDZONEVISIBILITY предполагает передачу значения дирекционного угла. Мы исправим описание структуры в maptype.h, чтобы оно было более явным.
Спасибо!
 
Цитата
Александр Савелов написал:
Здравствуйте!

Поле Azimuth структуры TBUILDZONEVISIBILITY предполагает передачу значения дирекционного угла. Мы исправим описание структуры в maptype.h, чтобы оно было более явным.
Спасибо!
Проверил, действительно дирекционный угол. =)
 
Построенная зона видимости некорректно выводится на картах в проекции меркатора: радиус уменьшается пропорционально широте.
Не могу понять, это у меня косяк или так и было задумано? Код тот же, приведён ранее в этой теме.
Спасибо.
 
Проекция Меркатора EPSG:3857 искажает расстояния и площади на краях отображаемой области на севере и юге порядка 1: 50. Линия нулевых искажений на экваторе.
 
Цитата
Oleg Belenkov написал:
Проекция Меркатора EPSG:3857 искажает расстояния и площади на краях отображаемой области на севере и юге порядка 1: 50. Линия нулевых искажений на экваторе.
Да, я знаю, что меркатор искажает, просто расстояние расчитывается по карте и ожидается, что зона видимости будет накрывать указанную область, а получается, что не растягивает как надо.
И ещё по проблемам зон видимости на меркаторе - на границе двух смежных листов происходит обрезание.
Пример обрезания зон
Это фича или я что-то не так делаю?
Спасибо. =)
Страницы: 1 2 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности