Shapefile PRJ a PostGIS SRID tabla de búsqueda?

36

Me preguntaba si existe tal cosa como un PRJ de shapefile para la tabla de búsqueda PostGIS SRID. Algo que puede convertir las definiciones de PRJ de shapefile más estándar en el SRID probable.

Al usar PostGIS y pgAdminIII, si usa postgisgui para importar sus shapefiles, el SRID se deja como "-1". Parece que la herramienta debería poder analizar el PRJ de Esri y determinar el correcto (o al menos un par de opciones) que es el SRID probable, en lugar de dejar el valor predeterminado.

¿O el importador tiene la capacidad de reproyectarse sobre la marcha si elige otro SRID?

Puede parecer perezoso por mi parte, pero a mí me parece curioso que esta función aún no se haya implementado. ¿Alguien sabe si este concepto está en las obras, o hay buenas razones por las que se ha dejado de lado?

    
pregunta RyanDalton 23.03.2011 - 01:14

6 respuestas

9

Tomando prestada la idea de @iant, aquí hay un módulo PL / Python3 que buscará los códigos enteros de EPSG SRID desde un archivo PRJ utilizando el enlace servicio web.

Primero, instala PL / Python3:

CREATE LANGUAGE plpython3u;

ahora agregue la función SQL, que tiene un código escrito para Python 3:

CREATE OR REPLACE FUNCTION prj2epsg(prj_file text) RETURNS integer AS
$BODY$

import json
from urllib.parse import urlencode
from urllib.request import urlopen

with open(prj_file, 'r') as fp:
    prj_txt = fp.read()

query = urlencode({
    'exact': True,
    'error': True,
    'mode': 'wkt',
    'terms': prj_txt})

webres = urlopen('http://prj2epsg.org/search.json', query.encode())
jres = json.loads(webres.read().decode())

return int(jres['codes'][0]['code'])

$BODY$ LANGUAGE plpython3u VOLATILE COST 100;

Para usarlo desde PostgreSQL:

SELECT prj2epsg(E'C:\Temp\countries.prj');

devuelve 4326 para mi Shapefile de prueba.

    
respondido por el Mike T 27.03.2011 - 12:20
54

GDAL tiene una interfaz agradable y conveniente para la biblioteca PROJ4.

Si confía en Python, utilizando los enlaces GDAL Python, si importa las clases osr, tendrá métodos muy convenientes para leer y exportar representaciones de proyección a una variedad de formatos como PROJ4, WKT, Esri .PRJ.

Por ejemplo, este script convertirá su archivo .PRJ de su shapefile a WKT y PROJ4 (el último se usa desde PostGIS):

#! /usr/bin/env python

import sys
from osgeo import osr

def esriprj2standards(shapeprj_path):
   prj_file = open(shapeprj_path, 'r')
   prj_txt = prj_file.read()
   srs = osr.SpatialReference()
   srs.ImportFromESRI([prj_txt])
   print 'Shape prj is: %s' % prj_txt
   print 'WKT is: %s' % srs.ExportToWkt()
   print 'Proj4 is: %s' % srs.ExportToProj4()
   srs.AutoIdentifyEPSG()
   print 'EPSG is: %s' % srs.GetAuthorityCode(None)

esriprj2standards(sys.argv[1])

Ejecuta esto en la línea de comando:

$ python esriprj2standards.py /home/pcorti/data/shapefile/country.prj 
Shape prj is: GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
WKT is: GEOGCS["GCS_WGS_1984",DATUM["WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
Proj4 is: +proj=longlat +datum=WGS84 +no_defs 
EPSG is: 4326
    
respondido por el capooti 23.03.2011 - 09:31
18

Ha pasado un tiempo desde que usé POSTGIS srids pero si son solo códigos EPSG, entonces puedes usar enlace para buscarlos en ( roto) archivos ESRI.prj.

    
respondido por el Ian Turton 23.03.2011 - 16:34
4

Como una combinación de soluciones, he creado un script para ayudarme a cargar shapefiles arbitrarios en postgis. También intenta detectar la codificación del DBF.

from chardet.universaldetector import UniversalDetector
import os.path
import sys
import dbfUtils
import sys
from osgeo import osr
from urllib import urlencode
from urllib2 import urlopen
import json

shp_file = sys.argv[1]
dbf_file = shp_file[0:-4] + '.dbf'
prj_file = shp_file[0:-4] + '.prj'

#Try detecting the SRID, by default we set to 4326 and hope the best
srid=4326
if os.path.isfile(prj_file):
    prj_filef = open(prj_file, 'r')
    prj_txt = prj_filef.read()
    prj_filef.close()
    srs = osr.SpatialReference()
    srs.ImportFromESRI([prj_txt])
    srs.AutoIdentifyEPSG()
    code = srs.GetAuthorityCode(None)
    if code:
        srid= code
    else:
        #Ok, no luck, lets try with the OpenGeo service
        query = urlencode({
            'exact' : True,
            'error' : True,
            'mode' : 'wkt',
            'terms' : prj_txt})
        webres = urlopen('http://prj2epsg.org/search.json', query)
        jres = json.loads(webres.read())
        if jres['codes']:
            srid = int(jres['codes'][0]['code'])

#Try to detect the encoding
dbf = open(dbf_file, 'rb')
db = dbfUtils.dbfreader(dbf)

detector = UniversalDetector()
for row in db:
    detector.feed(str(row))
    if detector.done: break
detector.close()
dbf.close()

encoding = detector.result["encoding"]
if encoding=="ascii":
    encoding="LATIN1"

print "shp2pgsql -s %s -k -i -I -W %s %s.shp public.importing_table" %(srid,encoding,shp_file)
    
respondido por el jatorre 24.04.2011 - 21:55
3

srsly. Yo también quiero uno.

Muchas personas parecen buscarlos en enlace

Cuando importa shapefiles usando PostGIS (y el cargador de PostGIS para PGAdmin), busca la información del proyecto en una tabla llamada spatial_ref_sys.

Por lo que entiendo, la tabla spatial_ref_sys estándar empaquetada con PostGIS incluye solo representaciones de OGC WKT (Open Geospatial Consortium Well Known Text) de algunos sistemas de referencia espacial y NO los sistemas de referencia espacial ESRI.

De la documentación de PostGIS 1.5.2: >

  

La tabla spatial_ref_sys es una tabla de base de datos incluida en PostGIS y compatible con OGC que enumera más de 3001 referencias espaciales conocidas   Sistemas y detalles necesarios para transformar / reproyectar entre ellos.

     

Aunque la tabla spatial_ref_sys de PostGIS contiene más de 3000 de las definiciones de sistemas de referencia espacial más utilizadas   que puede ser manejado por la biblioteca de proyectos, no contiene todo lo conocido por el hombre e incluso puede definir su propia proyección personalizada   Si estás familiarizado con las construcciones de proj4. Tenga en cuenta que la mayoría de los sistemas de referencia espacial son regionales y no tienen significado   cuando se usan fuera de los límites para los que fueron diseñados.

     

Un excelente recurso para encontrar sistemas de referencia espacial no definidos en el conjunto principal es enlace   Algunos de los sistemas de referencia espacial más utilizados son: 4326 - WGS 84 Long Lat, 4269 - NAD 83 Long Lat, 3395 -   WGS 84 World Mercator, 2163 - Sistemas de referencia espacial de Atlas Nacional de EE. UU. Para cada NAD 83, WGS 84 UTM   zona: las zonas UTM son una de las más ideales para la medición, pero solo cubren regiones de 6 grados.

     

Varios sistemas de referencia espacial del plano del estado de EE. UU. (basados en metros o pies): por lo general, existe uno o dos por cada estado de EE. UU. La mayor parte del metro   hay algunos en el conjunto principal, pero muchos de los basados en pies o creados por ESRI que deberá extraer de spatialreference.org.

Sin embargo, ogr2ogr como aprendí recientemente a través de la generosidad de otros.

Tanto en ogr2ogr como en spatial_ref_sys, parece que el texto contenido en el archivo .proj se compara con una tabla de OGC WKT, que es un formato de texto ligeramente diferente del formato ESRI WKT que a menudo se encuentra en un archivo .proj. Además, no estoy seguro de cómo PostGIS busca cada SRS, pero las pequeñas diferencias entre ESRI WKT y OGC WKT pueden dar como resultado coincidencias fallidas.

Parece que sería sencillo adjuntar los sistemas de referencia espacial ESRI a la tabla spatial_ref_sys predeterminada en PostGIS. Tal vez alguien ya lo haya hecho, con algún parche o un script.

Podría estar equivocado, porque me he estado topando con esto durante los últimos días y me he sentido frustrado por lo mismo. Tal vez alguien más sepa un gran recurso?

    
1

Ha pasado un tiempo desde que lo necesité, pero, según recuerdo, enlace además de permitirte buscar, también te da la opción de subir un archivo prj.

Luego, como una de las opciones de salida, le dará la inserción de postgis equivalente para insertar en la tabla spatial_ref_sys.

Para la declaración de inserción que proporciona, sustituyo el srid generado que crea con el EPSG o ESRI. Si obtiene una violación de la clave principal, es probable que ya esté en la tabla.

    
respondido por el LR1234567 27.03.2011 - 04:24

Lea otras preguntas en las etiquetas