#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: 1554
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
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: 1554
Re: [ORACLE] milieu d'une ligne
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: 1554
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
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