Как конвертировать векторные координаты уровня на карту широту и долготу в OpenLayers
-
25-09-2019 - |
Вопрос
Я довольно запутался. У меня есть точка:
x= -12669114.702301
y= 5561132.6760608
Что я получил от нанесения квадрата на векторном слое с контроллером DrawFeature.
Числа кажутся ... ERM ... awfull Bard, но они, кажется, работают, потому что если бы я позже нарисую квадрат со всеми такими же точками, это в том же положении, поэтому я полагаю, что они должны быть правы.
Проблема в том, что я пытаюсь преобразовать эту точку на широту и долготу.
Я использую:
map.getLonLatFromPixel(pointToPixel(points[0]));
Если точки [0] - это точка геометрии, а функция pointtopixel требует любой точки и превращает ее в пиксель (поскольку getlonlatfropixel нуждается в пикселе). Это делает это, просто принимая точку X и делая его пикселями X и так далее.
Широта и долгота, которую я получаю, это на порядок:
lat: -54402718463.864
lng: -18771380.353223
Это очень четко неправильно. Я остался действительно запутанным. Я пытаюсь проецировать этот объект, используя:
.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
Но я на самом деле не понимаю и не уверен, что я сделал это неправильно, в любом случае.
Мой код здесь: http://pastie.org/909644.
Я своего рода в потере. Координаты кажутся согласованными, потому что я могу повторно использовать их, чтобы получить тот же результат ... но они кажутся больше, чем любой из примеров, которые я вижу на веб-сайте OpenLayers ...
Решение
Согласно вашему коду, проекция, которую вы используете, является EPSG: 900913, который является тем, который использует Google. Устройства для этой проекции являются метрами, а значения, которые вы получаете за точку, совершенно правильно:
x= -12669114.702301 (longitude)
y= 5561132.6760608 (latitude)
Эти значения не являются пикселями, но координаты в EPSG: 900913 проекция, и верны (до тех пор, пока они должны быть в Айдахо, если не есть что-то не так в другом месте)
Чтобы проверить это, вы можете пойти в http://proj4js.org/ и преобразовать ваши координаты из EPSG: 900913 в WGS84 (LAT / LON), который даст вам:
x = -113.8085937334033 (longitude)
y = 44.615123313472 (latitude)
Это значения, которые вы, вероятно, ожидаете. Если вы хотите получить их из точечных координат, используйте что-то вроде:
point.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
Это преобразует координаты из проекции Google в WGS84 (широта / долгота).
Другие советы
Насколько я помню, Box Handler реализует по-разному от других обработчиков в OL. Нам пришлось реализовать собственный обработчик, который возвращает геометрию с координатами LON / LAT, что с координатами пикселей:
Legato.Handler.Box = OpenLayers.Class(OpenLayers.Handler.Box, {
endBox : function(end) {
var result;
if (Math.abs(this.dragHandler.start.x - end.x) > 5
|| Math.abs(this.dragHandler.start.y - end.y) > 5) {
var start = this.dragHandler.start;
var top = Math.min(start.y, end.y);
var bottom = Math.max(start.y, end.y);
var left = Math.min(start.x, end.x);
var right = Math.max(start.x, end.x);
var lowerLeftLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
left, bottom));
var upperRightLonLat = this.map.getLonLatFromPixel(new OpenLayers.Pixel(
right, top));
var bounds = new OpenLayers.Bounds(lowerLeftLonLat.lon,
lowerLeftLonLat.lat, upperRightLonLat.lon, upperRightLonLat.lat);
result = bounds.toGeometry();
} else {
var xy = this.dragHandler.start.clone();
var lonLat = this.map.getLonLatFromPixel(xy);
result = new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat);
}
this.removeBox();
this.callback("done", [ result ]);
},
CLASS_NAME :"Legato.Handler.Box"
});