私はかなり混乱しています。私はポイントがあります:
x= -12669114.702301
y= 5561132.6760608
DrawFeatureコントローラーを使用してベクターレイヤーに正方形を描画することで得たものです。
数字は...えーと...すごい大きいように見えますが、後ですべて同じ点で正方形を描くと、同じ位置にあるので、正しくなければならないと思います。
問題は、このポイントを緯度と経度に変換しようとしたときです。
私が使用しているもの:
map.getLonLatFromPixel(pointToPixel(points[0]));
ここで、points [0]はジオメトリPointであり、pointToPixel関数は任意のポイントを取得してピクセルに変換します(getLonLatFromPixelにはピクセルが必要なため)。これは、ポイントのxを取得し、それをピクセルxにするなどの方法で行われます。
私が取得する緯度と経度は次のオーダーです。
lat: -54402718463.864
lng: -18771380.353223
これは明らかに間違っています。私は本当に混乱したままです。次を使用して、このオブジェクトを投影してみます。
.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
しかし、私は実際にはそれを理解しておらず、とにかく間違ってやったと確信しています。
私のコードはここにあります: http://pastie.org/909644
私はちょっと途方に暮れています。座標は一貫しているように見えます。再利用して同じ結果を得ることができるからです...しかし、openLayersWebサイトで見ているどの例よりもはるかに大きいようです...
コードによると、使用しているプロジェクションはEPSG:900913で、これはGoogleが使用しているものです。この投影法の単位はメートルであり、ポイントに対して取得する値は完全に正しいです。
x= -12669114.702301 (longitude)
y= 5561132.6760608 (latitude)
この値はピクセルではなく、EPSG:900913投影の座標であり、正しいです( Idaho にあるはずである限り、他に何か問題がない場合)
これを確認するには、 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(緯度/経度)に変換されます。
私が覚えている限り、ボックスハンドラーは、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"
});