2010-04-08 37 views
21

Tôi khá bối rối. Tôi có một điểm:Cách chuyển đổi tọa độ Lớp Vector thành Bản đồ Vĩ độ và Kinh độ trong Phần mở rộng

x= -12669114.702301 
y= 5561132.6760608 

Tôi lấy từ hình vuông trên lớp vectơ với bộ điều khiển DrawFeature.

Những con số có vẻ ... ồ ... rất lớn, nhưng chúng dường như hoạt động, bởi vì nếu sau này tôi vẽ một hình vuông với tất cả các điểm giống nhau, nó ở cùng vị trí, vì vậy tôi thấy chúng phải đúng .

Vấn đề là khi tôi cố gắng chuyển đổi điểm này thành vĩ độ và kinh độ.

Tôi đang sử dụng:

map.getLonLatFromPixel(pointToPixel(points[0])); 

đâu điểm [0] là một điểm hình học, và các chức năng pointToPixel mất bất kỳ điểm nào và biến nó thành một điểm ảnh (kể từ khi getLonLatFromPixel cần một pixel). Nó thực hiện điều này bằng cách đơn giản lấy điểm x, và biến nó thành pixel x, v.v.

Các vĩ độ và kinh độ tôi nhận được là vào thứ tự của:

lat: -54402718463.864 
lng: -18771380.353223 

này là rất rõ ràng là sai. Tôi đã thực sự bối rối. Tôi cố gắng chiếu đối tượng này, sử dụng:

.transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject()); 

Nhưng tôi không thực sự hiểu và chắc chắn tôi đã làm điều đó không chính xác, dù sao đi nữa.

Mã của tôi ở đây: http://pastie.org/909644

Tôi sắp bị thua lỗ. Các tọa độ có vẻ phù hợp, bởi vì tôi có thể tái sử dụng chúng để có được kết quả tương tự ... nhưng chúng dường như lớn hơn bất kỳ ví dụ nào tôi thấy trên trang web openLayers ...

Trả lời

34

Theo mã của bạn, chiếu bạn đang sử dụng là EPSG: 900.913, đó là một trong đó Google sử dụng. Các đơn vị cho dự báo này là mét, và các giá trị mà bạn có được cho điểm là hoàn toàn chính xác:

x= -12669114.702301 (longitude) 
y= 5561132.6760608 (latitude) 

giá trị này không phải là pixel nhưng độ trong EPSG: 900.913 chiếu, và là chính xác (miễn là họ có nghĩa vụ phải được Idaho, nếu không phải có cái gì đó sai ở nơi khác)

để kiểm tra xem nó, bạn có thể đi đến http://proj4js.org/ và biến đổi tọa độ của bạn từ EPSG: 900.913 lên WGS84 (lat/lon), mà sẽ cung cấp cho bạn:

x = -113.8085937334033 (longitude) 
y = 44.615123313472 (latitude) 

Đây là những giá trị bạn có thể mong đợi. Nếu bạn muốn lấy chúng từ các tọa độ điểm, hãy sử dụng một cái gì đó như:

point.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); 

Điều này sẽ thay đổi tọa độ từ phép chiếu Google thành WGS84 (Vĩ độ/Kinh độ).

+0

Cảm ơn, tôi đã thực sự gặp khó khăn khi gói đầu quanh các dự án khác nhau ... – Jenny

+0

Thực ra tôi có câu hỏi ... Tôi sẽ hỏi lại chính thức, nhưng: Nếu tôi làm ngược lại (point.transform (OpenLayers.Projection mới ("EPSG: 4326"), OpenLayers.Projection mới ("EPSG: 900913")); Đến điểm vĩ độ/điểm thông thường, tôi nhận được NaN (không phải là số?) cho bất kỳ giá trị âm nào. – Jenny

+0

http://stackoverflow.com/questions/2607734/openlayers-projections – Jenny

2

Theo như tôi nhớ, hộp handler là implementy khác với các trình xử lý khác trong OL. Chúng tôi đã phải thực hiện một xử lý riêng mà trả về một hình học với lon tọa độ/lat đúng hơn là với điểm ảnh phối:

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" 
}); 
Các vấn đề liên quan