Страница 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
Максим Дубинин