#1 Mon 26 July 2010 16:43
- i_b_r_a_h_i_m
- Juste Inscrit !
- Date d'inscription: 26 Jul 2010
- Messages: 3
[JTS] Point in Polygon
Bonjour tout le monde.
Je n'ai pas réussi à trouver de réponse à mon problème sur le forum. J'espère être à la bonne rubrique.
Je développe une application qui doit fournir un service permettant de déterminer l'appartenance d'une coordonnée GPS à une zone géographique.
L'API JTS semblait correspondre à mon besoin.
Je me heurte à quelques soucis. N'ayant aucune formation en géomatique j'ai beaucoup de difficultés à trouver des réponses.
Il semblerait que l'API JTS ne soit pas capable d'effectuer ce genre de traitements en opérant directement sur des coordonnées GPS. Elle attend en entrée des données dans un système cartésien.
En effet, je dispose de relevés de positionnement GPS en base de données représentant une trajectoire.
Je dispose aussi de zones (collection ordonnée de positions GPS) permettant de reconstituer un polygone.
Ces données n'ont subi aucune transformation/projection... elles sont telles qu'à la sortie du GPS.
j'ai effectué un premier test, voici le code :
Code:
private static final int SRID = 4326; public static Polygon convertArea( ZonePointVO area ) { Polygon jtsPolygon = null; if( area != null ) { int areaPtNumber = getAreaPointNumber( area ); Coordinate[] jtsCoordArray = new Coordinate[ areaPtNumber + 1 ]; Coordinate jtsCoord = null; ZonePointVO zp = area; int i = 0; while( zp != null ){ jtsCoord = new Coordinate(); jtsCoord.x = zp.getLng(); jtsCoord.y = zp.getLat(); jtsCoordArray[i] = jtsCoord; i++; zp = zp.getNext(); } //The last point of the ring have to be equal to the first one jtsCoord = (Coordinate)jtsCoordArray[0].clone(); jtsCoordArray[i] = jtsCoord; CoordinateSequence coordSeq = CoordinateArraySequenceFactory.instance().create( jtsCoordArray ); PrecisionModel precisionModel = new PrecisionModel( PrecisionModel.FLOATING ); GeometryFactory geometryFactory = new GeometryFactory( precisionModel, SRID ); LinearRing linearRing = geometryFactory.createLinearRing( coordSeq ); jtsPolygon = geometryFactory.createPolygon( linearRing , null ); } return jtsPolygon; } public static Point convertToPoint( CoordinateVO coord ){ Point p = null; if( coord != null ){ Coordinate jtsCoord = new Coordinate(); jtsCoord.x = coord.getLatitude(); jtsCoord.y = coord.getLongitude(); PrecisionModel precisionModel = new PrecisionModel( PrecisionModel.FLOATING ); GeometryFactory geometryFactory = new GeometryFactory( precisionModel, SRID ); p = geometryFactory.createPoint( jtsCoord ); } return p; } public void test( List<CoordinateVO> traject, ZoneVO area ){ Polygon polygon = convertArea( areaVO.getZonePoint() ); if( polygon.isValid() ){ log.trace( "Polygon Area is Valid!");//OK } if( polygon.isSimple() ){ log.trace( "Polygon Area is Simple!");//OK } log.trace( "Polygon Num Point: " + polygon.getNumPoints() ); //68 Point p; for( CoordinateVO coord : traject ){ p = convertToPoint( coord ); if( p.intersects( polygon ) ){ log.warn( "Coordinate: ID= " + coord.getId() + " is in the area." ); } else { log.warn( "Coordinate: ID= " + coord.getId() + " is NOT in the area." ); // <---- Uniquement ce résultat } }
La zone définie englobe toute la trajectoire. (Visualisation de la zone ainsi que de la trajectoire via GoogleMap).
Cependant p.intersects( polygon ) me retourne toujours false.
De même si j'essaye polygon.contains( p);
J'ai donc fais un test simple avec des coordonnées cartésiennes (Polygon: (0,0),(10,0),(10,5),(0,5),(0,0) et un Point p: (5,2.5)) Et j'obtiens bien le résultat attendu : p.intersects(polygon) me retourne true.
Pouvez-vous m'expliquer que dois-je faire afin de résoudre mon souci ?
Est-il possible de résoudre mon souci simplement ? Je peux bien entendu intégrer une API libre supplémentaire. Mon projet a d'ailleurs l'API OpenMap en dépendance.
Merci à tous,
Bien cordialement,
Ibrahim
Hors ligne
#2 Mon 26 July 2010 16:57
Re: [JTS] Point in Polygon
Bonjour,
Pouvez vous nous fournir un exemple de points et du polygone que vous utilisez ?
Vous êtes vous assuré que les systèmes de coordonnées des données des deux variables sont identiques ?
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#3 Mon 26 July 2010 17:26
- i_b_r_a_h_i_m
- Juste Inscrit !
- Date d'inscription: 26 Jul 2010
- Messages: 3
Re: [JTS] Point in Polygon
Voici un exemple :
Ma zone ( (43.3820956887694, -1.92535400390629), (43.3481510201785, -1.09176635742192), (43.6807841109551, -1.14120483398442), (43.7056080341038, -1.79489135742192) )
Un des 2200 points de la trajectoire : (43.551344, -1.45512)
Le code cité précédemment m'indique que ce point n'appartient pas à la zone.
Comme je l'ai dit, en visualisant le polygone et la trajectoire via GoogleMap, j'ai bien toute ma trajectoire incluse dans le polygone.
Hors ligne
#4 Mon 26 July 2010 17:44
- i_b_r_a_h_i_m
- Juste Inscrit !
- Date d'inscription: 26 Jul 2010
- Messages: 3
Re: [JTS] Point in Polygon
J'ai trouvé mon erreur.
Code:
public static Polygon convertArea( ZonePointVO area ) { //... while( zp != null ){ jtsCoord = new Coordinate(); jtsCoord.x = zp.getLng(); //ICI x représente une longitude jtsCoord.y = zp.getLat(); //ICI y représente une latitude jtsCoordArray[i] = jtsCoord; i++; zp = zp.getNext(); } //... } return jtsPolygon; } public static Point convertToPoint( CoordinateVO coord ){ Point p = null; if( coord != null ){ Coordinate jtsCoord = new Coordinate(); jtsCoord.x = coord.getLatitude(); //ICI x est une latitude au lieu d'une longitude jtsCoord.y = coord.getLongitude(); //ICI y est une longitude au lieu d'une latitude //... } return p; }
J'ai inversé les longitudes et latitudes dans la méthode convertToPoint.
Cela fonctionne bien maintenant.
Hors ligne
#5 Tue 27 July 2010 09:21
Re: [JTS] Point in Polygon
Merci i_b_r_a_h_i_m pour ton suivit
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne