2013-07-15 54 views
6

Tôi có một bản đồ tiêu chuẩn cho thấy một lớp gạch. Bây giờ tờ rơi chỉ cho phép bạn sử dụng phương pháp sử dụng panTo LatLng ví dụ,Tờ rơi: panTo Web Mercator tọa độ (EPSG 3857)

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

Làm thế nào tôi sẽ sử dụng phương pháp nêu trên panto nếu tọa độ của tôi là trong EPSG:3857 ví dụ (3679364.68,-9096106.74)?

Điều này khá đơn giản đối với các lớp mở như khi bạn xác định phép chiếu bản đồ, mọi thứ hoạt động trong phép chiếu đó. Nhưng Leaflet luôn hoạt động trên latlng ở bên ngoài.

Bất kỳ cách đơn giản nào để thực hiện việc này bằng cách sử dụng thư viện tờ rơi?

Cảm ơn!

Trả lời

5

tôi có thể lấy nó làm việc nếu tôi sử dụng proj4js thư viện để chuyển đổi các tọa độ bằng cách làm này:

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); 

Nhưng điều này vẫn không phải là một giải pháp lý tưởng vì nó đánh thuế tôi một Megabyte cho cho bao gồm thư viện. Tôi vẫn đang tìm một giải pháp tờ rơi. Biết rằng tờ rơi nội bộ đã sử dụng EPSG: 3857 để tìm nạp các lát, đây không phải là điều khó khăn.

Update 

Để làm điều này hoàn toàn trong tờ rơi, hãy xem câu trả lời của @ ARsl. Chỉ có lý do tôi vẫn chấp nhận điều này như câu trả lời của tôi bởi vì, vẫn cảm thấy khó chịu khi tính toán chiếu như vậy (không phải là họ sai), và chỉ vì lý do đó mà tôi không chấp nhận câu trả lời này. Cộng với proj4js như là ưu điểm của việc hỗ trợ nhiều datums hơn.

+0

Không phải là lib proj4js chỉ như 70kb? Tôi đồng ý mặc dù, muốn chức năng này là trong tờ rơi là tốt. –

+0

@RyanM Thats chính xác và thường tôi sẽ sẵn sàng sử dụng nó. Nhưng trong ứng dụng đặc biệt này, tôi đang chiến đấu để tiết kiệm rất nhiều byte. Vì vậy, nó đau khổ phải nhập khẩu một lib cho một nhiệm vụ tầm thường như vậy mà Leaflet đã biết làm thế nào để làm ở bên trong. – Shaunak

2

Tôi cũng chưa tìm thấy bất kỳ phương pháp tích hợp nào để chuyển đổi EPSG: 3857 tọa độ thành LatLng.

LeafLet crs class L.CRS.EPSG3857 chỉ có project phương pháp chuyển đổi L.LatLng thành L.Point trong tọa độ EPSG: 3857. https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js

Nhưng nó là khá dễ dàng để mở rộng nó với unproject phương pháp:

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

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

Sau đó, bạn có thể sử dụng nó với panTo phương pháp:

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

hay:

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

Leaflet cho phép bạn sử dụng phương thức panTo bởi điểm không được chiếu 3857. Nếu bạn không muốn sử dụng thư viện proj4js nó cũng đạt được trong tờ rơi.

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 Cảm ơn! câu trả lời chính xác! Tôi vẫn cảm thấy không thoải mái khi thực hiện các phép tính chiếu như vậy (không phải là chúng sai), và chỉ vì lý do đó mà tôi không chấp nhận câu trả lời này. Cộng với proj4js như là ưu điểm của việc hỗ trợ nhiều datums hơn. – Shaunak