2009-09-02 30 views

Trả lời

8

Có rất nhiều thông tin trên Internet về việc tính khoảng cách giữa hai cặp vĩ độ và kinh độ. Chúng tôi đang sử dụng những tính toán đó trên trang web công cộng của chúng tôi và họ không tầm thường để hiểu/thảo luận (vì vậy tôi sẽ không cố gắng giải thích chúng ở đây). Điều đó nói rằng, chúng rất dễ thực hiện.

Khi bạn có hàm trả về khoảng cách, bạn sẽ có thể tính tổng chiều rộng và chiều cao của bản đồ theo khoảng cách giữa các góc.

Sau đó, bạn có thể tính khoảng cách ngang và dọc của điểm từ góc trên cùng bên trái.

Bây giờ bạn tìm ra tỷ lệ chiều rộng của bản đồ được thể hiện bằng khoảng cách giữa phía bên trái và điểm của bạn, áp dụng tỷ lệ đó cho chiều rộng pixel và bạn có số pixel giữa phía bên trái và điểm của bạn. Lặp lại cho trục y.

(Pixels từ bên trái) = (tổng chiều rộng bằng pixel) * ((geocode khoảng cách giữa trái và quan điểm của bạn)/(geocode khoảng cách giữa bên trái và bên phải))

(Pixels từ đầu) = (tổng chiều cao tính bằng pixel) * ((khoảng cách mã địa lý giữa đầu và điểm của bạn)/(khoảng cách mã địa lý giữa trên và dưới))

EDIT: Khi bạn tìm hiểu thêm, một số giải pháp sẽ hiển thị kết quả chính xác hơn những người khác do thực tế rằng bạn đang xấp xỉ khoảng cách giữa hai điểm trên bề mặt hình cầu và ánh xạ trên bề mặt phẳng. Độ chính xác giảm khi khoảng cách tăng. Lời khuyên tốt nhất cho bạn là thử nó trước và xem liệu nó có đáp ứng được nhu cầu của bạn hay không.

+0

Maps chiếu 3D của chúng tôi vào một Bề mặt 2D.Vì bạn không thể bọc một hình vuông hoàn hảo vào một hình cầu, có nhiều phương pháp chiếu khác nhau để có được kết quả gần đúng. Khoảng cách trên bản đồ đã cho là phi tuyến tính, do đó, công thức của bạn chỉ là xấp xỉ. –

+0

Tính xấp xỉ hoạt động ở hầu hết các khoảng cách. Nhưng tôi nên làm rõ rằng trong bài viết. – Mayo

+0

Đúng, bản đồ của bạn được phóng to hơn, kết quả chính xác hơn. Bạn sẽ thấy sự khác biệt gần như bằng không đối với một bản đồ cấp thành phố, nhưng nó sẽ dễ nhận thấy đối với một bản đồ cấp nhà nước hoặc bản đồ lớn hơn. –

5

Có nhiều sơ đồ chiếu bản đồ khác nhau. Bạn sẽ phải biết cái nào được sử dụng bởi bản đồ của bạn.

Để biết thêm thông tin về thuật toán chiếu bản đồ và kiểm tra bản đồ tiến/lùi this link. Nó cung cấp các công thức cho một số phép chiếu chung.

+0

Tôi không cần độ chính xác cao nên có thể giải pháp dưới đây là đủ. Nếu không, chuyển đổi sẽ như thế nào? Đó là những dự án projectino nào? Cho đến nay tôi đã thấy: UTM Mercator ngang Mercator Kinh độ/vĩ độ – Jorge

+0

BTW. Tôi cũng đã mã hóa các công thức để chuyển đổi giữa Lat/Lon và UTM. Chuyển đổi từ Lat/Lon sang UTM và áp dụng giải pháp bên dưới đúng cách (ít nhất là cho các dự báo UTM)? – Jorge

+0

Bản đồ của bạn có sử dụng Mercator không? Bạn cần phải biết những gì các bản đồ được mã hóa trước khi bạn có thể chọn chiếu đúng. Khi bạn có khoảng cách được mã hóa địa lý, công thức của mmayo sẽ cung cấp cho bạn pixel chính xác trên bản đồ. –

9

Nếu sử dụng Equidistant Cylindrical Projection type map, đây là những gì bạn cần làm:

  1. Tìm Latitude và kinh độ của hướng dẫn vị trí của bạn ở đây:
    http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  2. Input thông tin đó vào các công thức sau đây:
    x = (tổng chiều rộng của hình ảnh bằng px) * (180 + vĩ độ)/360
    y = (tổng chiều cao của hình ảnh bằng px) * (90 - kinh độ)/180

    lưu ý: khi sử dụng kinh độ âm của vĩ độ, hãy đảm bảo cộng hoặc trừ số âm, tức là+ (- 92) hoặc - (- 35) mà thực sự sẽ là -92 và +35

  3. Bây giờ bạn có X và Y của bạn để vẽ trên hình ảnh của bạn

    thông tin có thể tìm thêm về công thức này và loại bản đồ ở đây:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular
+0

Bạn có thể cho tôi biết cách tính lại từ X, Y sang Lat lon không? – colin

17

đây là những gì làm việc cho tôi, mà không cần bs rất nhiều.

int x = (int) ((MAP_WIDTH/360.0) * (180 + lon)); 
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat)); 

Điều phối vĩ độ, vĩ độ đã được thiết bị Android cung cấp cho tôi. Vì vậy, chúng phải ở cùng một tiêu chuẩn được sử dụng bởi tất cả các sản phẩm Google Earth/Map.

+0

bây giờ cách hiển thị x, y. phương pháp nào nên được sử dụng cho x và y để hiển thị nó – sns

+0

@NaeemShah canvas.drawCircle (x, y, r, mPaint); –

+1

Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi đã không tìm thấy câu trả lời nào nói về việc có bản đồ bù đắp và tỷ lệ. Ngoài ra, đây có phải là MAP_WIDTH/HEIGHT theo độ (tức là delta của kinh độ và vĩ độ) hay các giá trị pixel? Cần mở rộng quy mô ở đâu? – OzBarry

7

Điều này khá thẳng về phía trước và đơn giản .. hãy để tôi giải thích cách có thể.

Vĩ độ và Kinh độ là các đường tưởng tượng được vẽ trên trái đất để bạn có thể xác định chính xác bất kỳ vị trí nào trên thế giới. chỉ cần đặt chúng là các coords X và Y của một mặt phẳng. Vĩ độ là một đường thẳng đứng chạy từ bắc xuống nam với 90 độ ở cực bắc và -90deg ở cực nam.

Kinh độ mặt khác là một đường ngang chạy từ đông sang nam với -180deg ở phía tây và 180deg ở phía đông.

bạn có thể chuyển đổi latLng thành pixel coords bằng cách giả định rằng chiều rộng của vùng chứa html là chiều rộng của thế giới và áp dụng cho chiều cao.

Formula - Longitude - Pixel

(givenLng*widthOfContainerElement)/360 

nơi 360 là tổng kinh độ tính theo độ

Formula -Latitude - Pixel

(givenLat*heightOfContainerElement)/180 

nơi 180 là tổng l atitude trong độ

//Height is calculated from the bottom 

bạn có thể tìm một việc thực hiện hoạt động của công thức này ở đây, trên trang web của tôi (nó sử dụng JavaScript chỉ)

http://www.learntby.me/javascript/latLngconversion.php

cho tôi biết nếu bạn vẫn cần bất kỳ làm rõ.

+0

Tôi đã thêm phần tiết lộ bắt buộc tại đây –

0

Chỉ cần chắc này (ví Mercator bản đồ dự báo):

extension UIView 
{ 
    func addLocation(coordinate: CLLocationCoordinate2D) 
    { 
     // max MKMapPoint values 
     let maxY = Double(267995781) 
     let maxX = Double(268435456) 

     let mapPoint = MKMapPointForCoordinate(coordinate) 

     let normalizatePointX = CGFloat(mapPoint.x/maxX) 
     let normalizatePointY = CGFloat(mapPoint.y/maxY) 

     let pointView = UIView(frame: CGRectMake(0, 0, 5, 5)) 
     pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height) 

     pointView.backgroundColor = UIColor.blueColor() 

     addSubview(pointView) 
    } 
} 

dự án đơn giản của tôi cho thêm tọa độ trên UIView: https://github.com/Glechik/MapCoordinateDrawer

1

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<style> 
 
#point{font-face:Arial; font-size:18px; color:#FFFF00; width:12px; height:12px;text-shadow: 2px 2px #000000} 
 
#canvas {position: absolute; top: 0px; left: 0px; z-index: -2} 
 
     html, 
 
     body, 
 
     #canvas { 
 
      width: 100%; 
 
      height: 100%; 
 
      overflow: hidden; 
 
      margin: 0 
 
     } 
 
</style> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> 
 
<script> 
 
$(window).on("load resize",function(e){ 
 

 
var w = $("#canvas").width(); 
 
var h = $("#canvas").height(); 
 
// New York, NY (https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY) 
 
       var lat = 40.91525559999999; 
 
       var long = -73.70027209999999; 
 

 

 
var x = ((w/360) * (180 + long)) - 9; 
 
var y = ((h/180) * (90 - lat)) - 18; 
 

 
$("#text").text('X:'+x+', Y:'+y); 
 
$("#point").offset({ top: y, left: x }); 
 

 
}); 
 
</script> 
 
</head> 
 
<body> 
 
<div id="text"></div> 
 
<div id="point">▼</div> 
 
<img id="canvas" border="0" src="http://friday.westnet.com/~crywalt/dymaxion_2003/earthmap10k.reduced.jpg"> 
 

 
</body> 
 
</html>

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