40 votos

Shapefile PRJ a PostGIS SRID tabla de búsqueda?

Me preguntaba si es que existe tal cosa como un shapefile PRJ a PostGIS SRID tabla de búsqueda? Algo que puede traducir el estándar de la mayoría de shapefile PRJ definiciones en el probable SRID.

Al utilizar PostGIS y pgAdminIII, si utiliza el postgisgui para importar tus archivos de forma, el SRID es la izquierda "-1". Parece que la herramienta debe ser capaz de analizar los Esri PRJ y determinar la correcta (o al menos un par de opciones) que probablemente sean el SRID, en lugar de sólo dejar el valor por defecto.

¿O es que el importador tiene la capacidad para reproyectar sobre la marcha si se elige otro SRID?

Puede parecer perezoso de mi parte, pero a mí me parece curioso que esta función aún no ha sido puesto en su lugar. ¿Alguien sabe si este concepto está en las obras, o una buena razón del por qué se ha quedado fuera?

59voto

Daniel Auger Puntos 8459

GDAL tiene una bonita interfaz cómoda para el PROJ4 de la biblioteca.

Si usted se siente confiado con Python, utilizando el GDAL enlaces Python, si importa la osr clases se tienen muy conveniente métodos para la lectura y la exportación de proyección de representaciones a una variedad de formatos como PROJ4, WKT, Esri .PRJ.

Por ejemplo, este script se encargará de convertir su .PRJ archivo shapefile WKT y PROJ4 (la última se utiliza 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])

Ejecutar esto en la línea de comandos:

$ 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

21voto

Adam Ernst Puntos 6939

Ha sido un tiempo desde que he utilizado POSTGIS srid pero si se acaba de códigos EPSG, a continuación, puede utilizar http://prj2epsg.org/search a buscarlos a partir de (roto) de ESRI.archivos prj.

10voto

hernan43 Puntos 566

Tomando prestada la idea de @iant, aquí es un PL/Python3 módulo que va a buscar la EPSG SRID entero de códigos de un archivo PRJ el uso de la http://prj2epsg.org servicio web.

En primer lugar, instale PL/Python3:

CREATE LANGUAGE plpython3u;

ahora agregue la función SQL, que tiene el 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;

El uso de PostgreSQL:

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

devuelve 4326 para mi prueba Shapefile.

5voto

Rob H Puntos 101

Como una mezcla de las soluciones que he creado un script para que me ayude a cargar archivos de forma arbitraria en postgis. También se intenta detectar la codificación de la 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)

4voto

skiphoppy Puntos 141

srsly. Yo quiero uno también.

Muchas personas parecen buscarlas en http://spatialreference.org

Al importar archivos de forma a partir de PostGIS (y el PostGIS cargador para PGAdmin), busca el proj información en una tabla denominada spatial_ref_sys.

Por lo que entiendo, el estándar de la tabla spatial_ref_sys empaquetado con PostGIS incluye sólo OGC WKT (Open Geospatial Consortium Bien Conocidos de Texto) las representaciones de algunos de los Sistemas de Referencia Espacial y NO la de ESRI sistemas de referencia Espacial.

Desde el PostGIS 1.5.2 documentación: >

La tabla spatial_ref_sys es un PostGIS incluido y soporte OGC tabla de base de datos que cataloga más de 3001 conocido referencia espacial sistemas y detalles necesarios para transformar/reproyectar entre ellos.

Aunque el PostGIS spatial_ref_sys tabla contiene más de 3000 de los más comúnmente utilizados sistema de referencia espacial definiciones que puede ser manejado por el proyecto de la biblioteca, no contiene todos los conocidos por el hombre y puede incluso definir sus propios proyección si usted está familiarizado con proj4 construcciones. Tenga en cuenta que la mayoría de los sistemas de referencia espacial a nivel regional, que no tienen ningún significado cuando se utiliza fuera de los límites que fueron destinados.

Un excelente recurso para la búsqueda de sistemas de referencia espacial que no se definen en el conjunto del núcleo es http://spatialreference.org/ Algunos de los más comúnmente utilizados sistemas de referencia espacial son: 4326 - WGS 84 Long Lat, 4269 - NAD 83 Largo Lat, 3395 - WGS 84 Mundo de Mercator, 2163 - NOS Atlas Nacional de Igualdad de Área, sistemas de referencia Espacial para cada NAD 83, WGS 84 UTM la zona UTM zonas son uno de los más ideal para la medición, pero sólo la cubierta 6-grado de las regiones.

Varios de estado de los EE.UU. plano de sistemas de referencia espacial (metros o pies) - por lo general uno o 2 existe una por cada estado de estados unidos. La mayoría de los metros en el conjunto de la base, pero muchos de los pies de base o de ESRI creados usted tendrá que tirar de spatialreference.org.

Sin embargo ogr2ogr contiene ESRI espacial ref sistemas como recientemente he aprendido a través de la generosidad de los demás.

En tanto ogr2ogr y spatial_ref_sys, parece que el texto contenido en el .proj archivo se compara con una tabla de OGC WKT, que es un texto ligeramente diferente formato de ESRI WKT formato que se encuentra a menudo en una .proj archivo. También, no estoy seguro de cómo PostGIS busca cada SRS, pero las pequeñas diferencias entre ESRI WKT y OGC WKT podría provocar errores en los partidos.

Parece que sería sencillo para adjuntar ESRI espacial ref sistemas para el valor predeterminado de la tabla spatial_ref_sys en PostGIS. Tal vez alguien ya tiene, con algún parche o una secuencia de comandos.

Yo podría estar equivocado, porque he estado corriendo en esto, para los últimos días, y he estado frustrado con la misma cosa. Tal vez alguien más sabe que un gran recurso?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X