Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9860
Site web

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9860
Site web

Re: [JTS] Point in Polygon

Merci i_b_r_a_h_i_m pour ton suivit smile

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

 

Pied de page des forums

Powered by FluxBB