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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 17 May 2023 11:44

nico-29
Participant assidu
Lieu: Brest
Date d'inscription: 2 Jun 2006
Messages: 185

QGIS/PyQGIS: Affecter une reference spatiale a un Dataset

Bonjour,

J'ai un dataset (ds) auquel je veux affecter une référence spatiale :

Code:

srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
srs.SetAxisMappingStrategy(gdal.osr.OAMS_TRADITIONAL_GIS_ORDER)
print(srs)
ds.SetSpatialRef(srs)

Avec l'instruction print, j'ai bien la description du srs:

Code:

GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.0174532925199433,
        AUTHORITY["EPSG","9122"]],
    AXIS["Latitude",NORTH],
    AXIS["Longitude",EAST],
    AUTHORITY["EPSG","4326"]]

Mais quand je lance l'instruction :

Code:

print(ds.GetSpatialRef())

J'ai comme réponse : None

Qu'est ce qui cloche?

Merci, Nico

Hors ligne

 

#2 Wed 17 May 2023 17:53

YoLecomte
Participant assidu
Lieu: Epinal
Date d'inscription: 7 Jul 2015
Messages: 266

Re: QGIS/PyQGIS: Affecter une reference spatiale a un Dataset

Bonjour,
La méthode SetSpatialRef n'existe pas sur le DataSource comme vous semblez être en train de faire.
Il faut que vous alliez chercher la référence à la définition du champ géométrique de votre Layer.

Voici un exemple de code qui devrait faire ce que vous souhaitez si j'ai bien compris votre question (j'ai pris un shapefile pour l'exemple):

Code:

ds = ogr.Open('C:/some/path/to/layer.shp')
layer = ds.GetLayer()
print(layer.GetSpatialRef()) # --> None, if no spatial ref are set for this layer
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)
l_defn = layer.GetLayerDefn()
geom_defn = l_defn.GetGeomFieldDefn(0) # get the definition of the geom field
geom_defn.SetSpatialRef(srs) # apply the srs
print(layer.GetSpatialRef())

Hors ligne

 

#3 Mon 22 May 2023 12:37

nico-29
Participant assidu
Lieu: Brest
Date d'inscription: 2 Jun 2006
Messages: 185

Re: QGIS/PyQGIS: Affecter une reference spatiale a un Dataset

Bonjour,

J'ai un message d'erreur :

Code:

AttributeError: 'NoneType' object has no attribute 'GetSpatialRef' 
Traceback (most recent call last):
  File "C:\Users/ngabar/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\s100\S100.py", line 275, in runS102
    print(layer.GetSpatialRef()) # --> None, if no spatial ref are set for this layer
AttributeError: 'NoneType' object has no attribute 'GetSpatialRef'

Dans mon cas, je ne part pas d'un shapefile, je lit un raster avec GDAL, et si je fais un print(ds), j'ai :

Code:

<osgeo.gdal.Dataset; proxy of <Swig Object of type 'GDALDatasetShadow *' at 0x000002154EB03180> >

Donc pourquoi ds.GetLayer() renvoie None ?

Nico

Hors ligne

 

#4 Mon 22 May 2023 15:38

YoLecomte
Participant assidu
Lieu: Epinal
Date d'inscription: 7 Jul 2015
Messages: 266

Re: QGIS/PyQGIS: Affecter une reference spatiale a un Dataset

Bonjour,

Si vous travaillez sur un raster, votre code semble correct.

Le code que je vous ai proposé concerne un jeu de données vecteur. Comme vous n'aviez pas précisé, j'ai cru que vous étiez sur des vecteurs.

Hors ligne

 

Pied de page des forums

Powered by FluxBB