Визначення, чи перекриваються два багатокутники на Картах Google?


12

Я працюю з картами Google і полігонами, але мені потрібно перевірити, що полігони не перетинаються один з одним.

У мене є функція, яка повертає TRUE, коли точка (лат, lng) знаходиться всередині багатокутника, але недостатньо, щоб визначити, чи кожна точка багатокутника знаходиться в іншому багатокутнику.

Будь-яка пропозиція?


1
Мені знадобилося близько 10 секунд, щоб знайти github.com/tparkin/Google-Maps-Point-in-Polygon . Ви щось пробували?
Джон Пауелл

4
Він написав "У мене є функція, яка повертає TRUE, коли точка (лат, lng) знаходиться всередині багатокутника". Я думаю, що це хороший випробування, але не відповідає, якщо весь полігон знаходиться в іншому.
користувач30184

1
Я додав би бібліотеку Javascript Topology Suite до вашого проекту і скористався його просторовими операторами для такого порівняння. Я дав відповідь на аналогічне запитання, що показує, як включити бібліотеку jsts у проект та виконати розпуск / об'єднання на двох геометріях багатокутника . Вам це може бути корисним. Якщо у мене є можливість, я побачу, чи зможу я знайти чи створити приклад, що тести на перетин двох геометрій - багатокутника, лінії чи точки не матимуть значення, вони перетинаються, або вони не мають. :)
elrobis

Відповіді:


8

Приклад JSFiddle

Я створив JSFiddle, що демонструє рішення вашої проблеми за допомогою бібліотеки JavaScript Topology Suite (JSTS) (JSTS).

Пояснення

До цього підходу є два кроки. Перший крок перетворює ваші геометрії Google у вирази геометрії WellK knownText (WKT) , що є широко підтримуваним форматом. Другий крок використовує JSTS для geometry.intersects()порівняння JSTS двох геометрий WKT.

Щоб реально зрозуміти це, вам потрібно мати базове розуміння WKT. Оскільки геометрія багатокутника у вашій карті Google не підтримується широко, я негайно перетворюю їх у геометрию WKT, щоб ми могли працювати з ними в JSTS.

Щоб зробити це легко, я використав бібліотеку Вікет . Звичайно, ви завжди можете передати домашній власний метод Google-Polygon-W-WKT, або ви можете використовувати той, про який я писав один раз , або ви можете використати якесь інше рішення, яке ви можете знайти. Особисто в ці дні я просто використовую калитку, яка, як ви бачите, є безбожною:

// 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];
}

Далі - м'ясо та картопля - за допомогою JSTS взяти дві геометричні характеристики WKT і перевірити, чи перетинаються вони чи ні. Ще раз, покладаючись на бібліотеку, в ній мало що:

// 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.');
    }
}

Як я пов’язав бібліотеки у Скрипці

Згадана вище скрипка та рішення, яке я продемонстрував, вимагає додати до свого проекту дві бібліотеки сторонніх організацій - JSTS та Wicket. Отримати код від відповідних Githubs та включити його у свій проект - це інша вправа. Але для загадки я пов’язав ці бібліотеки, посилаючись на них у наявному прикладі JSTS, який я знайшов, розміщеному Крістофером Меннінг , а також на власній демонстраційній сторінці Віккета . В основному я відкрив сторінки, вибрав "Переглянути джерело" і вищипав відповідні посилання на дві бібліотеки. Це були точні кінцеві точки бібліотеки, які я використовував:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.