Je voudrais détecter qu'un google.maps.LatLng
est à l'intérieur d'un google.maps.Polygon
.Comment détecter qu'un point se trouve dans un polygone à l'aide de Google Maps?
Comment puis-je faire cela?
Vive,
Je voudrais détecter qu'un google.maps.LatLng
est à l'intérieur d'un google.maps.Polygon
.Comment détecter qu'un point se trouve dans un polygone à l'aide de Google Maps?
Comment puis-je faire cela?
Vive,
Autre solution: Google-Maps-Point-in-Polygon
Un Javascript Google Maps v3 e xtension pour la classe Polygon pour détecter si oui ou non un point réside en son sein ...
j'ai utilisé cet algorithme pour détecter que le point est à l'intérieur du polygone: http://alienryderflex.com/polygon/
I a ajouté une nouvelle méthode contains
au polygone:
// Add a function contains(point) to the Google Maps API v.3
google.maps.Polygon.prototype.contains = function(point) {
var j=0;
var oddNodes = false;
var x = point.lng();
var y = point.lat();
var paths = this.getPath();
for (var i=0; i < paths.getLength(); i++) {
j++;
if (j == paths.getLength()) {j = 0;}
if (((paths.getAt(i).lat() < y) && (paths.getAt(j).lat() >= y))
|| ((paths.getAt(j).lat() < y) && (paths.getAt(i).lat() >= y))) {
if (paths.getAt(i).lng() + (y - paths.getAt(i).lat())
/(paths.getAt(j).lat()-paths.getAt(i).lat())
* (paths.getAt(j).lng() - paths.getAt(i).lng())<x) {
oddNodes = !oddNodes
}
}
}
return oddNodes;
}
google.maps.Polyline.prototype.contains = google.maps.Polygon.prototype.contains;
Très bien, cela fonctionne. Changez simplement 'var x = point.getPosition(). Lng();' et 'var y = point.getPosition(). Lat();' –
Google fournit leur propre mise en œuvre au sein de la bibliothèque de la géométrie, que je ne l'ai pas vérifié, mais couvre vraisemblablement les cas de pointe abordés dans le autres réponses
Voir la méthode containsLocation described here. Notez que vous devrez import the geometry library explicitly, as it is not in the base map API
Vous pouvez l'utiliser dans google map V3: -
google.maps.geometry.poly.containsLocation(google.maps.LatLng(latitude, longitude),polygons);
polygones
est un objet retourné par la fonction après polygoncomplete.
var polygons=null;
google.maps.event.addDomListener(drawingManager, "polygoncomplete", function(polygon) {
polygons=polygon;
});
référence
par https://developers.google.com/maps/documentation/javascript/reference
Chaque méthode décrite ici ne d'une manière ou d'une autre.
Les méthodes données par Andrei I et NATIM ne le font pas considèrent les polygones avec des arêtes géodésiques. Ces méthodes ne parviennent pas non plus à réaliser qu'un contour non-géodésique dans Google Maps est uniquement direct dans la projection de Mercator. Ces méthodes supposent que les sommets se trouvent sur une grille de latitude/longitude égale où la latitude d'un degré est égale à un degré de longitude. À la suite de cette erreur, ces méthodes indiqueront qu'un point est à l'extérieur du polygone, tout en étant affiché à l'intérieur dans certains cas. Ceci est facilement observé pour les longues arêtes non verticales/non horizontales. Pour résoudre ce problème, tous les points doivent d'abord être convertis des coordonnées Latitude, Longitude en X, Y dans la projection Mercator. Here is the method to convert the coordinates from lat/lon to x/y in Mercator. (Manque de précision) Rhumb line navigation can be used as a basis for an alternative method. La version expérimentale de Google Maps 3.10 implémente cette méthode.
La méthode décrite par Paul Gibbs, swapnil udare et Adi Lester considère-t bords géodésiques, mais de Google Maps v3.9, il utilise la même méthode mentionnée ci-dessus pour les polygones non-géodésique. En tant que tel, il souffre également du même problème décrit ci-dessus.
Mise à jour - Le problème avec Google Maps a été corrigé dans la version expérimentale actuelle de Google Maps v3.10.
Pas besoin d'algorithmes complexes, j'ai pu y parvenir en utilisant la méthode isPointInPath() de canvas html.
http://www.w3schools.com/tags/canvas_ispointinpath.asp
Créer un élément de toile. Dessine un polygone avec plusieurs points de terminaison en utilisant les méthodes moveTo() et lineTo(). Vérifiez si un point (x, y) se trouve à l'intérieur du polygone à l'aide de la méthode isPointInPath().
<canvas id="canvas"></canvas>
//x,y are coordinate of the point that needs to be tested
//coordinates contains all endpoint of a polygon in format of x1,y1,x2,y2,x3,y3....
function isPointInPolygon(x, y, coordinates) {
var ctx = canvas.getContext("2d");
var coords = coordinates.split(',');
if (coords != null && coords.length > 4) {
ctx.beginPath();
ctx.moveTo(coords[0], coords[1]);
for (j = 2; j < coords.length; j++) {
ctx.lineTo(coords[j], coords[j + 1]);
j++;
}
ctx.closePath();
if (ctx.isPointInPath(x, y))
return true;
else
return false;
}
return false;
}
L'affiche posait des questions sur les polygones sur Google Maps. Tous les navigateurs ne supportent pas le canevas et la méthode ci-dessus suppose une grille X, Y standard. Si l'on dessine sur une toile, la méthode ci-dessus est parfaite sinon c'est juste un gaspillage. Les autres méthodes mentionnées ci-dessus peuvent le calculer sans l'overhead de dessiner sur une toile. La meilleure méthode à partir de Google maps v3.10 est google.maps.geometry.poly.containsLocation() car elle gère les polygones géodésiques ainsi que les polygones mercator. – deAtog
Je suis d'accord. Il ne répond pas exactement à cette question mais pourrait aider les gens qui travaillent dans l'environnement html5 et qui se retrouvent dans cet article à détecter un point dans un polygone. Je suis venu à ce poste et j'ai essayé d'implémenter tous les algorithmes mais rien ne fonctionnait parfaitement. J'ai fondamentalement mis en place une carte personnalisée sur une image de plan d'étage en utilisant le canevas. J'ai dû montrer des infobulles sur différentes parties de l'image et imiter la fonctionnalité de la carte-image html. –
Pour une raison étrange, cela fonctionne mais je n'ai jamais réussi à obtenir le fichier containsLocation de Google () pour fonctionner ..... – WildBill
@WildBill - Vous aurez besoin de la bibliothèque de géométrie pour que cela fonctionne. Exemple:? Sensor = false & libraries = dessin, géométrie – jjwdesign
J'ai ajouté la bibliothèque de géométrie de Google mais cela ne fonctionne toujours pas pour moi – AllJs