OpenLayers. Ошибка масштабной линейки

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
morli
Интересующийся
Сообщения: 15
Зарегистрирован: 08 окт 2013, 16:35
Репутация: 0

OpenLayers. Ошибка масштабной линейки

Сообщение morli » 05 дек 2013, 14:02

Добрый день.

Создаю карту
и заметил что неправильно отображается масштабная линейка и расстояние измеряется неверно

На примере:
Рабочий код и пример
две метки, между ними 1 км (можно проверить по картам яндекса и гугла)
OpenLayers выдает совершенно другие данные
как справить косяк?

(видимо ошибка в резолюции картографии)

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Ошибка масштабной линейки

Сообщение Denis Rykov » 05 дек 2013, 14:23

Получается большее значение? Попробуйте умножить на косинус широты, так похоже на правду?

[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Ошибка масштабной линейки

Сообщение Denis Rykov » 05 дек 2013, 14:36

Короче вам нужно использовать свойство контрола geodesic:true.

[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.

morli
Интересующийся
Сообщения: 15
Зарегистрирован: 08 окт 2013, 16:35
Репутация: 0

Re: OpenLayers. Ошибка масштабной линейки

Сообщение morli » 05 дек 2013, 14:44

Тут даже "ошибка" "настройки" слоя картографии
т.к. даже стандартный элемент (масштабная линейка) выдает неправильно информацию
и стандартный элемент измерений

тут Изображение
между двумя маркерами 1 км, а OSM (OpenLayesr) выдет ~1.8

morli
Интересующийся
Сообщения: 15
Зарегистрирован: 08 окт 2013, 16:35
Репутация: 0

Re: OpenLayers. Ошибка масштабной линейки

Сообщение morli » 05 дек 2013, 14:45

Denis Rykov писал(а):Короче вам нужно использовать свойство контрола geodesic:true.

[ Сообщение с мобильного устройства ]
Не помогает

Sergey Astakhov
Активный участник
Сообщения: 218
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 52
Откуда: Питер

Re: OpenLayers. Ошибка масштабной линейки

Сообщение Sergey Astakhov » 05 дек 2013, 15:36

morli писал(а):
Denis Rykov писал(а):Короче вам нужно использовать свойство контрола geodesic:true.
Не помогает
Что значит не помогает? Вот только что поменял в вашем примере false на true - линейка удлинилась.

http://jsfiddle.net/7J5uu/1/

morli
Интересующийся
Сообщения: 15
Зарегистрирован: 08 окт 2013, 16:35
Репутация: 0

Re: OpenLayers. Ошибка масштабной линейки

Сообщение morli » 05 дек 2013, 15:44

morli писал(а):
Denis Rykov писал(а):Короче вам нужно использовать свойство контрола geodesic:true.

[ Сообщение с мобильного устройства ]
Не помогает
вернее помогает для "правильного" отображения линейки масштаба
Изображение


но для элемента измерений расстояния (OpenLayers.Control.Measure) и перевода расстояния в пиксели (pix = metrs / map.getResolution() )
не помогает, по прежнему ошибочные результаты

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Ошибка масштабной линейки

Сообщение Denis Rykov » 05 дек 2013, 16:00

У этого контрола тоже есть свойство geodesic.

[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.

morli
Интересующийся
Сообщения: 15
Зарегистрирован: 08 окт 2013, 16:35
Репутация: 0

Re: OpenLayers. Ошибка масштабной линейки

Сообщение morli » 05 дек 2013, 16:01

morli писал(а):
Denis Rykov писал(а):Короче вам нужно использовать свойство контрола geodesic:true.
... для элемента измерений расстояния (OpenLayers.Control.Measure) ...

Код: Выделить всё

measureControl = new OpenLayers.Control.Measure(
 OpenLayers.Handler.Path,
 { immediate: true, persist: true, geodesic: true});
{ immediate: true, persist: true, geodesic: true })

а вот с
PS ранее для карты

Код: Выделить всё

var options = { units: "m",
  projection: new OpenLayers.Projection("EPSG:900913"),
  displayProjection: new OpenLayers.Projection("EPSG:4326"),
  controls: [ new OpenLayers.Control.Navigation(), 
                 new OpenLayers.Control.ScaleLine({geodesic: true, bottomInUnits: 'km', topInUnits: 'm' }) 
                ]};      
map = new OpenLayers.Map('map',options);
а вот для map.getResolution() проблема осталась
не удается перевести расстояние в "правильные" пиксели

Sergey Astakhov
Активный участник
Сообщения: 218
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 52
Откуда: Питер

Re: OpenLayers. Ошибка масштабной линейки

Сообщение Sergey Astakhov » 05 дек 2013, 16:08

morli писал(а):перевода расстояния в пиксели (pix = metrs / map.getResolution() ) не помогает, по прежнему ошибочные результаты
И не поможет. Дело в том, что getResolution использует единицы выбранной проекции. У сферического меркатора, который у вас используется, это "ненастоящие метры", т.к. зависят от широты. Чтобы получить из них настоящие метры нужно величину домножить на cos от широты в градусах. Но это будет верно только для малых длин, для больших расстояний линейные формулы не годятся, надо использовать соответствующие сферические, учитывающие кривизну Земли.

morli
Интересующийся
Сообщения: 15
Зарегистрирован: 08 окт 2013, 16:35
Репутация: 0

Re: OpenLayers. Ошибка масштабной линейки

Сообщение morli » 05 дек 2013, 18:14

Sergey Astakhov писал(а): метры нужно величину домножить на cos от широты в градусах.

Код: Выделить всё

metrs / this.map.getResolution() / Math.cos(lat * (Math.PI/180));
где lat в градусах

Код: Выделить всё

new OpenLayers.Feature.Vector(
             new OpenLayers.Geometry.Polygon.createRegularPolygon(
                  point, 
                  radius / Math.cos(lat * (Math.PI/180)),
                  ...,
                  ...),
             { ... },
             { ... });
Sergey Astakhov писал(а): надо использовать соответствующие сферические, учитывающие кривизну Земли.
а где их можно взять? что-то не смог сходу найти

Sergey Astakhov
Активный участник
Сообщения: 218
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 52
Откуда: Питер

Re: OpenLayers. Ошибка масштабной линейки

Сообщение Sergey Astakhov » 05 дек 2013, 20:04

morli писал(а):
Sergey Astakhov писал(а): надо использовать соответствующие сферические, учитывающие кривизну Земли.
а где их можно взять? что-то не смог сходу найти
Классика жанра: http://williams.best.vwh.net/avform.htm

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: OpenLayers. Ошибка масштабной линейки

Сообщение Максим Дубинин » 05 дек 2013, 21:16

пристегивайтесь, турбулентность прямо по курсу

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: Semrush [Bot] и 1 гость