21

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

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

4

2 に答える 2

34

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

于 2010-04-09T11:58:03.417 に答える
2

私が覚えている限り、ボックスハンドラーは、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"
});
于 2010-04-08T18:24:50.803 に答える