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

GEODATA DAYS 2024

#1 Thu 11 September 2014 17:42

vlanher
Participant occasionnel
Date d'inscription: 17 Nov 2010
Messages: 29

[ArcGIS 9.3.1, ArcSDE 9.3] - problème extraction centroïdes Python

Bonjour,

Je suis en train d’automatiser certains géotraitements via Python. J’utilise pour cela les fonctions Python d’ArcGIS 9.3.1.
Dans une partie de mon code, j’essaie de copier une couche d’une géodatabase Enterprise sous ArcSDE 9.1 vers une géodatabase Enterprise sous ArcSDE 9.3. Une fois copiée, la couche est ensuite convertie en centroïdes.
Je travaille en Lambert 93.

Pour cela j’utilise les lignes de codes suivantes :

Code:

indexgrids = gp.CalculateDefaultGridIndex_management(couche_entree)
indexgrid1 = indexgrids.split(";")[0]
grille1_float = float(indexgrid1.replace(",", "."))
grille1 = int(round(grille1_float,0))+1
grille2 = (grille1*3)
grille3 = (grille2*3) 
if gp.exists(couche_copie):
    gp.Delete_management(couche_copie, "FeatureClass")
gp.CopyFeatures_management (couche_entree, couche_copie, DEFAULTS",grille1,grille2,grille3)

Jusque là, tout se passe bien, après un problème avec le calcul de l’index spatial. Il m’a été conseillé de repasser mes valeurs de grilles en entier. En laissant les valeurs en décimales, l’erreur renvoyée était la suivante :

Code:

Underlying DBMS error[Error executing PL/SQL Block db_stgeom_create_index::ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur]

Depuis le passage en entier, tout se passe bien (enfin à peu près !).

La suite du traitement consiste à convertir la couche copiée polygonale en une couche de centroïdes. Mais voilà, de nouveau problème. J’obtiens le résultat suivant :

Code:

Exécution de:FeatureToPoint "chemin/couche_copie" "chemin/couche_centroide" CENTROID
Heure de début: Thu Sep 11 17:00:07 2014
ERROR 000372: La référence spatiale en sortie n'est pas valide. Effectuez la mise à jour nécessaire
Table not registered[couche_centroide]
Underlying DBMS error[Error executing PL/SQL Block db_stgeom_create_index::ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur][couche_centroid]
Echec de l'exécution de (FeatureToPoint).

J’ai revérifié ma couche de départ est bien en Lambert 93.
En base, mes valeurs de grille d’index sont bien en entier.
Au passage je me retrouve avec mon erreur d’avant :

Code:

Underlying DBMS error[Error executing PL/SQL Block db_stgeom_create_index::ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur][couche_centroid]

Si quelqu’un à une idée, je suis preneur (même juste une piste).
Pour info, toute mon infrastructure est en version 9.3.

EDIT : J'ai bien regardé le message d'erreur également et ça sent encore le recalcul d'index spatial qui ne fonctionne pas!
EDIT2: J'ai publié ici aussi : http://www.forumsig.org/showthread.php/ … des-Python

Merci d’avance.

Vincent

Dernière modification par vlanher (Fri 12 September 2014 10:19)

Hors ligne

 

#2 Wed 24 September 2014 17:33

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

Re: [ArcGIS 9.3.1, ArcSDE 9.3] - problème extraction centroïdes Python

Bonjour,

La géométrie est stockée dans quel format dans ArcSDE (ST_GEOMETRY, SDO_GEOMETRY, ...) ?

Je me souviens d'un problème de ce genre avec les couches de points (NIM049372) si les géométries étaient stockées en ST_GEOMETRY.
Ce problème était résolu en installant le SP1 de la version 9.3.1.

A+

Franck

Hors ligne

 

#3 Thu 25 September 2014 15:04

vlanher
Participant occasionnel
Date d'inscription: 17 Nov 2010
Messages: 29

Re: [ArcGIS 9.3.1, ArcSDE 9.3] - problème extraction centroïdes Python

Bonjour,

je vous remercie pour la réponse, je vais creuser ma problématique dans ce sens.

La géométrie de la GDB source ArcSDE 9.1 est en SDE_BINARY, celle d'arrivée en ArcSDE 9.3 en ST_GEOMETRY.
N'ayant pas la main sur l'installation d'ArcSDE, je vais me renseigner par curiosité.

En attendant j'ai contourné le problème en extrayant la donnée de la base en ArcSDE 9.1 en local (shp), en faisant mon traitement et en remontant ma donnée dans la GDB sous ArcSDE 9.3.
Pour autant, mon erreur apparaît toujours pour la suite de mes traitements mais n'est pas bloquante, la donnée est produite.

Je vous tiendrais au courant de l'avancement.

A+

Vincent

Hors ligne

 

#4 Fri 26 September 2014 10:58

vlanher
Participant occasionnel
Date d'inscription: 17 Nov 2010
Messages: 29

Re: [ArcGIS 9.3.1, ArcSDE 9.3] - problème extraction centroïdes Python

Bonjour,

je suis toujours en train d'investiguer pour mon problème. En attendant, j'ai trouvé une solution de contournement qui me trottait depuis quelques temps dans la tête.

Au lieu d'utiliser les fonctions arcgis, j'utilise les commandes ArcSDE suivantes pour extraire ma donnée en local :

Code:

sde2shp -o append -l <table,column>
[-V <version_name>]
-f <shape_file> -t <file_type>
[-a {all | file=<file_name>}]
[-w <"where_clause">] [-i <service>] [-s <server_name>]
[-D <database>] -u <DB_User_name> [-p <DB_User_password>]

Code:

shp2sde -o create -l <table,column> -f <shape_file> [-I]
          [Spatial_Index] [{-R <SRID> | [Spatial_Ref_Opts]}]
          [-S <layer_description_str>] [-v] [-L {ON | OFF}] [-P {32 | 64}]
          [-e <entity_mask>] [-k <config_keyword>] [-M <minimum_ID>]
          [-a {none | all | file=<file_name>}] [-r <reject_shpfile>]
          [-V <version_name>] [-C <row_id_column>[,{SDE | USER},<min_ID>]]
          [-c <commit_interval>] [-i <service>] [-s <server_name>]
          [-D <database>] -u <DB_User_name> [-p <DB_User_password>]

Voici le lien en 9.1 pour les explications, le 9.3 est en pdf, mais pas de gros changements:
http://edndoc.esri.com/arcsde/9.1/

J'ai donc créé 2 fonctions dans un script à part + un fichier avec mes variables de connexion, que j'appelle par la suite pour mes traitements.

Cela donne qqch de la sorte pour extraire ma couche :

Code:

import ZZ_commandes_ArcSDE
...
couche_entree = "ma_couche"
couche_sortie = workdir + "\\ma_couche.shp"
chemin_export = "chemin vers ma table de corresp pour l'export"

#Je définis le type de géométrie 'shapefile_type' de ma donnée pour la fonction
geom_type = """SELECT GEOMETRY_TYPE FROM SDE.GEOMETRY_COLUMNS
WHERE F_TABLE_NAME = 'ma_couche'
AND G_TABLE_SCHEMA = '%(schema)s'
"""%vars()
connex.execute(geom_type)
for geom in connex.fetchall():
    print geom[0]
    if geom[0] == 1:
        shapefile_type = "point"
    if geom[0] == 9:
        shapefile_type = "arc"
    if geom[0] == 11:
        shapefile_type = "polygon"

try:
    if gp.exists(couche_sortie):
        gp.Delete_management(couche_sortie) ZZ_commandes_ArcSDE.sde2shp_couche(couche_entree,couche_sortie,shapefile_type,chemin_export,service,serveur,user,pswd)
except:
    sys.exit()

Une fois exportée, je fais mes traitements en local et je remonte tout mon petit monde dans la base via ça (au passage je recalcule mes index spatiaux) :

Code:

couche_entree = workdir + "ma_couche_centroide.shp"
chemin_import = "chemin vers ma table de corresp pour l'import"
outname =  "ma couche en base"
# Type de donnée en entrée
shapefile_out = "npc"

try:
    if gp.exists(couche_sortie):
        gp.Delete_management(couche_sortie, "FeatureClass")
    ZZ_commandes_ArcSDE.shp2sde_couche(outname,couche_entree,shapefile_out,chemin_import,service,serveur,user,pswd)
    ZZ_commandes_ArcSDE.F_construction_index(outname,service,serveur,user,pswd)
except:
    sys.exit()

Au final, c'est un peu à l'arrache pour le moment, mais ça marche et magie je n'ai plus d'erreur qui vient s'afficher!

Je vous tiens au courant pour le SP1 dès que j'ai des nouvelles.

Vincent

Hors ligne

 

#5 Fri 16 January 2015 12:07

vlanher
Participant occasionnel
Date d'inscription: 17 Nov 2010
Messages: 29

Re: [ArcGIS 9.3.1, ArcSDE 9.3] - problème extraction centroïdes Python

Bonjour,

je reviens vers vous pour remonter ce que je pense être ma solution. Pour rappel, je travaille avec une GDB ArcSDE Enterprise sur laquelle j'obtenais l'erreur suivante lors de certains géotraitements:

Code:

ERROR 000372: La référence spatiale en sortie n'est pas valide. Effectuez la mise à jour nécessaire
Table not registered[couche_centroide]

Je vous avouerais que je suis tombé dessus un peu par hasard, mais après plusieurs tests sur différents scripts, ça a l'air de fonctionner.
Voici un peu de lecture pour les plus curieux (en anglais désolé!! La chose est disponible en français pour ArcGis 10 dans le dernier lien):

http://webhelp.esri.com/arcgisdesktop/9 … e_settings
http://webhelp.esri.com/arcgisdesktop/9 … %2C_2%2C_3
http://resources.arcgis.com/fr/help/mai … 0019000000

De ce que j'ai compris, une GDB ArcSDE nécessite un paramétrage des grilles d'index spatial en sortie, paramétrables dans les variables d'environnement.

En python, cela se traduit de la manière suivante :

Code:

gp.SpatialGrid1 = val1
gp.SpatialGrid2 = val2
gp.SpatialGrid3 = val3

Seule la première valeur de grille, la plus petite, peut être paramétrée.

Une question reste cependant en suspens : Comment déterminer une ou plusieurs valeurs de grilles d'index spatial en sortie sans connaître au préalable justement la sortie générée ?

A+

Vincent

PS: J'ai posté la réponse également sur forumsig: http://www.forumsig.org/showthread.php/ … des-Python

Dernière modification par vlanher (Fri 16 January 2015 13:54)

Hors ligne

 

Pied de page des forums

Powered by FluxBB