J'ai des fichiers de forme .kml qui contiennent des polygones de régions, ce que je veux faire est de trouver qu'un marqueur ou un point spécifique se trouve à l'intérieur d'un polygone. Je veux faire ça en Java. Toute bibliothèque pour analyser les fichiers .KML?JAVA: Point dans le polygone? Comment puis-je vérifier si l'emplacement d'un utilisateur se trouve dans un polygone kml?
Répondre
Pour analyser les données KML, voici une bibliothèque (m'a pris deux secondes de googler): https://github.com/micromata/javaapiforkml
Pour vérifier si une coordonnée tombe dans une forme, soit la bibliothèque offre une méthode pour cela (ne vérifiez que) - ou, vous pouvez simplement créer un Java AWT Polygon
à partir des coordonnées d'une forme (il suffit de les traiter comme des points sur une surface 2D). Polygon
offre une méthode contains(Point2D)
.
https://docs.oracle.com/javase/7/docs/api/java/awt/Polygon.html
Le JTS Topology Suite est un bon choix pour calculer correctement les relations géométriques dans le contexte géospatial. Le fichier KML peut facilement être analysé à l'aide d'une bibliothèque Java telle que JAK ou GIScore dans laquelle vous pouvez accéder aux coordonnées des entités.
Voici un extrait de code Java utilisant JTS pour tester si un point géospatial est à l'intérieur d'un polygone.
import com.vividsolutions.jts.geom.*;
// parse KML using JAK or another library
// ...
GeometryFactory gf = new GeometryFactory();
// create polygon
int numPoints = ...
Coordinate[] points = new Coordinate[numPoints];
// set points
points[0] = new Coordinate(...);
//...
LinearRing jtsRing = gf.createLinearRing(points);
Polygon poly = gf.createPolygon(jtsRing, null);
// now create point to test if contained inside polygon
Coordinate coord = new Coordinate(lon, lat);
Point pt = gf.createPoint(coord);
if (poly.contains(pt)) {
// point is contained within bounds of polygon
// do something here
}
Le contient() prédicat de géométrie est définie dans la JTS javadoc.
Si le polygone enveloppe la ligne de données ou les pôles internationaux, AWT Polygon ne fonctionnera pas toujours. Dans ces cas, vous avez besoin d'une bibliothèque géospatiale telle que [JTS Topology Suite] (http://tsusiatsoftware.net/jts/main.html). Voir [contient] (http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/geom/Geometry.html#contains (com.vividsolutions.jts.geom.Geometry)). – JasonM1
@JasonM vous avez absolument raison. –
Les formes AWT supposent une surface plane. Ce n'est pas une bonne idée pour les calculs géodésiques. – VGR