Làm thế nào tôi có thể thực hiện một bọc polyline trên toàn thế giới?


14

Tôi đang sử dụng bản đồ tờ rơi để tạo ra một đại diện cho một thách thức vòng quanh thế giới. Tôi muốn thêm một đường đa tuyến đi về hướng đông từ tokyo và sau đó xuất hiện ở phía tây nam Mỹ trên bản đồ - nhưng thay vào đó tôi nhận được một đường ngang qua bản đồ theo hướng ngược lại (xem đường màu vàng).

nhập mô tả hình ảnh ở đây

Tôi nghĩ rằng điều này có thể liên quan đến các cơ sở dữ liệu và / hoặc hệ thống tọa độ nhưng hơi sơ sài về chi tiết. Bất cứ ai có thể giải thích lý thuyết đằng sau những gì tôi cần làm để làm cho điều này hoạt động? Tôi đang sử dụng phép chiếu bluemarble từ Nasa:

var bluemarble = new L.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});

2
Bạn cần phá vỡ đa tuyến ở kinh tuyến + -180 độ. Điều này đòi hỏi phải tìm vĩ độ mà tại đó đa tuyến đi qua kinh tuyến đó. GIS của bạn có thể có phương pháp để phá vỡ. Nếu không, một giải pháp đơn giản có thể được lấy từ mã được hiển thị trong một chủ đề liên quan . Bạn có thể thực thi mã như thế này trên nền tảng của bạn?
whuber

Tôi đồng ý với whuber. Tôi đã phải thực hiện một nhiệm vụ tương tự với đa giác chéo + - 180. Bạn phải chia thành nhiều đa giác / đa giác mỗi khi bạn vượt qua + -180.
Steve

Câu trả lời:


13

Bạn cần phá vỡ đa tuyến ở kinh tuyến + -180 độ. Điều này đòi hỏi phải tìm vĩ độ mà tại đó đa tuyến đi qua kinh tuyến đó. GIS của bạn có thể có phương pháp để phá vỡ. Nếu không, một giải pháp đơn giản có thể được lấy từ mã được hiển thị trong một chủ đề liên quan . Dưới đây là một số chi tiết.

  • Một đa tuyến được biểu diễn dưới dạng một chuỗi các đỉnh , mỗi đỉnh được cho ở dạng (lat, lon), với -180 <= lon <= 180. Bạn cần kiểm tra từng cặp liên tiếp để xem liệu nó có vượt qua kinh tuyến + -180 hay không. Có một thử nghiệm nhanh: nếu giá trị tuyệt đối của chênh lệch kinh độ là 180 hoặc lớn hơn, có một giao cắt.

  • Trong mỗi phân đoạn (lat0, lon0) -> (lat1, lon1) đi qua kinh tuyến + -180, bạn cần chia đa tuyến thành hai phần mà nó giao nhau.

Điều quan trọng là tìm vĩ độ của điểm dừng với độ chính xác hợp lý. Điều này được thực hiện dễ dàng nhất với mô hình trái đất hình cầu: lỗi (so với mô hình elip chính xác hơn) sẽ quá nhỏ để nhận thấy.

Đặt đoạn trong câu hỏi đi từ điểm 0 tại (lat0, lon0) đến điểm 1 tại (lat1, lon1). Điểm dừng có thể được tìm thấy bằng cách chạy một đoạn thẳng trong 3D giữa hai điểm như được biểu thị trong tọa độ Cartesian và tìm vị trí tọa độ y bằng không. Các tọa độ Descartes

(x0, y0, z0) = (cos(lon0)*sin(lat0), sin(lon0)*sin(lat0), cos(lat0))

và một biểu thức tương tự cho (x1, y1, z1) cho điểm 1. Giải phương trình

t * y0 + (1-t) * y1 = 0

cho t; đó là,

t = y1 / (y1 - y0).

Các tọa độ của giao lộ là do đó

(x, y, z) = (t * x0 + (1-t) * x1, 0, t * z0 + (1-t) * z1)

Điểm này (nằm dưới bề mặt trái đất ở đâu đó bên dưới kinh tuyến + -180) có vĩ độ bằng

lat2 = ATan(z/x).

Điểm phá vỡ cần được thể hiện theo hai cách. Khi gắn nó sau (lat0, lon0) để chấm dứt phần đầu tiên của polyline bị hỏng, hãy sử dụng (lat2, -180) nếu lon0 âm và sử dụng (lat2, 180). Khi gắn nó trước (lat1, lon1) để bắt đầu phần thứ hai của polyline bị hỏng, hãy làm theo quy tắc tương tự.

Trong trường hợp ngoại lệ, một hoặc cả hai điểm 0 và điểm 1 có thể nằm trên kinh tuyến + -180. Làm theo quy trình này sẽ khiến bạn đặt một đoạn có độ dài bằng không vào một trong những phần đa tuyến bạn tạo. Nếu điều này có thể gây ra sự cố với GIS, hãy kiểm tra tình trạng này.

Lưu ý rằng một đa tuyến có thể vượt qua kinh tuyến này nhiều lần. Do đó, sau khi tìm được ngắt đầu tiên và chia polyline thành hai phần, bạn cần xử lý phần thứ hai theo cùng một cách.


1
Những gì whuber nói là OK nhưng tôi nghĩ có một lỗi đánh máy ở câu sau:> Khi gắn nó sau (lat0, lon0) để chấm dứt phần đầu tiên của phần bị hỏng> polyline, hãy sử dụng (lat2, -180) nếu lat0 âm và mặt khác sử dụng (lat2, 180). Tôi nghĩ rằng nó phải là:> sử dụng (lat2, -180) nếu lon0 âm và sử dụng khác (lat2, 180)
Georgi

@Georgi Cảm ơn bạn đã nắm bắt được điều đó; Tôi nghĩ bạn đúng và tôi sẽ thay đổi.
whuber

Tôi đã phải thực hiện điều này trong Leaflet.js, đây là mã của tôi: gist.github.com/mikeatlas/0b69b354a8d713989147
Mike Atlas

Cảm ơn bạn, @Mike. Tôi thích hình minh họa zig-zag: đó chính xác là loại tình huống tôi đã hình dung trong khi tôi viết câu trả lời này. Nếu bạn muốn thử nghiệm thực sự nghiêm trọng, hãy xem điều gì xảy ra với một đa tuyến chạy dọc theo kinh tuyến + -180 độ (và vượt qua cả hai cực)!
whuber

@whuber Tôi có thể chỉ cần thử điều đó: / Sẽ đăng kết quả
Mike Atlas

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.