Получить расстояние в пикселях между 2 объектами LonLat в OpenLayers - PullRequest
2 голосов
/ 05 июля 2011

У меня есть 2 объекта OpenLayers.LonLat, и я хочу определить расстояние в пикселях для текущего увеличения между 2. Я использую OpenLayers.Layer.getViewPortPxFromLonLat (), чтобы определить x и y точек, а затем вычтите, чтобы увидеть разницу между 2, но значения, которые я получаю, очень малы для точек, которые находятся на расстоянии 2000 км друг от друга.

Вот мой код:

        var center_lonlat = new OpenLayers.LonLat(geometry.lon, geometry.lat);
        var center_px = layer.getViewPortPxFromLonLat(center_lonlat);

        var radius_m = parseFloat(feature.attributes["radius"]);
        var radius_lonlat = OpenLayers.Util.destinationVincenty(center_lonlat, 0, radius_m);
        var radius_px = layer.getViewPortPxFromLonLat(radius_lonlat);

        var radius = radius_px.y - center_px.y;

Я пытаюсь нарисовать круг, давая, что я получаю центральную точку и радиус в метрах. Объект LonLat вроде бы в порядке.

Я что-то не так делаю?

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Я нашел проблему: destinationVincenty () нужно и возвращает координаты в wgs84, где моя карта использовала сферическую проекцию меркатора.

Надеюсь, я получил правильный ответ, потому что проекции вызывают у меня головокружение и я их никогда не понимал:(. Я искал в консоли числа для моих координат и координат из map.getExtent (), который используется для вычисления getViewPortPxFromLonLat (), и я понял, что они не в правильном порядке величины, а затем этоУдарь меня.

Итак, код теперь:

        var spherical_mercator = new OpenLayers.Projection("EPSG:900913");
        var wgs84 = new OpenLayers.Projection("EPSG:4326");

        var map = feature.layer.map;
        var geometry = feature.geometry;
        var center_lonlat = new OpenLayers.LonLat(geometry.y, geometry.x);
        var center_px = map.getViewPortPxFromLonLat(center_lonlat);

        var radius_m = parseFloat(feature.attributes["radius"]);
        var radius_lonlat = OpenLayers.Util.destinationVincenty(center_lonlat.clone().transform(spherical_mercator, wgs84), 0, radius_m).transform(wgs84, spherical_mercator);
        var radius_px = map.getViewPortPxFromLonLat(radius_lonlat);

        var radius = Math.abs(radius_px.y - center_px.y);

Измерены круги с помощью OpenLayers.Control.ScaleLine, а размер мертв: D

0 голосов
/ 05 июля 2011

Вы, кажется, делаете правильно.Если расстояние, которое вы получаете, слишком мало, возможно, есть проблема с функцией OpenLayers.Util.destinationVincenty?Вы пытались заменить подшипник (0) на что-то еще - его значение, кажется, не имеет значения в вашем случае.Но, честно говоря, я не смог понять, как это работает при просмотре источника

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...