#1 Fri 01 August 2008 10:49
- ludotux
- Juste Inscrit !
- Date d'inscription: 13 Dec 2007
- Messages: 6
Requêtes spatiales dans OpenJump
Bonjour,
j'ai une question sur l'utilisation de OpenJump, voilà j'ai deux couches une qui contient les communes et l'autre qui contient un réseau cablé. Je cherche à mettre en évidence les longueurs de cables par commune. Sous MapInfo je fais des requêtes du type :
Code:
select sum(ObjectLen(cables.obj,"m")) from cables, communes where cables.obj entirely within communes.obj AND communes.nom like ""
Voilà j'aimerai beaucoup trouver la méthode pour réaliser ça sous OpenJump.
Merci.
Hors ligne
#2 Sat 02 August 2008 00:56
- mmichaud
- Participant occasionnel
- Date d'inscription: 3 Jul 2007
- Messages: 13
Re: Requêtes spatiales dans OpenJump
Bonjour,
Je ne connais pas de moyen aussi efficace pour faire ce type de requête avec OpenJUMP, et dois dire que l'essai que j'ai fait avec l'outil "jointure spatiale avec agrégation d'attribut" n'a pas était très concluant...(mais cette fonction m'interessse aussi, et en tant que membre du projet, je vais essayer d'avancer pour avoir quelquechose de + fonctionnel avant la prochaine version officielle).
Heureusement, il y a toujours possibilité de recourir à un script beanshell :
Préparez votre couche communes en lui ajoutant un attribut "TotalCables" de type Double et exécutez le script suivant. Vous devriez obtenir le résultat escompté et même un peu mieux (le script totalise la partie de cable intersectant chaque commune et non la totalité des cables strictement inclus dans la commune).
Le script est à copier/coller dans la console beanshell (Personnaliser>BeanShell Console...)
Code:
{ import com.vividsolutions.jump.feature.*; import com.vividsolutions.jts.index.strtree.*; source = "cables"; cible = "communes"; attr = "TotalCables"; src = new IndexedFeatureCollection(wc.layerManager.getLayer(source).featureCollectionWrapper, new STRtree()); cib = wc.layerManager.getLayer(cible).featureCollectionWrapper; for (f : cib.features) { length = 0.0; candidats = src.query(f.geometry.envelopeInternal); for (c : candidats) { length += f.geometry.intersection(c.geometry).length; } f.setAttribute(attr, length); } }
Cordialement,
Michaël
Hors ligne
#3 Mon 04 August 2008 11:32
- ludotux
- Juste Inscrit !
- Date d'inscription: 13 Dec 2007
- Messages: 6
Re: Requêtes spatiales dans OpenJump
Merci beaucoup Michaël.
J'ai pu effectuer ce que je voulais.
je vais essayer de faire un script réutilisable plus facilement qui demande quelle couche choisir et qui ajouterais dynamiquement les attributs. Si j'ai des problèmes je reviendrais...
je n'ai pas trouvé dans la Jump javadoc la méthode envelopeInternal j'aimerai savoir à quoi elle correspond exactement?
cordialement.
Ludovic.
Hors ligne
#4 Mon 04 August 2008 21:34
- mmichaud
- Participant occasionnel
- Date d'inscription: 3 Jul 2007
- Messages: 13
Re: Requêtes spatiales dans OpenJump
Bonjour,
La méthode getEnvelopeInternal() (que l'on peut écrire envelopeInternal dans un script beanshell) renvoie l'envelope d'une géométrie.
C'est une méthode de la bibliothèque JTS (Java Topology Suite) sur laquelle est basée JUMP. La javadoc se trouve sur http://tsusiatsoftware.net/jts/javadoc/
On doit utiliser cette methode car envelope ou getEnvelope() renvoie un objet de type Geometry et on a besoin ici d'un objet de type Envelope en argument de la méthode query.
Si vous faites évoluer le script, pensez à utiliser le plugin BeanshellEditor pour son élaboration (plus confortable que Beanshell Console pour editer et tester le script) et le plugin BeanTools qui permet d'appeler un script à partir d'un menu portant son nom une fois qu'il est prêt.
Cordialement,
Michaël
Hors ligne