Я знаю, как сделать это с помощью Esri (задача Query для шейп-файла), но можно ли это сделать с помощью Google Maps? Нужно ли запрашивать каждый полигон или есть один метод для запроса набора полигонов?
источник
Я знаю, как сделать это с помощью Esri (задача Query для шейп-файла), но можно ли это сделать с помощью Google Maps? Нужно ли запрашивать каждый полигон или есть один метод для запроса набора полигонов?
API карт Google еще не предоставляет метод проверки точек в многоугольниках. После небольшого исследования я наткнулся на алгоритм наведения лучей, который определит, находится ли координата 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, определив функцию с именем «Contains», которую можно использовать для определения того, находятся ли значения широты и долготы в параметре функции в пределах многоугольника или нет. Здесь мы используем алгоритм наведения лучей и разработали функцию, использующую то же самое. Выполнив сейчас много упражнений, мы можем проверить точку следующим образом:
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
Я бы пошел плагин Open Layers; извлеките его, и затем вы даже сможете добавить любой динамический слой на карту и экспортировать.
* Перед этим убедитесь, что для вашего проекта CRS (EPSG) установлено значение WGS84, и что преобразование CRS «на лету» включено в настройках свойств проекта.
Надеюсь это поможет.
источник
если вы используете стороннюю программу в качестве геоджанго, вы можете проверить свою точку зрения в пределах набора полигонов или нет. больше информации здесь .
я надеюсь, что это поможет вам ...
источник
Я знаю, что это немного поздно, но это может помочь, если SomeOne не попробует библиотеку Android-Map-Utils. Я опубликовал этот вопрос только для Android. Ну вот:
источник