PostGIS SRID 조회 테이블에 쉐이프 파일 PRJ?


38

PostGIS SRID 조회 테이블에 shapefile PRJ와 같은 것이 있는지 궁금합니다. 가장 표준적인 shapefile PRJ 정의를 가능한 SRID로 변환 할 수있는 것.

PostGIS 및 pgAdminIII를 사용할 때 postgisgui를 사용하여 모양 파일을 가져 오는 경우 SRID는 "-1"로 유지됩니다. 이 도구는 Esri PRJ를 구문 분석하고 기본값을 그대로두기보다는 SRID 일 가능성이있는 올바른 (또는 적어도 몇 가지 옵션)를 결정할 수 있어야합니다.

또는 다른 SRID를 선택하면 가져 오기 기능이 즉석에서 재 투영 할 수 있습니까?

그것은 나에게 게으른 것처럼 보일지 모르지만 나 에게이 기능이 아직 적용되지 않았다는 것이 궁금합니다. 이 개념이 작동 중인지 또는 그 이유가 없는지 아는 사람이 있습니까?

답변:


9

@iant의 아이디어를 차용 한 다음은 http://prj2epsg.org 웹 서비스를 사용하여 PRJ 파일에서 EPSG SRID 정수 코드를 찾는 PL / Python3 모듈입니다 .

먼저 PL / Python3을 설치하십시오 :

CREATE LANGUAGE plpython3u;

이제 파이썬 3 용으로 작성된 코드가있는 SQL 함수를 추가하십시오.

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;

PostgreSQL에서 사용하려면 :

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

테스트 Shapefile에 대해 4326을 반환합니다.


나는 이것을 해결책으로 표시 할 것입니다. 다른 사람들은 모두 훌륭하지만이 아이디어를 좋아합니다. 이제 코딩 기능이있는 사람이이 기능을 pgAdmin PostGIS shapefile 로더에 포함시켜 SHP를 읽을 때 올바른 SRID를 자동으로 결정할 수있게합니다. 나는 손가락을 계속 교차시킬 것이다.
RyanDalton

1
물론 인터넷 연결이 필요하며 작동 및 실행이 필요한 외부 웹 서비스에 의존한다는 점에주의해야합니다.
Mike T

57

GDAL에는 PROJ4 라이브러리에 대한 편리한 인터페이스가 있습니다.

GDAL Python 바인딩을 사용하여 Python에 확신이있는 경우 osr 클래스를 가져 오면 프로젝션 표현을 읽고 PROJ4, WKT, Esri .PRJ와 같은 다양한 형식으로 내보내는 매우 편리한 방법이 있습니다.

예를 들어이 스크립트는 shapefile의 .PRJ 파일을 WKT 및 PROJ4로 변환합니다 (마지막은 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])

명령 행에서 이것을 실행하십시오 :

$ 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

나는이 문제에이 방법을 건너 온 : (1) +proj=longlat +datum=WGS84 +no_defs에없는 spatial_ref_sys당신이 SRID를 조회 출력을 사용할 수 있도록 테이블; (2) SRID 속성이나 메서드를 찾을 수없는 것 같습니다 (유용한 ImportFromEPSG(SRID)방법이 있지만 다른 방법은 없습니다)
Mike T

4
마술을 할 AutoIdentifyEPSG () 메서드를 호출하여 스크립트를 업데이트했습니다.
capooti

매우 시원합니다. 잘했습니다!
RyanDalton

언제 gdalsrsinfo그리고 ogrinfo당신 을 실패,이 방법입니다!
kontextify 2016 년

srs.GetAuthorityCode(None)닫기 SRID가 식별되지 않은 경우 여전히 없음을 반환 할 수 있습니다.
astrojuanlu

19

POSTGIS srids를 사용한 지 얼마되지 않았지만 EPSG 코드 일 경우 http://prj2epsg.org/search 를 사용 하여 (깨진) ESRI.prj 파일에서 찾을 수 있습니다.


이것은 정말 똑똑한 웹 사이트입니다. API를 살펴보면 절차를 자동화하는 멋진 서버 측 스크립트를 작성할 수 있습니다.
Mike T

4

여러 솔루션을 혼합하여 postgis에 임의의 shapefile을로드하는 데 도움이되는 스크립트를 만들었습니다. 또한 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)

3

srsly. 나도 원해

많은 사람들이 http://spatialreference.org 에서 찾아 보는 것 같습니다

PostGIS (및 PGAdmin 용 PostGIS 로더)를 사용하여 shapefile을 가져 오면 공간 _ref_sys라는 테이블에서 proj 정보를 찾습니다.

내가 이해 한 바에 따르면 PostGIS와 함께 패키지 된 표준 patial_ref_sys 테이블에는 ESRI Spatial 참조 시스템이 아닌 일부 공간 참조 시스템의 OGC WKT (Open Geospatial Consortium Well Known Text) 표현 만 포함됩니다.

PostGIS 1.5.2 문서에서 :>

patial_ref_sys 테이블은 3001 개 이상의 알려진 공간 참조 시스템과 이들 간의 변환 / 재 투영에 필요한 세부 사항을 나열하는 PostGIS 포함 및 OGC 호환 데이터베이스 테이블입니다.

PostGISpatial_ref_sys 테이블에는 proj 라이브러리가 처리 할 수있는 3000 개가 넘는 일반적으로 사용되는 공간 참조 시스템 정의가 포함되어 있지만 proj4 구문에 익숙한 경우 사용자에게 알려진 모든 것을 포함하지 않고 사용자 정의 투영을 정의 할 수도 있습니다. . 대부분의 공간 참조 시스템은 지역적이며 의도 된 범위 밖에서 사용될 때는 아무런 의미가 없습니다.

코어 세트에 정의되지 않은 공간 참조 시스템을 찾기위한 훌륭한 리소스는 http://spatialreference.org/ 입니다. 가장 일반적으로 사용되는 공간 참조 시스템은 다음과 같습니다. 4326-WGS 84 Long Lat, 4269-NAD 83 Long Lat, 3395- WGS 84 World Mercator, 2163-미국 National Atlas Equal Area, 각 NAD 83에 대한 공간 참조 시스템, WGS 84 UTM 영역-UTM 영역은 측정에 가장 적합하지만 6도 지역에만 적용됩니다.

다양한 미국 주 평면 공간 참조 시스템 (미터 또는 피트 기반) – 일반적으로 미국 주당 하나 또는 2 개가 존재합니다. 대부분의 미터는 코어 세트에 있지만 발 기반의 많은 미터 또는 ESRI에서 생성 한 미터는 patialreference.org에서 가져와야합니다.

그러나 ogr2ogr 에는 최근에 다른 사람들의 관대함을 통해 배운 ESRI 공간 참조 시스템이 포함되어 있습니다.

ogr2ogr 및 patial_ref_sys에서 .proj 파일에 포함 된 텍스트는 .proj 파일에서 종종 발견되는 ESRI WKT 형식과 약간 다른 텍스트 형식 인 OGC WKT 테이블과 비교되는 것으로 보입니다. 또한 PostGIS가 각 SRS를 어떻게 조회하는지 잘 모르겠지만 ESRI WKT와 OGC WKT의 작은 차이로 인해 일치하지 않을 수 있습니다.

ESRI 공간 참조 시스템을 PostGIS의 기본 공간 _ref_sys 테이블에 연결하는 것이 간단한 것처럼 보입니다. 누군가가 이미 패치 나 스크립트를 가지고있을 수도 있습니다.

지난 며칠 동안이 문제가 발생하여 같은 문제로 좌절했기 때문에 잘못 될 수 있습니다. 다른 사람이 훌륭한 자원을 알고 있습니까?


1

내가 필요로 한지 오래 되었지만, 검색 할 수있을뿐 아니라 http://spatialreference.org/ 는 prj 파일을 업로드하는 옵션도 제공합니다.

그런 다음 출력 옵션 중 하나가 공간 _ref_sys 테이블에 삽입 할 동등한 postgis 삽입을 제공합니다.

삽입 문장의 경우 생성 된 srid를 EPSG 또는 ESRI로 바꿉니다. 기본 키 위반이 발생하면 이미 테이블에있을 가능성이 높습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.