2010-06-14 29 views

Répondre

11

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 ...

+0

Pour une raison étrange, cela fonctionne mais je n'ai jamais réussi à obtenir le fichier containsLocation de Google () pour fonctionner ..... – WildBill

+0

@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

+0

J'ai ajouté la bibliothèque de géométrie de Google mais cela ne fonctionne toujours pas pour moi – AllJs

4

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; 
+0

Très bien, cela fonctionne. Changez simplement 'var x = point.getPosition(). Lng();' et 'var y = point.getPosition(). Lat();' –

21

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

2

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.

2

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; 
} 
+0

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

+0

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. –