Vérifier si le Point à l'Intérieur d'Un Polygone
Je veux vérifier si un point est situé à l'intérieur d'un polygone. Le polygone est:
polygon= [ [-73.89632720118, 40.8515320489962],
[-73.8964878416508, 40.8512476593594],
[-73.8968799791431, 40.851375925454],
[-73.8967188588015, 40.851660158514],
[-73.89632720118, 40.8515320489962] ]
Les points que je tiens à vérifier sont les suivants:
1 = [40.8515320489962,-73.89632720118]
2 = [40.8512476593594,-73.8964878416508]
3 = [40.851375925454,-73.8968799791431]
4 = [40.851660158514,-73.8967188588015]
5 = [40.8515320489962,-73.89632720118]
Comment puis-je savoir si chacun de ces points est à l'intérieur de ce polygone?
Cet algorithme ne fonctionne pas. Je ne sais pas pourquoi.
pt[lat,long]
function isPointInPoly(poly, pt){
for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1] < poly[i].y))
&& (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])
&& (c = !c);
return c;
}
Je ne veux pas utiliser une solution tierce partie tels que google maps API ou cette un https://github.com/mattwilliamson/Google-Maps-Point-in-Polygon.
Ma tentative est ici:
http://jsfiddle.net/nvNNF/2/
- Prendre un point à l'extérieur du polygone vérifier et voir si une ligne à partir de ce point, à votre point croise un nombre impair de lignes qui définissent le périmètre du polygone.
- Vous pouvez vérifier le code en direct ici: j'ai mis un point dans le polygone jsfiddle.net/nvNNF/2 et il retourne "False"
- en.wikipedia.org/wiki/Point_in_polygon attention en.wikipedia.org/wiki/Complex_polygons
poly[i].y
devrait êtrepoly[i][1]
à la fin de la ligne 3. Également que la fonction vérifie si le point est à l'intérieur du polygone pas si le point appartient au polygone.- Aucune raison pour que votre boucle d'avoir un grand nombre de variables, la réduction de la lisibilité. Vous pouvez tester chaque état individuellement et alerte, et une fois que vous atteignez la fin de votre code, puis vous combinez toutes vos conditions et vérifier de nouveau.
Vous devez vous connecter pour publier un commentaire.
Il y a un projet sur Github avec le code: https://github.com/substack/point-in-polygon (licence MIT):
Utilisation:
La fonction de test est ici: https://github.com/substack/point-in-polygon/blob/master/index.js
Remarque: Ce code ne fonctionne pas de manière fiable lorsque le point est un coin du polygone ou sur un bord. Il est une version améliorée ici: https://github.com/mikolalysenko/robust-point-in-polygon
var intersect
expression. Certains d'entre eux devrait probablement inclure l'égalité, peut-être tous d'entre eux.Voici la fonction que j'ai enfin obtenu de travail. Je l'ai eu par l'adoption de C code javascript à partir de ici (avec explication).
Où
cornersX
= array avec x ou latitude tableau vertices,cornersY
= array avec y ou de longitude tableau. X, Y - la latitude et la longitude de la testés point.Votre polygone tableau ressemble
coordinates
tableau en GeoJSON structure de polygone (lire plus à https://macwright.org/2015/03/23/geojson-second-bite.html et http://geojson.org).Alors peut-être vous pouvez utiliser des bibliothèques qui travaillent avec geoJSON de données? Regardez la réponse et les commentaires de l'OP dans Est-il possible de déterminer si un GeoJSON point est à l'intérieur d'un GeoJSON polygone à l'aide de JavasScript?
En bref, ma journée a été sauvé par
turf
(https://github.com/turfjs/turf)Il est également
d3
(https://github.com/d3/d3-geo#geoContains) mais j'ai eu des problèmes avec elle.UPD:
J'ai remarqué
turf
est de donner des résultats incohérents lorsque le point est sur le bord du polygone. J'ai créé et je suis en attente de réponse des développeurs.UPD2:
Limite "points" problème est résolu en utilisant la dernière version de
turf
(j'ai utilisé 3.0.14 au lieu de 4.6.1). C'est tout pour le moment.Dans mon cas je n'ai la suite chose qu'il fonctionne très bien pour moi