2013-07-15 9 views
6

私はタイル層を示す標準リーフレットマップを持っています。今、私の座標は、たとえば(3679364.68,-9096106.74)ためEPSG:3857である場合リーフレット:panToウェブメルカトル座標(EPSG 3857)

map.panTo(new L.LatLng(40.17, -98.12)); 

がどのように私はpanToのメソッドの上に使用されます、あなたは例えば緯度経度を使用してpanTo方法を使用することができます唯一のリーフレット?

これはOpenlayersで非常に簡単です。一度地図投影を定義すると、その投影ですべてが機能します。しかし、リーフレットはいつも外でのlatlngに取り組んでいます。

リーフレットライブラリを使用してこれを行う簡単な方法はありますか?

ありがとうございます!

答えて

5

私はこれを行うことにより、座標を変換するためにproj4jsライブラリを使用する場合、私はそれが働いて得ることができます。

var source = new Proj4js.Proj('EPSG:3857'); 
var dest = new Proj4js.Proj('EPSG:4326'); 
var p = new Proj4js.Point(-9096106.74,3679364.68); //this takes x,y 
Proj4js.transform(source, dest, p); 
this.map.setView(new L.LatLng(p.y, p.x),zoom); 

しかし、それは私のライブラリを含むためのためのメガバイトを課税としてこれはまだ理想的なソリューションではありません。私はまだチラシの解決策を探しています。内部リーフレットがすでにEPSG:3857を使用してタイルをフェッチしていることを知っていれば、これは難しいことではありません。

Update 

純粋にリーフレットでこれを行うには、@ ARslの回答をご覧ください。なぜ私はまだこれを私の答えとして受け入れているのですか?(それが間違っているわけではない)そのような投影計算をやっていると不快感を感じています。 Proj4jsをさらに多くのデータムをサポートするという利点が追加されました。

+0

proj4jsのlibは70kbと似ていませんか?私は同意するが、この機能がチラシにもあって欲しい。 –

+0

@RyanM Thatsは間違いなく、通常私は喜んでそれを使用します。しかし、この特定のアプリケーションでは、文字通りバイトを節約するために戦っています。だからリーフレットはすでに内部でやる方法を知っているような些細な作業のために別のライブラリをインポートする必要があります。 – Shaunak

2

EPSG:3857の座標をLatLngに変換する組み込みの方法も見つかりませんでした。 3857座標:

リーフレットCRSクラスL.CRS.EPSG3857L.LatLng EPSGでL.Pointに変換するだけproject方法を有しています。 https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js

しかし、unproject方法でそれを拡張することは非常に簡単です:

L.CRS.EPSG3857.unproject = function (point) { // Point -> LatLng 
    var earthRadius = 6378137; 
     projectionPoint = L.point(point).divideBy(earthRadius); 

    return this.projection.unproject(projectionPoint); 
}; 

次にあなたがpanTo方法でそれを使用することができます。

map.panTo(map.options.crs.unproject([1372720.6476878107, 5690559.995203462])); 

か:

map.panTo(L.CRS.EPSG3857.unproject([1372720.6476878107, 5690559.995203462])); 
9

リーフレットを使用してpanToメソッドを使用して、3857ポイントをプロジェクトから外します。 proj4jsライブラリを使いたくない場合はリーフレットでも実現します。

var point = new L.Point(3679364.68,-9096106.74); // Lon/Lat 
var earthRadius = 6378137; 
var latlng = L.Projection.SphericalMercator.unproject(point.divideBy(earthRadius)); 

map.panTo(new L.LatLng(latlng.lat, latlng.lng)); 
+0

+1ありがとう!素晴らしい答え!私はまだ(それが間違っているわけではない)そのような投影計算を行うことに不快感を感じています。その理由のために私はこの答えを受け入れません。 Proj4jsをさらに多くのデータムをサポートするという利点が追加されました。 – Shaunak

関連する問題