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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB