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 Web サイトで見ているどの例よりもはるかに大きいように見えます...
解決
コードによると、使用している投影法は 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"
});