如何在 Openlayers 中将矢量图层坐标转换为地图纬度和经度
-
25-09-2019 - |
题
我很困惑。我有一个观点:
x= -12669114.702301
y= 5561132.6760608
这是我通过使用 DrawFeature 控制器在矢量图层上绘制一个正方形而得到的。
这些数字看起来……呃……非常大,但它们似乎起作用了,因为如果我后来用所有相同的点画一个正方形,它就处于相同的位置,所以我认为它们必须是正确的。
问题是当我尝试将此点转换为纬度和经度时。
我在用着:
map.getLonLatFromPixel(pointToPixel(points[0]));
其中points[0]是一个几何点,pointToPixel函数接受任何点并将其转换为像素(因为getLonLatFromPixel需要一个像素)。它通过简单地获取点的 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(纬度/经度),这将为您提供:
x = -113.8085937334033 (longitude)
y = 44.615123313472 (latitude)
这可能是您期望的值。如果您想从点坐标获取它们,请使用以下命令:
point.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
这会将坐标从 Google 投影转换为 WGS84(纬度/经度)。
其他提示
据我记得,框处理程序是implementy不同于在其他OL处理程序。我们必须实施自己的处理程序,它返回一个几何与经度/纬度坐标,而与像素坐标:
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"
});