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

Printemps des cartes 2024

#1 Fri 08 October 2010 16:07

xav
Participant assidu
Date d'inscription: 27 Oct 2005
Messages: 280

[ORACLE] milieu d'une ligne

Bonjour,

je souhaiterais à l'aide d'une requête oracle récupérer les coordonnées du milieu d'une ligne.
un peu comme le centroide  d'une surface mais pour une ligne.

Je vais essayer en créant un tout petit buffer autour de ma ligne et utiliser SDO_POINTONSURFACE mais cela serait plus propre si oracle le permettait plus simplement.

si quelqu'un a une idée

Merci d'avance


Xavier Lang
Information géographique et observatoire - DSI Communautaire
Cap Atlantique

Hors ligne

 

#2 Fri 08 October 2010 16:37

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: [ORACLE] milieu d'une ligne

Aloha
De tête, s'il s'agit de segment, utiliser un SDO_UTIL.POINT_AT_BEARING avec en variable la demi longueur, puis extraire ces coordonnées avec un SDO_UTIL.GETVERTICES.
Il y a aussi les SDO_LRS (PERCENTAGE_TO_MEASURE pour retrouver la demi longueur, LOCATE_PT pour localiser un point avec une mesure de segment).
C'est peu ; juste de quoi débuter.


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#3 Fri 08 October 2010 16:47

xav
Participant assidu
Date d'inscription: 27 Oct 2005
Messages: 280

Re: [ORACLE] milieu d'une ligne

Merci je vais jeter un œil à tout ça mais ca m'a l'air bien plus compliqué que de faire un tout petit buffer et un SDO_POINTONSURFACE.

Je verrais laquelle des solutions je retiens.

Bon week end à tous


Xavier Lang
Information géographique et observatoire - DSI Communautaire
Cap Atlantique

Hors ligne

 

#4 Fri 08 October 2010 16:51

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: [ORACLE] milieu d'une ligne

Plus compliqué, mais plus juste. Céder à la facilité, c'est le mal !


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#5 Fri 08 October 2010 16:54

xav
Participant assidu
Date d'inscription: 27 Oct 2005
Messages: 280

Re: [ORACLE] milieu d'une ligne

Bah oui mais c'est vendredi .... ;-)))


Xavier Lang
Information géographique et observatoire - DSI Communautaire
Cap Atlantique

Hors ligne

 

#6 Fri 08 October 2010 17:00

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: [ORACLE] milieu d'une ligne

Je crois qu'il y a la fonction et son code ici, dernier message de simon.


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#7 Fri 08 October 2010 17:09

xav
Participant assidu
Date d'inscription: 27 Oct 2005
Messages: 280

Re: [ORACLE] milieu d'une ligne

effectivement la fonction sdo_centroid de son package a l'air de faire ce que je souhaite.

je vais me plonger la dedans.

Merci pour l'aide et bon week end


Xavier Lang
Information géographique et observatoire - DSI Communautaire
Cap Atlantique

Hors ligne

 

#8 Fri 08 October 2010 18:43

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [ORACLE] milieu d'une ligne

xav a écrit:

effectivement la fonction sdo_centroid de son package a l'air de faire ce que je souhaite.

je vais me plonger la dedans.

Merci pour l'aide et bon week end


Bonsoir,

[edit] j'ai lu le fil un peu vite: Pierre evoque deja le package LSR...

je verrais bien ca avec les outils de referencement lineaire: demander les coordonnées du point situé au milieu d'un segment.
Qqchose comme:

select SDO_LRS.LOCATE_PT(
    SDO_LRS.CONVERT_TO_LRS_GEOM(
      sdo_geometry(
        'LINESTRING(0 0, 4 4)'
        )
      ),
    sdo_geom.sdo_length(sdo_geometry('LINESTRING(0 0, 4 4)'), 0.001) / 2
    )
from dual;

creation d'une linestring de test,
transformation en lrs geometry
utilisation du package Linear Referencing sur cette geometrie

Dans Oracle, il faut preciser qu'on souhaite le milieu de la ligne (ou une fraction de la ligne) en l'exprimant par rapport a la longueur de la ligne, a la difference de PG ou c'est un index entre 0 et 1, 1 etant la ligne totale.

Nicolas

Dernière modification par Nicolas Ribot (Fri 08 October 2010 20:30)

Hors ligne

 

#9 Wed 02 March 2011 14:00

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: [ORACLE] milieu d'une ligne

Quelqu'un a-t'il testé l'une ou l'autre des solutions ?


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#10 Wed 02 March 2011 17:06

xav
Participant assidu
Date d'inscription: 27 Oct 2005
Messages: 280

Re: [ORACLE] milieu d'une ligne

je n'ai pas pris le temps de tester ta solution et celle de Nicolas,
je suis resté a faire un buffer et  à prendre le centroide du polygone


Xavier Lang
Information géographique et observatoire - DSI Communautaire
Cap Atlantique

Hors ligne

 

#11 Wed 02 March 2011 18:51

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [ORACLE] milieu d'une ligne

Pierre a écrit:

Quelqu'un a-t'il testé l'une ou l'autre des solutions ?


Bonsoir,

Juste pour comparer les deux methodes:

J'ai chargé les limites admin de la France (IGN): 330 lignes.

1°) Requetes pour calculer le milieu de chaque ligne, avec un buffer:

Code:

select sdo_geom.sdo_centroid(sdo_geom.sdo_buffer(geom, 1, 0.000001), 0.000001)
from limites;

La requete prend 10s.
Suivant la taille du buffer et la precision, certains points ne sont pas calculés. Les points calculés ne tombent pas toujours exactement sur la ligne dont ils devraient etre le milieu

2°) Calcul avec les fonctions LRS:

Code:

select SDO_LRS.CONVERT_TO_STD_GEOM((SDO_LRS.LOCATE_PT(
    SDO_LRS.CONVERT_TO_LRS_GEOM(geom), 
    sdo_geom.sdo_length(geom, 0.001) / 2
    ))) as middle
from limites;

La requete prend 96 ms et affiche bien les 330 milieux de segments.

Nicolas

Hors ligne

 

#12 Thu 03 March 2011 11:58

xav
Participant assidu
Date d'inscription: 27 Oct 2005
Messages: 280

Re: [ORACLE] milieu d'une ligne

J'ai mis la requête en place, ca fonctionne correctement.

J'ai effectivement dans sldeveloper, 0.12 seconde de différence de temps entre les 2 requêtes (qui s'exécutent sur une ligne à la fois).

Merci pour tout


Xavier Lang
Information géographique et observatoire - DSI Communautaire
Cap Atlantique

Hors ligne

 

#13 Thu 03 March 2011 17:05

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [ORACLE] milieu d'une ligne

xav a écrit:

J'ai mis la requête en place, ca fonctionne correctement.

J'ai effectivement dans sldeveloper, 0.12 seconde de différence de temps entre les 2 requêtes (qui s'exécutent sur une ligne à la fois).

Merci pour tout


Attention cependant a la fonction Buffer: elle n'est pas lineaire en temps de traitement: calculer un buffer sur une geometrie moyenne ou grosse peut prendre bcp de temps. La methode avec le referencement lineaire est plus lineaire et repondra vite meme pour des lignes complexes.

Nico

Hors ligne

 

Pied de page des forums

Powered by FluxBB