GIS (như một lĩnh vực) đã không quá nóng khi thực sự vật lộn với bề mặt địa cầu.
Ví dụ, vấn đề của bạn không được xác định đầy đủ. Không giống như trong 2D, nơi chúng ta biết các cạnh của một đa giác được tạo thành từ các đường thẳng, chúng là gì trên quả địa cầu? Arcs của các vòng tròn lớn, giảm thiểu khoảng cách giữa các đỉnh, là một lựa chọn tốt nhưng không phải là duy nhất. Các đường thẳng (do đó di chuyển bên dưới bề mặt địa cầu) là một lựa chọn khác, ví dụ. (Các dòng Rhumb cũng là một lựa chọn nhưng có khả năng là một thứ ngớ ngẩn, đặc biệt là gần các cực ...) Đây là một liên kết tuyệt vời Các vấn đề giải thích cạnh WRT: http://blog.opengeo.org/2010/08/10/shape-of -a-đa giác /
Một vấn đề lớn khác với cách tiếp cận từ dự án đến 2d, sau đó là các điểm kỳ dị khác đã đề cập, là bất kỳ điểm giao nhau mới được tạo nào (nơi các cạnh đa giác giao nhau) sẽ nằm ngoài vị trí và phụ thuộc vào phép chiếu được sử dụng. (Tôi tin rằng đây là nơi mà khuyến nghị về mật độ hóa xuất phát từ: Bằng cách thêm một tấn các đỉnh trung gian, bạn sẽ nhận được một lỗi giảm từ phép chiếu ở giữa các cạnh đa giác.)
Giả sử bạn không muốn thực hiện tất cả các thỏa hiệp và cách giải quyết của phép chiếu thành 2D và đang muốn tự mình suy nghĩ và mã hóa một cái gì đó, tôi đã thực hiện một chút mã nguyên mẫu (và chỉ dành cho nguyên mẫu!) Cho một giao dịch khách hàng Với cái này.
Đây là một bản phác thảo của phương pháp này. Bạn sẽ cần phải biết vector là gì cũng như ý nghĩa của các sản phẩm chấm và chéo . (Hãy cẩn thận: wikipedia thuận tiện cho các liên kết nhanh, nhưng đủ nếu đó là lần đầu tiên bạn giới thiệu về các chủ đề. Một hướng dẫn đồ họa 3D tốt sẽ giúp ích.)
- Thể hiện một điểm trên quả cầu bằng một vectơ 3D Cartesian đơn vị. Điểm trên bề mặt trái đất là nơi, nếu bạn mở rộng vectơ thành một tia dài vô hạn, nó sẽ giao với bề mặt trái đất.
- Đại diện cho các vòng tròn lớn bằng một mặt phẳng thông qua nguồn gốc. (Trong 3D, một vectơ đơn vị đủ để xác định một mặt phẳng qua gốc tọa độ; nó là mặt phẳng bình thường đối với mặt phẳng.) Vòng tròn lớn là giao điểm của toàn bộ mặt phẳng với bề mặt trái đất.
- Bạn có thể tìm thấy các điểm giao nhau của hai vòng tròn lớn bằng cách cắt hai mặt phẳng của chúng.
- Xác định một cung của một vòng tròn lớn bằng hai điểm. Vectơ xác định vòng tròn lớn bình thường là sản phẩm chéo của vectơ điểm bắt đầu và điểm kết thúc.
- Để xác định xem một điểm mà chúng ta biết có nằm trên đường tròn lớn nằm trong cung hay không, hãy tạo hai mặt phẳng sao cho: chúng vuông góc với mặt phẳng của đường tròn lớn, một điểm chứa điểm bắt đầu và điểm kia chứa điểm cuối và chúng được định hướng đối mặt với nhau. Sau đó, điểm nằm trên vòng cung nếu nó nằm ở 'bên trong' của cả hai mặt phẳng. (Để giúp hình dung: bạn đã tạo ra nụ cười của pac-man khi anh ấy nhảy xuống vòng cung. Nếu điểm kiểm tra nằm giữa hai hàm của anh ấy, thì nó nằm trên vòng cung, như chúng ta đã biết nó nằm trên vòng tròn lớn.)
- Để xác định xem hai cung có giao nhau không: tìm hai điểm giao nhau của các vòng tròn lớn tương ứng của chúng, sau đó kiểm tra từng điểm để xem nó có nằm trong cả hai cung không.
- Một định nghĩa ít mơ hồ: đa giác là một tập hợp các điểm, mỗi điểm được kết nối bởi các cạnh bao gồm các cung của các vòng tròn lớn. Các điểm được sắp xếp sao cho nếu bạn đi dọc theo bề mặt trái đất dọc theo các cạnh của đa giác, 'bên trong' của đa giác sẽ nằm bên trái của bạn. Bây giờ chúng ta hãy để các đa giác phức tạp (đảo, lỗ và tự giao nhau) ra khỏi nó.
- Bạn có thể cho biết một điểm nằm ở bên phải hay bên trái của mặt phẳng thông qua dấu hiệu của sản phẩm chấm của các vectơ tương ứng của chúng. (Điều này tương đương với, khi bạn đi vòng quanh vòng tròn lớn, cho dù điểm trên bề mặt của quả cầu nằm bên trái hay bên phải của bạn.)
- Một thử nghiệm chính xác để xác định xem một điểm có nằm trong đa giác hay không: Nó có nằm ở bên trái của tất cả các cạnh không?
- Bây giờ chúng ta có khả năng kiểm tra xem một điểm có nằm trong đa giác hay không và để xác định giao điểm cạnh: các thành phần cho giao điểm đa giác-đa giác! Lề của nhận xét này quá nhỏ để viết ra một thuật toán đầy đủ nhưng các bước cơ bản là: (a) tìm tất cả các giao điểm, sau đó (b) các cạnh đi bộ, xen kẽ các đa giác mà bạn đang đi trên khi bạn gặp các điểm giao nhau.
- Khi tất cả các cách trên đang hoạt động, hãy bắt đầu suy nghĩ về các chiến lược lập chỉ mục để làm cho nó nhanh hơn, vì đa giác điểm tôi phác thảo là O (n) về số cạnh và đa giác giao nhau O (m * n) về số lượng các cạnh.
Pheew.
Có một số lợi thế lớn cho phương pháp này: Tất cả các hoạt động ở trên chỉ rút gọn thành phép nhân và bổ sung. (Sau khi chuyển đổi dữ liệu sang biểu diễn này: vd : các cạnh chồng chéo song song).
Nhìn vào mã, nó trông giống như gói Spheres mà người khác liên kết theo một số phương pháp này, mặc dù nó cũng có vẻ hơi bị nướng.
PostGIS cũng có thể sử dụng một cách tiếp cận tương tự đối với kiểu dữ liệu địa lý của nó , nhưng tôi không nhìn vào mui xe. Tôi biết rằng để lập chỉ mục không gian, ít nhất, họ sử dụng cây R trên cartesian 3D.
(Lưu ý: câu trả lời này đã trở nên đủ dài để tôi có thể chỉnh sửa thành một bài đăng trên blog ... Phản hồi / bình luận rất đáng hoan nghênh!)