Страница 1 из 1

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

Добавлено: 05 дек 2013, 14:02
morli
Добрый день.

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

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

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

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

Добавлено: 05 дек 2013, 14:23
Denis Rykov
Получается большее значение? Попробуйте умножить на косинус широты, так похоже на правду?

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

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

Добавлено: 05 дек 2013, 14:36
Denis Rykov
Короче вам нужно использовать свойство контрола geodesic:true.

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

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

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

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

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

Добавлено: 05 дек 2013, 14:45
morli
Denis Rykov писал(а):Короче вам нужно использовать свойство контрола geodesic:true.

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

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

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

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

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

Добавлено: 05 дек 2013, 15:44
morli
morli писал(а):
Denis Rykov писал(а):Короче вам нужно использовать свойство контрола geodesic:true.

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


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

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

Добавлено: 05 дек 2013, 16:00
Denis Rykov
У этого контрола тоже есть свойство geodesic.

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

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

Добавлено: 05 дек 2013, 16:01
morli
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() проблема осталась
не удается перевести расстояние в "правильные" пиксели

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

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

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

Добавлено: 05 дек 2013, 18:14
morli
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 писал(а): надо использовать соответствующие сферические, учитывающие кривизну Земли.
а где их можно взять? что-то не смог сходу найти

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

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

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

Добавлено: 05 дек 2013, 21:16
Максим Дубинин