2009-06-19 66 views
16

Tôi có giá trị Lat/Long của thành phố New York, NY; 40.7560540, -73.9869510 và hình ảnh phẳng của trái đất, 1000px × 446px.Chuyển đổi độ dài/vĩ độ thành các tọa độ X/Y

Tôi muốn có thể chuyển đổi, sử dụng Javascript, độ dài Lat/Long thành X, Y, nơi điểm sẽ phản ánh vị trí.

Vì vậy, toạ độ X, Y tạo thành góc trên cùng bên trái của hình ảnh sẽ là; 289, 111

Những điều cần lưu ý:

  1. đừng lo lắng về vấn đề gì chiếu để sử dụng, làm của riêng giả định của bạn hay đi với những gì bạn biết có thể làm việc
  2. X, Y có thể được hình thành bất kỳ góc của hình ảnh
  3. thưởng điểm cho cùng một giải pháp trong PHP (nhưng tôi thực sự cần JS)
+0

"Đừng lo lắng ... những gì chiếu để sử dụng" sẽ là? Tôi có thể vừa nói X là Lat, Y là Long và điều đó có lẽ sẽ làm bạn hài lòng vì rõ ràng kết quả không cần phải có ý nghĩa gì hay liên quan đến một phép chiếu thực tế. – 1owk3y

Trả lời

8

Một chức năng chuyển đổi cơ bản trong js sẽ là:

MAP_WIDTH = 1000; 
MAP_HEIGHT = 446; 

function convert(lat, lon){ 
    var y = ((-1 * lat) + 90) * (MAP_HEIGHT/180); 
    var x = (lon + 180) * (MAP_WIDTH/360); 
    return {x:x,y:y}; 
} 

này sẽ trả lại số điểm ảnh từ phía trên bên trái. chức năng này giả định như sau:

  1. Đó hình ảnh của bạn được liên kết đúng với góc trên bên trái (0,0) sắp xếp với 90 * Bắc 180 * Tây.
  2. Đó coords của bạn được ký kết với N phúc -, S là +, W phúc - và E phúc +
+1

Cảm ơn, làm thế nào để đảo ngược điều này? Vì vậy, từ X và Y đến lat/long với các tọa độ hộp giới hạn được chỉ định? – user3408380

0

Nếu bạn có một bức tranh toàn bộ trái đất, phép chiếu luôn quan trọng. Nhưng có lẽ tôi chỉ không hiểu câu hỏi của bạn.

+0

Bạn là chính xác, nhưng trong trường hợp này tôi sẽ sẵn sàng sử dụng một hình ảnh phù hợp để phù hợp với một giải pháp làm việc cho một phép chiếu cụ thể. – donohoe

18

Các chiếu bạn sử dụng sẽ thay đổi tất cả mọi thứ, nhưng điều này sẽ làm việc giả định một phép chiếu Mercator:

<html> 
<head> 
<script language="Javascript"> 
var dot_size = 3; 
var longitude_shift = 55; // number of pixels your map's prime meridian is off-center. 
var x_pos = 54; 
var y_pos = 19; 
var map_width = 430; 
var map_height = 332; 
var half_dot = Math.floor(dot_size/2); 
function draw_point(x, y) { 
    dot = '<div style="position:absolute;width:' + dot_size + 'px;height:' + dot_size + 'px;top:' + y + 'px;left:' + x + 'px;background:#00ff00"></div>'; 
    document.body.innerHTML += dot; 
} 
function plot_point(lat, lng) { 
    // Mercator projection 

    // longitude: just scale and shift 
    x = (map_width * (180 + lng)/360) % map_width + longitude_shift; 

    // latitude: using the Mercator projection 
    lat = lat * Math.PI/180; // convert from degrees to radians 
    y = Math.log(Math.tan((lat/2) + (Math.PI/4))); // do the Mercator projection (w/ equator of 2pi units) 
    y = (map_height/2) - (map_width * y/(2 * Math.PI)) + y_pos; // fit it to our map 

    x -= x_pos; 
    y -= y_pos; 

    draw_point(x - half_dot, y - half_dot); 
} 
</script> 
</head> 
<body onload="plot_point(40.756, -73.986)"> 
    <!-- image found at http://www.math.ubc.ca/~israel/m103/mercator.png --> 
    <img src="mercator.png" style="position:absolute;top:0px;left:0px"> 
</body> 
</html> 
+0

Điều này cũng làm việc cho tôi và là một câu trả lời tuyệt vời. Tôi đã thay đổi 'lng' thành 'parseInt (lng, 10)' trên dòng này: x = (map_width * (180 + lng)/360 + longitude_shift)% map_width; Nó sẽ hoạt động khi tôi gọi hàm theo cách thủ công, đặt giá trị truyền từ mảng đã trả về NaN cho x Cảm ơn! – donohoe

+0

tôi nghĩ rằng x = (map_width * (180 + lng)/360 + longitude_shift)% map_width; phải là x = ((map_width * (180 + lng)/360)% map_width) + longitude_shift; nếu không thì Nhật Bản và bờ biển phía đông của Úc (tôi đã bao gồm) được "quấn" vào giữa đại dương Thái Bình Dương. : P –

+0

Tuyệt vời, hoạt động tuyệt vời! Chỉ có điều tôi không tìm thấy những gì y_pos đã làm? Điều này trong PHP là: PanMan

5

Có thư viện Javascript tốt, PROJ4JS, cho phép bạn thực hiện các phép chuyển đổi giữa các phép chiếu khác nhau.

+0

Chắc chắn là giải pháp tốt nhất cho câu hỏi chiếu lại rộng hơn (ví dụ câu hỏi của Dinesh đặt ra là câu trả lời). – winwaed

0

Tôi đã viết một chức năng hoạt động cho bản đồ Mercator. Đặc biệt là nếu hình ảnh của bạn không che phủ toàn bộ thế giới, có nghĩa là nó cũng hoạt động với bản đồ đã cắt: https://stackoverflow.com/a/10401734/730823

Các vấn đề liên quan