#1 Mon 04 February 2008 16:58
Liste coordonnées Oracle Locator 9g
Bonjour,
connaissez-vous la requête SQL sous Oracle 9g permettant d'obtenir une
chaine contenant les coordonnées d'un objet géométriques ?
Quelque chose qui serait l'équivalent sous PostGIS de : select
astext(geom) from matable
Ce n'est pas grave, si la chaine de coordonnées retournée n'est pas en WKT.
Merci d'avance
--
David Delhorbe
Webmapping & SIG OpenSource
Département de Seine-Saint-Denis
ddelhorbe@ cg93.fr
Hors ligne
#2 Tue 12 February 2008 06:54
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Liste coordonnées Oracle Locator 9g
Bonjour,
SDO_UTIL.GETVERTICES ?
(http://download.oracle.com/docs/html/A9 … sthref1639)
Nico
Hors ligne
#3 Tue 12 February 2008 15:36
Re: Liste coordonnées Oracle Locator 9g
GetVertices ne renvoie pas une chaîne de caractère, et je ne peux pas
utiliser cet objet de type vertex en PHP. L'idée, c'est de récupérer (en
simple texte) les coordonnées des objets, pour les reformater via PHP
afin d'écire du SVG.
Aprés de nombreuses recherches, j'utilise ceci, faute de mieux. Mais ce
n'est pas satisfaisant, car je ne récupère les coordonnées que d'un
objet à la fois :
SELECT * FROM TABLE(SELECT a.CHAMP_GEOM.SDO_ORDINATES FROM MA_TABLE a
WHERE CHAMP_ID = 'ID')
Avec les dernières version d'Oracle, il existe des fonctions GET_WKT
permettant de récupérer les coordonnées de tous les objets en texte
selon la syntaxe OGC, mais sous oracle 8 et 9, je ne trouve pas d'autre
alternative.
David Delhorbe
Webmapping & SIG OpenSource
Département de Seine-Saint-Denis
ddelhorbe@ cg93.fr
Hors ligne
#4 Tue 12 February 2008 20:13
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Liste coordonnées Oracle Locator 9g
une requete comme celle-ci permet de recuper les coord x et y sous
forme de nombre:
SELECT c.datastripid, t.X, t.Y, t.id
FROM tmpstrip c,
TABLE(SDO_UTIL.GETVERTICES(c.contour)) t
ORDER BY c.datastripid, t.id;
datastrip est une table contenant des polygones. la requete donne:
DATASTRIPID X Y ID
----------- ---------- ---------- ----------
993 -37.658845 -46.877754 1
993 -37.396009 -46.877754 2
993 -37.396665 -46.608259 3
993 -37.65819 -46.608259 4
993 -37.658845 -46.877754 5
994 -145.4031 33.4099522 1
994 -145.18787 33.4099522 2
994 -145.18753 33.679447 3
994 -145.40343 33.679447 4
994 -145.4031 33.4099522 5
995 -119.98241 36.7822524 1
995 -119.75809 36.7822524 2
995 -119.75769 37.0517472 3
995 -119.98281 37.0517472 4
995 -119.98241 36.7822524 5
On peut imaginer un code PHP qui construit le svg ou le wkt a partir
de cette requete et en connaissant le type des objets stockés (tables
de metadonnées).
A chaque fois que l'identifiant de la feature change, on finit
d'ecrire l'objet precedant et on commence a ecrire le nouvel objet.
Nico
Hors ligne
#5 Wed 13 February 2008 15:45
Re: Liste coordonnées Oracle Locator 9g
Merci pour la requête, c'est une bonne idée ! Je l'implémente dans mon
PHP pour voir si c'est plus rapide que ma méthode actuelle et je te
tiens au courant.
David Delhorbe
Webmapping & SIG OpenSource
Département de Seine-Saint-Denis
ddelhorbe@ cg93.fr
Hors ligne
#6 Wed 13 February 2008 15:46
Re: Liste coordonnées Oracle Locator 9g
Ta soluce marche bien. J'ai à peu prés les même temps de réponse pour la
génération du SVG. Mais ça à le gros avantage d'être + propre et de
moins solliciter la base, car avant je lançais autant de requête que
d'objets à cartographier.
Par contre, j'ai un autre problème que je soumet à tes lumières en
Oracle Spatial (que je rencontrais déjà dans ma manière précédente de
récupérer les coordonnées) :
les mutipolygones ne sont pas distingués. Je m'explique : je ne peux pas
à distingué pour un même ID d'objet, si la géométrie de cet objet est
simple (1 polygone) ou complexe (plusieurs polygones distincts composent
la surface de l'objet). Les coordonnées des polygones composant l'objet
se suivent, mais je n'ai pas d'indication me permettant alors de créer
un autre polygone en SVG, et celà se traduit en SVG par un trait reliant
les polygones d'un même objet.
Peut-être que vertex.ID retombe à 1 quand on passe à un nouveau polygone
composant l'objet, mais la commande vertex.id ne fonctionne sur ma base,
alors vertex.X et Y fonctionnent : SQL Error: ORA-00904: "T"."ID" :
identificateur non valide
David Delhorbe
Webmapping & SIG OpenSource
Département de Seine-Saint-Denis
ddelhorbe@ cg93.fr
Hors ligne
#7 Wed 13 February 2008 22:47
Re: Liste coordonnées Oracle Locator 9g
Pour identifier les sous-polygone des multipolygones, je regarde
simplement, si dans la liste des coordonnées d'un même objet, je
retrouve une autre fois les premières coordonnées X et Y; et je coupe à
ce moment là !
David Delhorbe
Hors ligne
#8 Wed 13 February 2008 22:47
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Liste coordonnées Oracle Locator 9g
Hmmm oui, je me suis posé la question, quid des multipg ?
J'ai chargé une table de multipolygones et ai lancé la requete que je
t'ai envoyée sur cette table.
Je ne peux effectivement pas caractériser le changement de polygone au
sein d'un multi, toutes les coordonnées se suivant.
A mon avis, faudrait regarder soit du coté d'une fonction pouvant
ressortir les eléments constituant un multi (je sais que ca existe sur
la 10), soit choper l'info sur le multipolygone: nombre de rings et
nombre de sommets par ring.
Ainsi, le code pourrait changer d'objet apres lecture des n
coordonnées formant un ring.
Je vais regarder.
Nicolas
Hors ligne
#9 Wed 13 February 2008 22:48
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Liste coordonnées Oracle Locator 9g
alors vertex.X et Y fonctionnent : SQL Error: ORA-00904: "T"."ID" :
identificateur non valide
Effectivement, la commande que j'ai donnée marche sous 10.2, pas 9: le
champ id a ete rajouté entre les deux versions sur l'objet vertex.
Hors ligne
#10 Wed 13 February 2008 22:48
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Liste coordonnées Oracle Locator 9g
A mon avis, faudrait regarder soit du coté d'une fonction pouvant
ressortir les eléments constituant un multi (je sais que ca existe sur
la 10), soit choper l'info sur le multipolygone: nombre de rings et
nombre de sommets par ring.
Ainsi, le code pourrait changer d'objet apres lecture des n
coordonnées formant un ring.
En fait, je pense que le plus simple est d'utiliser les structures
SDO_ELEM_INFO et SDO_ORDINATE (doc ici pour la version 9:
http://download.oracle.com/docs/html/A96630_01/toc.htm)
Elles permettent de connaitre la structure de chaque geometrie et
renvoie un tableau de coordonnées.
En parsant SDO_ELEM_INFO, on a le type de l'objet, le nombre de trous,
les offset des coordonnnées de chaque partie.
En parsant le tableau de coordonnées, on peut construire son objet SVG
en ayant toutes les infos, je pense.
Ca permet de faire un parser complet traitant tous les cas (pg, trous,
multipg, etc.)
Nicolas
Hors ligne
#11 Thu 14 February 2008 08:27
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Liste coordonnées Oracle Locator 9g
Oui, effectivement, mais ca fait faire un test a chaque coordonnée.
Comment tu fais la diff entre un multipolygone et un polygones a trous ?
Hors ligne
#12 Thu 14 February 2008 15:30
Re: Liste coordonnées Oracle Locator 9g
en fait, pour éviter de tester toutes les coordonnées, je ne fait le
test uniquement lorsque le c.CHAMP_GEOM.SDO_GTYPE du polygone est égale
à 2007, ce qui signifie que c'est un mutipolygone. Par ex. sur ma table
de test, sur 40 objets, 36 sont des polygones simples, et 4 sont
multipolygones, donc je fais le test que sur les coordonnées de ces 4
objets.
Je n'ai pas besoin de distinguer un multipolygone d'un donut, car SVG
dessine automatiquement un îlot ou un donut selon que les polygones
suivant le 1er sont dehors ou à l'intérieur du 1er polygone.
David Delhorbe
Webmapping & SIG OpenSource
Département de Seine-Saint-Denis
ddelhorbe@ cg93.fr
Hors ligne