web-dev-qa-db-ja.com

ベクターレイヤーの座標をOpenLayersでマップの緯度と経度に変換する方法

私はかなり混乱しています。私はポイントがあります:

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サイトで見ているどの例よりもはるかに大きいようです...

21
Jenny

コードによると、使用しているプロジェクションは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(緯度/経度)に変換されます。

34
amercader

私が覚えている限り、ボックスハンドラーは、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"
});
2
lexicore