Перевірте, чи середня / довга точка знаходиться в наборі багатокутників, використовуючи карти Google


9

Я знаю, як це зробити за допомогою Esri (завдання запиту на shapefile), але чи можна це зробити також за допомогою Google Maps? Чи потрібно запитувати кожен багатокутник чи є один метод запиту набору багатокутників?

Відповіді:


9

API Google Maps вже не надає метод перевірки точок на полігонах. Трохи дослідивши, я наткнувся на алгоритм рейн-кастингу, який визначить, чи є координата XY всередині наміченої форми. Це перекладається на широту та довготу. Далі розширюється google.maps.polygon.prototype для використання цього алгоритму. Просто додайте цей код у точку в коді після завантаження google.maps:

google.maps.Polygon.prototype.Contains = function (point) {
    var crossings = 0,
        path = this.getPath();

    // for each edge
    for (var i = 0; i < path.getLength(); i++) {
        var a = path.getAt(i),
            j = i + 1;
        if (j >= path.getLength()) {
            j = 0;
        }
        var b = path.getAt(j);
        if (rayCrossesSegment(point, a, b)) {
            crossings++;
        }
    }

    // odd number of crossings?
    return (crossings % 2 == 1);

    function rayCrossesSegment(point, a, b) {
        var px = point.lng(),
            py = point.lat(),
            ax = a.lng(),
            ay = a.lat(),
            bx = b.lng(),
            by = b.lat();
        if (ay > by) {
            ax = b.lng();
            ay = b.lat();
            bx = a.lng();
            by = a.lat();
        }
        // alter longitude to cater for 180 degree crossings
        if (px < 0) {
            px += 360;
        }
        if (ax < 0) {
            ax += 360;
        }
        if (bx < 0) {
            bx += 360;
        }

        if (py == ay || py == by) py += 0.00000001;
        if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
        if (px < Math.min(ax, bx)) return true;

        var red = (ax != bx) ? ((by - ay) / (bx - ax)) : Infinity;
        var blue = (ax != px) ? ((py - ay) / (px - ax)) : Infinity;
        return (blue >= red);

    }

};

Тут ми розширили функціональність google.maps.Polygon, визначивши функцію з назвою "Містить", за допомогою якої можна визначити, чи є довгота широти, що надається в параметрі функції, в межах багатокутника чи ні. Тут ми скористаємось алгоритмом Ray-casting і розробили функцію, використовуючи той самий. Виконавши цю велику вправу зараз, ми можемо перевірити крапку наступним чином:

var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375);
var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});
if (polygon.Contains(point)) {
    // point is inside polygon
}

Щоб отримати повний код і демонстрацію, перейдіть за посиланням: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html


Так, я думаю, що рентгенівський кастинг - це шлях. Я фактично сам використовував цей алгоритм за допомогою сценарію python. Мою реалізацію можна знайти тут: gramky.blogspot.com/2012/12/…
ngramsky

Мені довелося видалити біти, які додали 360 до негативних координат, щоб це нормально працювало навколо довготи 0.
user1431317

4

Я б зайшов плагін Open Layers; витягніть його, а потім можете навіть додати будь-який динамічний шар на свою карту та експортувати.

* Перш ніж зробити це, переконайтеся, що для вашого проекту CRS (EPSG) встановлено WGS84, і що "на ходу" перетворення CRS увімкнено в налаштуваннях Project Properties.

Сподіваюсь, це допомагає.


0

якщо ви використовуєте сторонні програми як geodjango, ви можете перевірити свою точку, чи є в наборі полігонів чи ні. Більше інформації тут .

contains

Availability: PostGIS, Oracle, MySQL, SpatiaLite

Tests if the geometry field spatially contains the lookup geometry.

Example:

Zipcode.objects.filter(poly__contains=geom)

Backend     SQL Equivalent
PostGIS     ST_Contains(poly, geom)
Oracle  SDO_CONTAINS(poly, geom)
MySQL   MBRContains(poly, geom)
SpatiaLite  Contains(poly, geom)

я сподіваюся, що це допоможе тобі ...


0

Я знаю, що це трохи пізно, але це може бути корисно у випадку, якщо SomeOne не спробує бібліотеку Android-Map-Utils. Я опублікував специфічні методи цього питання лише для Android. Ось вам:

https://stackoverflow.com/a/31988461/2054348

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