Определить, перекрываются ли два полигона в Картах Google?


12

Я работаю с картами и полигонами Google, но мне нужно проверить, что многоугольники не перекрывают друг друга.

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

Любое предложение?


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

4
Он написал: «У меня есть функция, которая возвращает TRUE, когда точка (lat, lng) находится внутри многоугольника». Я думаю, что это хорошее испытание, но оно не отвечает, если весь многоугольник находится внутри другого.
user30184

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

Ответы:


8

Пример JSFiddle

Я создал JSFiddle, демонстрирующий решение вашей проблемы с использованием библиотеки JavaScript Topology Suite (JSTS) (JSTS).

Explaination

Есть два шага к этому подходу. Первый шаг преобразует ваши геометрии Google в выражения геометрии WellKnownText (WKT) , который широко поддерживается. На втором этапе используется JSTS для geometry.intersects()сравнения JSTS двух геометрий WKT.

Чтобы действительно понять это, вам нужно иметь базовое понимание WKT. Поскольку геометрия полигонов на вашей карте Google не поддерживается широко, я немедленно преобразую их в геометрии WKT, чтобы мы могли работать с ними в JSTS.

Чтобы сделать это легко, я использовал библиотеку Wicket . Конечно, вы всегда можете прокомментировать свой собственный метод Google-Polygon-to-WKT, или вы можете использовать тот, который я написал однажды , или вы можете использовать другое решение, которое вы можете найти. Лично в эти дни я просто использую Wicket, который, как вы можете видеть, очень прост:

// 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. Получение кода от их соответствующих Github и включение его в ваш проект - другое упражнение. Но для скрипки я связался с этими библиотеками, сославшись на них в существующем примере JSTS, который я нашел опубликованным Кристофером Мэннингом , а также на собственной демонстрационной странице Wicket . По сути, я открыл страницы, выбрал «Просмотр источника» и собрал соответствующие ссылки на две библиотеки. Это были точные конечные точки библиотеки, которые я использовал:

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.