Shapefile PRJ để bảng tra cứu PostGIS SRID?


38

Tôi đã tự hỏi nếu có một thứ như một PRJ shapefile để bảng tra cứu PostGIS SRID? Một cái gì đó có thể dịch các định nghĩa PRJ shapefile tiêu chuẩn nhất sang SRID có khả năng.

Khi sử dụng PostGIS và pgAdminIII, nếu bạn sử dụng postgisgui để nhập các shapefiles của mình, SRID được để lại là "-1". Có vẻ như công cụ sẽ có thể phân tích cú pháp Esri PRJ và xác định chính xác (hoặc ít nhất một vài tùy chọn) có khả năng là SRID, thay vì chỉ để mặc định.

Hoặc nhà nhập khẩu có khả năng từ chối nhanh chóng nếu bạn chọn một SRID khác?

Về phần tôi có vẻ lười biếng, nhưng đối với tôi có vẻ tò mò rằng chức năng này đã không được áp dụng. Có ai biết nếu khái niệm này là trong các tác phẩm, hoặc lý do chính đáng tại sao nó đã bị bỏ rơi?

Câu trả lời:


9

Mượn ý tưởng từ @iant, đây là mô-đun PL / Python3 sẽ tra cứu mã số nguyên EPSG SRID từ tệp PRJ bằng dịch vụ web http://prj2epsg.org .

Đầu tiên, cài đặt PL / Python3:

CREATE LANGUAGE plpython3u;

bây giờ thêm hàm SQL, có mã được viết cho 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;

Để sử dụng nó từ PostgreSQL:

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

trả về 4326 cho Shapefile thử nghiệm của tôi.


Tôi sẽ đánh dấu đây là giải pháp. Trong khi những người khác đều xuất sắc, tôi thích ý tưởng này. Bây giờ nếu chúng ta có thể nhờ ai đó có khả năng mã hóa để đưa loại chức năng này vào trình tải hình dạng pgAdmin PostGIS để nó tự động xác định SRID chính xác khi đọc SHP. Tôi luôn giữ cho móng tay được ngay ngắn.
RyanDalton

1
Tất nhiên, điều cần chú ý là nó yêu cầu kết nối Internet và phụ thuộc vào dịch vụ web bên ngoài cần hoạt động.
Mike T

57

GDAL có một giao diện thuận tiện đẹp cho thư viện PROJ4.

Nếu bạn tự tin với Python, sử dụng các ràng buộc Python GDAL, nếu bạn nhập các lớp osr, bạn sẽ có các phương thức rất thuận tiện để đọc và xuất các biểu diễn chiếu sang nhiều định dạng như PROJ4, WKT, Esri .PRJ.

Ví dụ: tập lệnh này sẽ chuyển đổi tệp .PRJ của shapefile của bạn thành WKT và PROJ4 (tệp cuối cùng được sử dụng từ 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])

Chạy cái này trên dòng lệnh:

$ 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

Tôi đã gặp hai vấn đề về cách tiếp cận này: (1) +proj=longlat +datum=WGS84 +no_defskhông có trong spatial_ref_sysbảng, vì vậy bạn không thể sử dụng đầu ra để tra cứu SRID; và (2) Tôi dường như không thể tìm thấy bất kỳ thuộc tính hoặc phương thức SRID nào (có một ImportFromEPSG(SRID)phương pháp tiện dụng , nhưng không phải là cách khác)
Mike T

4
Tôi đã cập nhật tập lệnh với một cuộc gọi đến phương thức AutoIdentifyEPSG () sẽ làm nên điều kỳ diệu;)
capooti

Rất tuyệt. Làm tốt lắm
RyanDalton

Khi gdalsrsinfoogrinfothất bại bạn, đây là con đường để đi!
kontextify

Lưu ý rằng srs.GetAuthorityCode(None)vẫn có thể trả về không nếu không xác định SRID gần.
astrojuanlu

19

Đã được một thời gian kể từ khi tôi sử dụng srids POSTGIS nhưng nếu chúng chỉ là mã EPSG thì bạn có thể sử dụng http://prj2epsg.org/search để tìm kiếm chúng từ (các tệp ESRI.prj bị hỏng).


Đây là một trang web thực sự thông minh. Nhìn vào API , bạn có thể viết một tập lệnh phía máy chủ đẹp để tự động hóa thủ tục.
Mike T

4

Như một sự pha trộn của các giải pháp, tôi đã tạo ra một kịch bản để giúp tôi tải các shapefile tùy ý vào postgis. Nó cũng cố gắng phát hiện mã hóa của 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

đau khổ Tôi cũng muốn một cái.

Nhiều người dường như tìm kiếm chúng tại http://spatialreference.org

Khi bạn nhập shapefiles bằng PostGIS (và trình tải PostGIS cho PGAdmin), nó sẽ tìm kiếm thông tin proj trong một bảng có tên là spatial_Vf_sys.

Theo những gì tôi hiểu, bảng spatial numf_sys tiêu chuẩn được đóng gói với PostGIS chỉ bao gồm các đại diện OGC WKT (Open Geospatial Consortium Well Known Text) của một số Hệ thống tham chiếu không gian và KHÔNG phải là hệ thống tham chiếu không gian ESRI.

Từ tài liệu PostGIS 1.5.2:>

Bảng spatial_Vf_sys là bảng cơ sở dữ liệu tuân thủ PostGIS và OGC liệt kê hơn 3001 hệ thống tham chiếu không gian đã biết và các chi tiết cần thiết để chuyển đổi / phân phối lại giữa chúng.

Mặc dù bảng spatial numf_sys của PostGIS chứa hơn 3000 định nghĩa hệ thống tham chiếu không gian được sử dụng phổ biến hơn có thể được xử lý bởi thư viện proj, nhưng nó không chứa tất cả những gì người ta biết và bạn thậm chí có thể xác định phép chiếu tùy chỉnh của riêng mình nếu bạn quen thuộc với các cấu trúc proj4 . Hãy nhớ rằng hầu hết các hệ thống tham chiếu không gian là khu vực và không có ý nghĩa gì khi được sử dụng bên ngoài giới hạn mà chúng được dự định.

Một tài nguyên tuyệt vời để tìm các hệ thống tham chiếu không gian không được xác định trong bộ lõi là http://spatialreference.org/ Một số hệ thống tham chiếu không gian được sử dụng phổ biến hơn là: 4326 - WGS 84 Long Lat, 4269 - NAD 83 Long Lat, 3395 - WGS 84 World Mercator, 2163 - Khu vực bình đẳng Atlas quốc gia Hoa Kỳ, các hệ thống tham chiếu không gian cho từng NAD 83, WGS 84 UTM - các khu vực UTM là một trong những khu vực lý tưởng nhất để đo lường, nhưng chỉ bao gồm các khu vực 6 độ.

Các hệ thống tham chiếu không gian máy bay khác nhau của tiểu bang Hoa Kỳ (dựa trên mét hoặc feet) - thường là một hoặc 2 tồn tại trên mỗi tiểu bang Hoa Kỳ. Hầu hết các đồng hồ đo đều nằm trong bộ lõi, nhưng nhiều chân dựa hoặc ESRI được tạo ra mà bạn sẽ cần phải lấy từ spatialreference.org.

Tuy nhiên, ogr2ogr chứa các hệ thống ref không gian ESRI như tôi mới biết được thông qua sự hào phóng của người khác.

Trong cả ogr2ogr và spatial numf_sys, dường như văn bản chứa trong tệp .proj được so sánh với bảng OGC WKT, định dạng văn bản hơi khác so với định dạng WKT ESRI mà bạn thường tìm thấy trong tệp .proj. Ngoài ra, tôi không chắc chắn cách PostGIS tìm kiếm từng SRS, nhưng sự khác biệt nhỏ giữa ESRI WKT và OGC WKT có thể dẫn đến các trận đấu thất bại.

Có vẻ như sẽ đơn giản để đính kèm các hệ thống ref không gian ESRI vào bảng spatial numf_sys mặc định trong PostGIS. Có lẽ ai đó đã có, với một số bản vá hoặc một kịch bản.

Tôi có thể sai, bởi vì tôi đã gặp phải điều này trong vài ngày qua, và tôi đã thất vọng với điều tương tự. Có lẽ ai đó biết một nguồn lực lớn?


1

Đã được một thời gian kể từ khi tôi cần, nhưng khi tôi nhớ lại, http://spatialreference.org/ ngoài việc cho phép bạn tìm kiếm, còn cung cấp cho bạn tùy chọn tải lên tệp prj.

Sau đó, nó sẽ là một trong các tùy chọn đầu ra cung cấp cho bạn phần chèn postgis tương đương để chèn vào bảng spatial_Vf_sys.

Đối với câu lệnh chèn mà nó đưa ra, tôi thay thế srid được tạo mà nó tạo bằng EPSG hoặc ESRI. Nếu bạn nhận được một vi phạm khóa chính, thì bạn biết rất có thể nó đã có trong bảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.