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 Thu 06 March 2014 09:51

sigdu80
Participant actif
Date d'inscription: 2 Sep 2010
Messages: 112

Contenu d'un fichier PRJ

Bonjour à tous,

je poste certainement dans la mauvaise rubrique, mais je n'ai pas trouvé la rubrique adéquate.
je voudrai savoir s'il existait un descriptif assez complet du contenu d'un fichier prj, ou du moins le contenu minimum avec explications de chaque paramètres.

En fait, je veux essayer d'analyser au max le fichier prj d'un shapefile afin de réussir à détecter au maximum la projection.
Si je n'y arrive pas, l'utilisateur devra la préciser car j'ai bien saisi qu'il ne serait pas possible à 100% de le faire informatiquement.


Le paramètre PROJCS permet d'en détecter mais après quand on a du _MI_0 par ex., ...




Merci d'avance.

Dernière modification par sigdu80 (Thu 06 March 2014 09:59)

Hors ligne

 

#2 Thu 06 March 2014 10:20

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

Re: Contenu d'un fichier PRJ

Bonjour,

Non aucun descriptif n'existe : proj et ESRI ArcGIS ont d'ailleurs deux approches différentes d'où les problèmes de compatibilité.

Il y a eut une tentative (tentative car je n'ai pas suivi l'évolution) de faire un mapping entre les deux façons de faire.

Y.


Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !!  - GeoRezo vous aide ? Aidez GeoRezo !

Hors ligne

 

#3 Thu 06 March 2014 10:27

sigdu80
Participant actif
Date d'inscription: 2 Sep 2010
Messages: 112

Re: Contenu d'un fichier PRJ

Bonjour Yves et merci,

Cela ne m'étonne pas beaucoup ce manque de standardisation, dommage.
Via le paramètre PROJCS et ses expressions règulières, c'est facile à détecter, mais pour le reste, c'est compliqué à ce que tu me dis.
MapInfo a des particularités aussi dans ces prj non ?

En plus, pour un utilisateur, de savoir si c'est du L93, c'est déjà pas mal, mais de savoir si c'est du EPSG2154 ou du EPSG102110, c'est trop demandé.

Dernière modification par sigdu80 (Thu 06 March 2014 10:27)

Hors ligne

 

#4 Fri 07 March 2014 10:52

sigdu80
Participant actif
Date d'inscription: 2 Sep 2010
Messages: 112

Re: Contenu d'un fichier PRJ

Bonjour,

[img]http://imageshack.com/a/img585/4360/zyng.jpg[/img]

il y a une ligne par fichier prj.
sous la ligne en surbrillance, il y a des fichiers dont le EPSG est plus compliqué à deviner.
Est-ce qu'en voyant les paramètres (standard parallel1&2, latitud of origin, central meridian, false easting, false northing), je peux a minima en conclure que c'est une projection L93 (après détecter l'EPSG exact, cela me paraît super compliqué) ?


Si j'ai oublié des précisions, n'hésitez pas à le dire, l'important est d'en discuter.


Merci d'avance.

Dernière modification par sigdu80 (Fri 07 March 2014 12:28)

Hors ligne

 

#5 Fri 07 March 2014 14:10

dominique.lys
Participant assidu
Date d'inscription: 5 Oct 2006
Messages: 473
Site web

Re: Contenu d'un fichier PRJ

sigdu80 a écrit:

Est-ce qu'en voyant les paramètres (standard parallel1&2, latitud of origin, central meridian, false easting, false northing), je peux a minima en conclure que c'est une projection L93 (après détecter l'EPSG exact, cela me paraît super compliqué) ?


oui, j'ai eu l'occasion de travailler sur un script pour la migration de shapefiles en lambert 2 étendu vers lambert 93, le programme devait donc s'assurer au travers du prj que la projection en entrée était bien du lambert 2 étendu. Les cas difficiles étaient résolus en contrôlant l'origine des coordonnées projetés (false easting et northing) et la latitude d'origine.

Attention au standard parallel car les projections coniques peuvent s'écrire de deux façon : sécante ou tangente. En sécante il y a 2 parallèles standards en tangente il n'y en a qu'un plus un facteur de réduction du cône.

Par exemple pour le Lambert 2, la sécante +lat_1=45.8989 +lat_2=47.6960 équivaut à la tangente  +lat_1=46.8 +k_0=0.99987742

Attention aussi aux valeurs angulaires qui sont parfois indiquées en grades, 46.8° devient par exemple 52gd

Le script est en Python je peux en diffuser un bout si intéressé.

Dernière modification par dominique.lys (Fri 07 March 2014 14:14)

Hors ligne

 

#6 Fri 07 March 2014 15:38

sigdu80
Participant actif
Date d'inscription: 2 Sep 2010
Messages: 112

Re: Contenu d'un fichier PRJ

Bonjour Dominique,

c'est parfait car tu vas bien plus loin que j'aurai pu l'imaginer moi-même (l'ex. avec la sécante, les degrés/grades).
Cela fait un moment que je n'ai pas fait du python mais je devrai réussir à le comprendre en y passant du temps.
Çà m'intéresse beaucoup.

Merci d'avance Dominique.

Hors ligne

 

#7 Fri 07 March 2014 17:07

dominique.lys
Participant assidu
Date d'inscription: 5 Oct 2006
Messages: 473
Site web

Re: Contenu d'un fichier PRJ

Voilà mon bout de code, la méthode n'est pas très élégante mais bon ça m'avait fait l'affaire

Code:

from osgeo import osr

#Dictionnaires python décrivant des projections de référence

Lambert2E={
"Name":"Lambert 2 étendu",
"Datum":"NTF",
"Spheroid":"Clarke1880",#+ellps=clrk80
"Sph_SemiMajor":6378249.2,#+a
"Sph_SemiMinor":6356515,#+b
"Sph_Inverse_Flat":293.466,#+rf
"Sph_Prime_Meridian":2.337229167,#Paris, +pm
"Sph_Angular_Unit_Name":"Degree",
"Sph_Angular_Unit_Scale":0.0174532925199433,
"Projection":"Lambert_Conformal_Conic",#+proj=lcc
"Prj_False_Easting":600000,#+x_0
"Prj_False_Northing":2200000,#+y_0
"Prj_Central_Meridian":0,#+long_0
"Prj_Standard_Parallel_1":45.8989188889,#+lat_1
"Prj_Standard_Parallel_2":47.6960144444,#+lat_2
"Prj_Latitude_Of_Origin":46.8,#+lat_0
"Prj_Scale_Factor":1,#+k_0
"Prj_Unit_Name":"Meter",#+units
"Prj_Unit_Scale":1#+units
}

Lambert93={
"Name":"RGF93_Lambert_93",
"Datum":"RGF93",
"Spheroid":"GRS_1980",
"Sph_SemiMajor":6378137.0,
"Sph_SemiMinor":6356752.31414,
"Sph_Inverse_Flat":298.257222101,
"Sph_Prime_Meridian":0,#Greenwitch
"Sph_Angular_Unit_Name":"Degree",
"Sph_Angular_Unit_Scale":0.0174532925199433,
"Projection":"Lambert_Conformal_Conic",
"Prj_False_Easting":700000,
"Prj_False_Northing":6600000,
"Prj_Central_Meridian":3,
"Prj_Standard_Parallel_1":44,
"Prj_Standard_Parallel_2":49,
"Prj_Latitude_Of_Origin":46.5,
"Prj_Scale_Factor":1,
"Prj_Unit_Name":"Meter",
"Prj_Unit_Scale":1
}

#fonction la + intéressante, parse à l'aide d'osr le fichier prj et retourne un dictionnaire formaté comme ci-dessus
def parsePrj(projWKT):
    srs = osr.SpatialReference(projWKT)
    proj={}
    proj["Name"]=srs.GetAttrValue("PROJCS")
    proj["Datum"]=srs.GetAttrValue("DATUM")
    proj["Spheroid"]=srs.GetAttrValue("SPHEROID")
    proj["Sph_SemiMajor"]=srs.GetSemiMajor()#srs.GetAttrValue("SPHEROID", 1)
    proj["Sph_SemiMinor"]=srs.GetSemiMinor()
    proj["Sph_Inverse_Flat"]=float(srs.GetAttrValue("SPHEROID", 2))
    proj["Sph_Prime_Meridian"]=float(srs.GetAttrValue("PRIMEM",1))
    proj["Sph_Angular_Unit_Name"]=srs.GetAttrValue("GEOGCS|UNIT")
    proj["Sph_Angular_Unit_Scale"]=srs.GetAngularUnits()
    proj["Projection"]=srs.GetAttrValue("PROJECTION")
    proj["Prj_False_Easting"]=srs.GetProjParm("false_easting")
    proj["Prj_False_Northing"]=srs.GetProjParm("false_northing")
    proj["Prj_Central_Meridian"]=srs.GetProjParm("central_meridian")
    proj["Prj_Standard_Parallel_1"]=srs.GetProjParm("standard_parallel_1")
    proj["Prj_Standard_Parallel_2"]=srs.GetProjParm("standard_parallel_2")
    proj["Prj_Latitude_Of_Origin"]=srs.GetProjParm("latitude_of_origin")
    proj["Prj_Scale_Factor"]=srs.GetProjParm("Scale_Factor")
    proj["Prj_Unit_Name"]=srs.GetLinearUnitsName()
    proj["Prj_Unit_Scale"]=srs.GetLinearUnits()
    return proj

#comparer quelques paramètres pr déterminer si proj1 == proj2
def compareProjSys(proj1, proj2):
    return proj1["Prj_False_Easting"] == proj2["Prj_False_Easting"] and proj1["Prj_False_Northing"] == proj2["Prj_False_Northing"]

#fonction principale pour déterminer la projection
#l'objectif ici était surtout de déterminer si c'est du lambert 2e
#les autres projections n'étant pas traité par la suite script, il n'était pas nécessaire de les déterminer précisément
def estimateProjSys(prjFile):
    lb2eNameVariantes=["NTF_Lambert_II_étendu", "NTF_Lambert_II_Carto", "Lambert II Carto", "NTF_France_II_degrees"]#trouvé empiriquement
    try:
        prjFile=open(prj,"r")
        projWKT=prjFile.read()
        prjFile.close()
    except:
        return "prj err"
    for variante in lb2eNameVariantes:
        if variante in projWKT:
            return "NTF Lb2e"
    #on check si c'est pas autre chose que du NTF
    if "RGF" in projWKT:
        return "RGF93"#n'importe quel system basé sur RGF93...
    elif "WGS" in projWKT:
        return "WGS84"
    else:#Pas de nom de projection ou nom de datum pour nous aiguiller, on parse le fichier pour ensuite comparer certain paramètres
        unknowProj=parsePrj(projWKT)
        if compareProjSys(Lambert2E, unknowProj):
            return "NTF Lb2e (checked)"
        elif "NTF" in projWKT:
            return "NTF unknow"
        elif compareProjSys(Lambert93, unknowProj):
            return "RGF93 (checked)"
        else:
            return "Other"

En espérant que ça puisse te servir.

Dernière modification par dominique.lys (Fri 07 March 2014 17:08)

Hors ligne

 

#8 Fri 14 March 2014 11:09

sigdu80
Participant actif
Date d'inscription: 2 Sep 2010
Messages: 112

Re: Contenu d'un fichier PRJ

Bonjour Dominique,

merci beaucoup pour ce code. C'est assez compréhensible rapidement.
Dès que je peux, je le regarderai plus en détail et ferait un retour en discuter.


Merci encore, bonne journée.

Hors ligne

 

Pied de page des forums

Powered by FluxBB