Xác định xem hai đa giác có trùng nhau trong Google Maps không?


12

Tôi đang làm việc với google maps và đa giác, nhưng tôi phải xác thực rằng các đa giác không chồng chéo lẫn nhau.

Tôi có một hàm trả về TRUE khi một điểm (lat, lng) nằm trong một đa giác, nhưng nó không đủ để xác định xem mọi điểm của đa giác có nằm trong một đa giác khác hay không.

Bất kì lời đề nghị nào?


1
Mất khoảng 10 giây để tìm github.com/tparkin/Google-Maps-Point-in-Polygon . Bạn đã thử bất cứ điều gì?
John Powell

4
Anh ấy đã viết "Tôi có một hàm trả về TRUE khi một điểm (lat, lng) nằm trong đa giác". Tôi nghĩ rằng đây là một thử nghiệm tốt nhưng không trả lời nếu toàn bộ đa giác nằm trong một đa giác khác.
dùng49584

1
Tôi sẽ thêm thư viện Javascript Topology Suite vào dự án của bạn và tận dụng các toán tử không gian của nó để so sánh. Tôi đã cung cấp một câu trả lời cho một câu hỏi tương tự chỉ ra cách đưa thư viện jsts vào một dự án và thực hiện hòa tan / kết hợp trên hai hình học đa giác . Bạn có thể thấy rằng hữu ích. Nếu tôi có cơ hội tôi sẽ xem liệu tôi có thể tìm hoặc tạo một ví dụ kiểm tra giao điểm của hai hình học - đa giác, đường hoặc điểm không quan trọng, chúng có giao nhau hay không. :)
elrobis 18/03/2016

Câu trả lời:


8

Ví dụ về JSFiddle

Tôi đã tạo một JSFiddle trình bày một giải pháp cho vấn đề của bạn bằng thư viện JavaScript Topology Suite (JSTS) (JSTS).

Giải thích

Có hai bước để tiếp cận này. Bước đầu tiên chuyển đổi hình học Google của bạn thành biểu thức hình học WellKnownText (WKT) , đây là định dạng được hỗ trợ rộng rãi. Bước thứ hai sử dụng JSTS để thực hiện geometry.intersects()so sánh JSTS của hai hình học WKT.

Để thực sự hiểu điều này, bạn sẽ cần có hiểu biết cơ bản về WKT. Vì hình học đa giác trong Google Map của bạn không được định dạng hỗ trợ rộng rãi, tôi ngay lập tức chuyển đổi chúng thành hình học WKT để chúng tôi có thể làm việc với chúng trong JSTS.

Để làm điều này một cách dễ dàng, tôi đã sử dụng thư viện Wicket . Tất nhiên, bạn luôn có thể tự thực hiện phương pháp Google-Polygon-to-WKT của riêng mình hoặc bạn có thể sử dụng một phương pháp tôi đã viết một lần hoặc bạn có thể sử dụng một số giải pháp khác mà bạn có thể tìm thấy. Cá nhân, những ngày này tôi chỉ sử dụng Wicket, như bạn có thể thấy, rất đơn giản:

// Pass in two Google Polygon objects.
// It returns two WellKnownText (WKT) geometry expressions.
// 
function UseWicketToGoFromGooglePolysToWKT( poly1, poly2 )
{
    var wicket = new Wkt.Wkt();

    wicket.fromObject(poly1);
    var wkt1 = wicket.write();

    wicket.fromObject(poly2);
    var wkt2 = wicket.write();

    return [wkt1, wkt2];
}

Tiếp theo là thịt và khoai tây - sử dụng JSTS để lấy hai hình học WKT và kiểm tra xem chúng có giao nhau hay không. Một lần nữa, dựa vào thư viện, không có gì nhiều cho nó:

// Pass in two WKT geometry expressions.
// It performs a JSTS intersects() comparison.
// 
function UseJstsToTestForIntersection( wkt1, wkt2 )
{
    // Instantiate JSTS WKTReader and get two JSTS geometry objects
    var wktReader = new jsts.io.WKTReader();
    var geom1 = wktReader.read(wkt1);
    var geom2 = wktReader.read(wkt2);

    if (geom2.intersects(geom1)) {
      alert('intersection confirmed!');
    } else {
      alert('..no intersection.');
    }
}

Làm thế nào tôi liên kết các thư viện trong Fiddle

Fiddle được liên kết ở trên và giải pháp tôi đã trình bày yêu cầu thêm hai thư viện bên thứ 3 vào dự án của bạn - JSTS và Wicket. Lấy mã từ Github tương ứng của họ và kết hợp nó vào dự án của bạn là một bài tập khác. Nhưng đối với câu đố, tôi đã liên kết với các thư viện đó bằng cách tham khảo chúng trong một ví dụ JSTS hiện có mà tôi tìm thấy được đăng bởi Christopher Manning , cũng như trang demo của Wicket . Về cơ bản, tôi đã mở các trang, chọn "Xem nguồn" và chọn các tài liệu tham khảo có liên quan đến hai thư viện. Đây là những điểm cuối thư viện chính xác mà tôi đã sử dụng:

http://arthur-e.github.io/Wicket/wicket.js
http://arthur-e.github.io/Wicket/wicket-gmap3.js
http://bl.ocks.org/christophermanning/raw/4450188/javascript.util.min.js
http://bl.ocks.org/christophermanning/raw/4450188/jsts.min.js

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.