web-dev-qa-db-fra.com

Comment savez-vous quel SRID utiliser pour un fichier shp?

J'essaie de mettre un fichier SHP dans ma base de données PostGIS, les données sont juste un peu décalées. Je pense que c'est parce que j'utilise le mauvais SRID. Le contenu du fichier PRJ est le suivant:

GEOGCS["GCS_North_American_1983",
DATUM["D_North_American_1983",
SPHEROID["GRS_1980",6378137.0,298.257222101]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]

À quel SRID cela correspond-il? Et plus généralement, comment puis-je rechercher le SRID en fonction des informations trouvées dans le fichier PRJ? Y a-t-il une table de recherche quelque part qui répertorie tous les SRID et leurs équivalents "géogcs"?

Les données importées à l'aide de srid=4269 et 4326 étaient exactement les mêmes résultats.

Est-ce à dire que j'utilise le mauvais SRID, ou s'agit-il simplement d'une marge d'erreur attendue?

Le fichier shp provient de ici .

34
priestc

Pour développer la réponse de synecdoche , le SRID est parfois appelé code "EPSG". Le code SRID/EPSG est un raccourci de facto pour les représentations de textes bien connus des projections.

Vous pouvez faire une recherche rapide sur la table SRID pour voir si vous pouvez trouver une correspondance exacte ou similaire:
SELECT srid, srtext, proj4text FROM spatial_ref_sys WHERE srtext ILIKE '%BLAH%'

Ci-dessus a été trouvé à http://www.bostongis.com/?content_name=postgis_tut01 .

Vous pouvez également rechercher sur spatialreference.org pour ce genre de choses. L'outil de recherche est primitif, vous devrez peut-être utiliser une recherche Google et spécifier le site, mais tous les résultats vous montreront le contenu ESRI PRJ, le PostGIS SQL INSERT et un tas d'autres représentations.

Je pense que votre PRJ est à: http://spatialreference.org/ref/sr-org/15/

23
James Schek

Prj2EPSG est un petit site Web visant exactement ce problème; collez le contenu PRJ et il fait de son mieux pour trouver un EPSG correspondant. Ils ont également un API de service Web . Ce n'est pas une science exacte. Ils semblent utiliser Lucene et la base de données EPSG pour faire des recherches de texte pour les correspondances.

20
Nelson

Les données semblent être NAD83, qui a un SRID de 4269. Votre base de données PostGIS a un spatial_ref_sys table qui est la table de recherche SRID.

Si les données sont identiques avec un SRID de 4269 (NAD83) et 4326 (WGS84), alors quelque chose ne va pas.

11
synecdoche

Allez télécharger les tilitaires GDAL , les utilitaires ogrinfo (qui cracheraient les informations de projection) et ogr2ogr sont inestimables.

James a déjà donné un lien vers spatialreference.org . Cela aide à trouver des informations de référence spatiale ... Je suppose que vous avez chargé le spatial_ref_sys.sql lorsque vous préparez votre instance postgis .

Et pour être honnête, je ne pense pas que le problème soit du côté PostGIS.

Je conserve généralement mes données dans différents SRID dans mes dbs PostGIS. Cependant, j'ai toujours besoin de projeter sur la sortie SRS . Vous montrez des tuiles pré-rendues OpenStreetMap, et je parie qu'elles ont été dessinées en utilisant SRID 900913 ( la projection mercator modifiée de Google Map que tout le monde utilise maintenant pour render).

Ma recommandation est la suivante:

1- Définissez la bonne projection dans le code OpenLayers qui correspond à toutes les tuiles que vous lisez.

2.- Conservez les données dans la base de données dans le SRID que vous voulez (tant que c'est correct bien sûr).

3.- Assurez-vous que le serveur que vous utilisez pour générer les images à partir de vos données (ArcGIS Server, Mapserver, GeoServer ou quoi que ce soit) est re-projeté vers ce même SRS.

Tout ira bien.

À votre santé

7
rburhum

Utilisez l'OSR Python de GDAL pour déterminer le code:

from osgeo import osr

srsWkt = '''GEOGCS["GCS_North_American_1983",
DATUM["D_North_American_1983",
SPHEROID["GRS_1980",6378137.0,298.257222101]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]'''

# Load in the projection WKT
sr = osr.SpatialReference(srsWkt)

# Try to determine the EPSG/SRID code
res = sr.AutoIdentifyEPSG()
if res == 0: # success
    print('SRID=' + sr.GetAuthorityCode(None))
    # SRID=4269
else:
    print('Could not determine SRID')
6
Mike T

N'oubliez pas de jeter un œil à: http://www.epsg-registry.org/

Utilisez l'option Query by Filter et saisissez: North American Datum 1983.

Cela donne -> EPSG: 6269.

J'espère que cela fonctionne pour toi.

1
Doug