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