Risposte:
L'API di Google Maps non fornisce già un metodo per controllare i punti nei poligoni. Dopo aver studiato un po 'mi sono imbattuto nell'algoritmo Ray-casting che determinerà se una coordinata XY si trova all'interno di una forma tracciata. Questo si tradurrà in latitudine e longitudine. Quanto segue estende google.maps.polygon.prototype per utilizzare questo algoritmo. Includi semplicemente questo codice in un punto del codice dopo aver caricato 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);
}
};
Qui abbiamo esteso la funzionalità di google.maps.Polygon definendo una funzione con nome "Contiene" che può essere utilizzata per determinare se la longitudine della latitudine fornita nel parametro della funzione rientra o meno nel poligono. Qui utilizziamo l'algoritmo Ray-casting e abbiamo sviluppato una funzione usando lo stesso. Dopo aver fatto così tanto esercizio adesso, possiamo controllare un punto come segue:
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
}
Per il codice completo e la demo, visitare: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html
Vorrei andare al plugin Open Layers; recuperalo e puoi anche aggiungere qualsiasi livello dinamico alla tua mappa ed esportare.
* Prima di farlo, assicurati di avere il tuo progetto CRS (EPSG) impostato su WGS84 e che la trasformazione CRS "al volo" sia abilitata nelle impostazioni delle proprietà del progetto.
Spero che sia di aiuto.
se usi un programma di terze parti come geodjango, puoi verificare il tuo punto all'interno di un set di poligoni o meno. maggiori informazioni sono qui .
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)
spero che ti aiuti ...
So che è un po 'tardi ma potrebbe essere utile nel caso in cui SomeOne non abbia provato la libreria Android-Map-Utils. Ho pubblicato i metodi specifici di questa domanda solo per Android. Ecco qui: