#1 Mon 02 July 2012 11:52
- Benjamin L
- Juste Inscrit !
- Date d'inscription: 2 Jul 2012
- Messages: 5
[Gdal/Ogr] Changer de format et de SpatialReference
[RESOLU]
Bonjour,
J'écris actuellement du code Ogr destiné à prendre un fichier S57 en entrée et à en faire un fichier SQLite en sortie avec les mêmes tables, et champs (layer/Field) mais dans un autre système de référence.
J'écris en C#, mais le code reste relativement proche du code C++ (du moins compréhensible par quelqu'un qui comprendrai le code C++).
Après plusieurs essais j'arrive à un programme qui crée effectivement mon fichier SQLite mais les champs sont nuls (autres que géométrie).
Si quelqu'un à qui le code parle passe par là et pourrai me débloquer ou du moins me donner quelques pistes où fouiller j'en serai ravis.
Voici le code qui copie un Layer dans ma nouvelle DataSource :
Code:
// layer: le layer à copier, //destDs: la DataSource qui devra contenir le nouveau layer, //destSrs: la SpatialReference de ma nouvelle DataSource. private static void InsertLayer(Layer layer, DataSource destDs, SpatialReference destSrs) { // Création du nouveau Layer Layer destLayer = destDs.CreateLayer(layer.GetName(), destSrs, layer.GetGeomType(), null); if (destLayer == null) Trace.WriteLine("error CreateLayer"); Feature tmpFeature = layer.GetNextFeature(); if (tmpFeature == null) Trace.WriteLine("error no Feature"); // Création des champs existants dans le nouveau Layer for (int i = 0; i < tmpFeature.GetFieldCount(); i++) if (destLayer.CreateField(tmpFeature.GetFieldDefnRef(i), 0) != Ogr.OGRERR_NONE) Trace.WriteLine("error"); // Copie de chaque feature du layer à copier while (tmpFeature != null) { Feature newFeature = new Feature(destLayer.GetLayerDefn()); newFeature.SetFrom(tmpFeature, 0); newFeature.SetFID(tmpFeature.GetFID()); // On change la géométrie de la nouvelle feature (en rapport avec la SpatialRefercence) Geometry destGeometry = newFeature.GetGeometryRef(); if (destGeometry != null) if (destGeometry.TransformTo(destSrs) != Ogr.OGRERR_NONE) Trace.WriteLine("error TransformTo"); if (destLayer.SetFeature(newFeature) != Ogr.OGRERR_NONE) Trace.WriteLine("error SetFeature"); } tmpFeature = layer.GetNextFeature(); }
edit : Sinon je vais fouiller les option de ogr2ogr si on peut faire de la conversion ET de la re-projection (Proj4) en même temps ..
Merci d'avance.
Cordialement,
Benjamin.
Dernière modification par Benjamin L (Mon 02 July 2012 15:18)
Hors ligne
#2 Mon 02 July 2012 14:16
- rouault
- Participant assidu
- Date d'inscription: 26 Apr 2009
- Messages: 168
Re: [Gdal/Ogr] Changer de format et de SpatialReference
Tu peux utiliser la commande suivante pour convertir et reprojeter en une seule opération : ogr2ogr -f sqlite ton.sqlite ton_s57 -t_srs srs_cible
Sinon, quant à ton code, comme il s'agit de créer de nouveau feature, utilise CreateFeature() à la place de SetFeature() (en terme de SQL, CreateFeature() ~= INSERT et SetFeature() ~= UPDATE). Tu peux avoir besoin d'enlever la ligne newFeature.SetFID() (ça dépendra du driver).
Et une étourderie : le tmpFeature = layer.GetNextFeature(); doit être à l'intérieur de la boucle, sinon tu ne convertiras qu'un feature
Hors ligne
#3 Mon 02 July 2012 15:16
- Benjamin L
- Juste Inscrit !
- Date d'inscription: 2 Jul 2012
- Messages: 5
Re: [Gdal/Ogr] Changer de format et de SpatialReference
Tout d'abord, merci pour ta réponse rapide.
Je viens d'utiliser CreateFeature() (à la place de SetFeature) et ça marche.
Merci pour la correction donc !
Sinon pour le SetFID, dans le doute je préfère le laisser, en terme de cout ce n'est pas énorme.
Et pour le GetNextFeature, c'est une étourderie de recopie (de mon code vers ce post), quand j'ai voulut le clarifier une accolade à sautée.
Sur ce, bonne continuation.
Hors ligne
#4 Tue 03 July 2012 10:06
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [Gdal/Ogr] Changer de format et de SpatialReference
Bonjour,
Je souhaiterais un éclaircissement lié à cette manipulation. J'ai testé plus "brutalement" cette commande
ogr2ogr -f sqlite ambase.sqlite XXXXX.000 -dsco SPATIALITE=yes -dsco METADATA=yes -lco SPATIAL_INDEX
et il me manque des éléments indispensables pour certains objets, notamment les soundg, il manque le Z (élévation)!
Comment les récupérer et avez-vous réussi à les récupérer?
D'avance merci
Hors ligne
#5 Tue 03 July 2012 15:56
- rouault
- Participant assidu
- Date d'inscription: 26 Apr 2009
- Messages: 168
Re: [Gdal/Ogr] Changer de format et de SpatialReference
Je ne suis pas un expert S57, aussi recommanderai-je de lire attentivement la documentation du driver : http://gdal.org/ogr/drv_s57.html . J'y vois des mentions à SOUNDG
Hors ligne
#6 Tue 03 July 2012 18:24
- Benjamin L
- Juste Inscrit !
- Date d'inscription: 2 Jul 2012
- Messages: 5
Re: [Gdal/Ogr] Changer de format et de SpatialReference
Je suis très loin d'être expert dans ce domaine , mais il me semble que l'altitude des SOUNDG est situé dans la géométrie (champ GEOMETRY). Ce sont des points 3D.
D'ailleurs c'est ce que semble confirmer le document web cité par Rouault :
Soundings
Depth soundings are handled somewhat specially in S-57 format, in order to efficiently represent the many available data points. In S-57 one sounding feature can have many sounding points. The S-57 reader splits each of these out into it's own feature type `SOUNDG' feature with an s57_type of `s57_point3d'. All the soundings from a single feature record will have the same AGEN, FIDN, FIDS and LNAM value.
Dernière modification par Benjamin L (Tue 03 July 2012 18:25)
Hors ligne
#7 Wed 04 July 2012 08:12
- Ted
- Participant assidu
- Date d'inscription: 16 Jan 2007
- Messages: 181
Re: [Gdal/Ogr] Changer de format et de SpatialReference
Bonjour,
J'avais bien compris le problème! J'ai passé les variables suivantes :
set ogr_s57_options = "ADD_SOUNDG_DEPTH=ON, SPLIT_MULTIPOINT=ON, LNAM_REFS=ON, RETURN_PRIMITIVES=ON"
Je contrôle dans spatialite, et je vois que mes soundg sont bien Multipoint, 3d, mais impossible d'accèder à la valeur de la profondeur, quand je regarde dans le BLOB, il n'est fait référence qu'aux coordonnées X,Y?
COmment faire pour récupérer cette information, j'ai d'autres solutions, mais elles m'intéressent moins, car elles nécessitent plusieurs étapes!
D'avance merci
Hors ligne