Shapefile PRJ ไปยังตารางการค้นหา PostGIS SRID?


38

ฉันสงสัยว่ามีสิ่งเช่น shapefile PRJ ไปยังตารางการค้นหา PostGIS SRID หรือไม่ บางสิ่งที่สามารถแปลนิยาม PRJ ของ filefile มาตรฐานให้เป็น SRID ที่เป็นไปได้

เมื่อใช้ PostGIS และ pgAdminIII ถ้าคุณใช้ postgisgui เพื่อนำเข้ารูปร่างของคุณ SRID จะถูกปล่อยให้เป็น "-1" ดูเหมือนว่าเครื่องมือควรจะสามารถแยกวิเคราะห์ Esri PRJ และกำหนดตัวเลือกที่ถูกต้อง (หรืออย่างน้อยสองตัวเลือก) ที่เป็นไปได้ที่ SRID แทนที่จะปล่อยให้เป็นค่าเริ่มต้น

หรือผู้นำเข้ามีความสามารถในการปฏิเสธในทันทีหากคุณเลือก SRID อื่นหรือไม่

มันอาจดูขี้เกียจในส่วนของฉัน แต่สำหรับฉันมันก็ดูเหมือนว่าอยากรู้ว่าฟังก์ชั่นนี้ไม่ได้อยู่ในสถานที่ ไม่มีใครรู้ว่าแนวคิดนี้อยู่ในผลงานหรือเหตุผลที่ดีว่าทำไมมันถึงถูกทิ้ง?

คำตอบ:


9

การยืมความคิดจาก @iant นี่คือโมดูล PL / Python3 ที่จะค้นหารหัสจำนวนเต็ม EPSG SRID จากไฟล์ PRJ โดยใช้http://prj2epsg.orgบริการเว็บ

ก่อนอื่นให้ทำการติดตั้ง PL / Python3:

CREATE LANGUAGE plpython3u;

ตอนนี้เพิ่มฟังก์ชั่น SQL ซึ่งมีโค้ดที่เขียนขึ้นสำหรับ 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;

วิธีใช้จาก PostgreSQL:

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

ส่งคืน 4326 สำหรับการทดสอบ Shapefile ของฉัน


ฉันจะทำเครื่องหมายสิ่งนี้เป็นวิธีแก้ปัญหา ในขณะที่คนอื่น ๆ ทั้งหมดยอดเยี่ยมฉันรักความคิดนี้ ตอนนี้ถ้าเราสามารถรับคนที่มีความสามารถในการเขียนโค้ดเพื่อรวมฟังก์ชันการทำงานประเภทนี้ลงในตัวโหลดรูปร่าง pgAdmin PostGIS เพื่อให้มันกำหนด SRID ที่ถูกต้องโดยอัตโนมัติเมื่ออ่าน SHP ฉันจะให้นิ้วมือข
RyanDalton

1
แน่นอนว่ามันต้องการการเชื่อมต่ออินเทอร์เน็ตและขึ้นอยู่กับบริการเว็บภายนอกที่จำเป็นต้องเปิดใช้งาน
Mike T

57

GDAL มีส่วนต่อประสานที่สะดวกไปยังไลบรารี PROJ4

หากคุณมั่นใจใน Python โดยใช้การผูก GDAL Python ถ้าคุณนำเข้าคลาส osr คุณจะมีวิธีการที่สะดวกมากสำหรับการอ่านและส่งออกภาพการแสดงภาพแทนรูปแบบที่หลากหลายเช่น PROJ4, WKT, Esri .PRJ

ตัวอย่างเช่นสคริปต์นี้จะแปลงไฟล์. PRJ ของคุณเป็นไฟล์ shapefile เป็น 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

โปรดสังเกตว่าsrs.GetAuthorityCode(None)อาจยังคงไม่มีใครส่งคืนหากไม่มีการระบุ SRID ที่ใกล้เคียง
astrojuanlu

19

เป็นเวลานานแล้วที่ฉันใช้ POSTGIS srids แต่หากเป็นเพียงรหัส EPSG คุณสามารถใช้http://prj2epsg.org/searchเพื่อค้นหาไฟล์ ESRI.prj (แตก) ได้


นี่คือเว็บไซต์ที่ชาญฉลาดจริงๆ เมื่อมองไปที่APIคุณสามารถเขียนสคริปต์ฝั่งเซิร์ฟเวอร์เพื่อทำตามขั้นตอนอัตโนมัติได้
Mike T

4

ฉันได้สร้างสคริปต์ขึ้นมาเพื่อช่วยฉันโหลดรูปร่างโดยพลการลงใน postgis นอกจากนี้ยังพยายามตรวจจับการเข้ารหัสของ 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

เมื่อคุณนำเข้า shapefiles โดยใช้ PostGIS (และตัวโหลด PostGIS สำหรับ PGAdmin) จะค้นหาข้อมูล proj ในตารางที่เรียกว่า spatial_ref_sys

จากสิ่งที่ฉันเข้าใจตาราง spatial_ref_sys มาตรฐานที่บรรจุด้วย PostGIS จะรวมเฉพาะการแสดง OGC WKT (Open Geospatial Consortium Text Known Text) ที่เป็นตัวแทนของระบบอ้างอิงเชิงพื้นที่และไม่ใช่ระบบอ้างอิงเชิงพื้นที่ของ ESRI

จากเอกสาร PostGIS 1.5.2:>

ตาราง spatial_ref_sys เป็น PostGIS ที่รวมอยู่และตารางฐานข้อมูลที่สอดคล้องกับ OGC ซึ่งแสดงรายการระบบการอ้างอิงเชิงพื้นที่มากกว่า 3001 ระบบที่รู้จักและมีรายละเอียดที่จำเป็นในการแปลง / แยกระหว่างกัน

แม้ว่าตาราง PostGIS spatial_ref_sys จะมีคำจำกัดความระบบอ้างอิงเชิงพื้นที่ที่ใช้กันทั่วไปมากกว่า 3000 รายการซึ่งสามารถจัดการได้โดยไลบรารี proj แต่มันไม่ได้มีชื่อของมนุษย์ทั้งหมดและคุณสามารถกำหนดการฉายภาพที่กำหนดเองของคุณเองหากคุณคุ้นเคยกับโครงสร้างของ proj4 . โปรดทราบว่าระบบอ้างอิงเชิงพื้นที่ส่วนใหญ่เป็นภูมิภาคและไม่มีความหมายเมื่อใช้นอกขอบเขตที่พวกเขาตั้งใจไว้

ทรัพยากรที่ยอดเยี่ยมสำหรับการค้นหาระบบอ้างอิงเชิงพื้นที่ที่ไม่ได้กำหนดไว้ในชุดแกนหลักคือhttp://spatialreference.org/ ระบบอ้างอิงเชิงพื้นที่ที่ใช้กันทั่วไปบางส่วน ได้แก่ : 4326 - WGS 84 Long Lat, 4269 - NAD 83 Long Lat, 3395 - WGS 84 World Mercator, 2163 - US National Atlas Equal Area, ระบบอ้างอิงเชิงพื้นที่สำหรับ NAD 83, WGS 84 UTM zone - แต่ละโซน UTM เป็นหนึ่งในพื้นที่ที่เหมาะที่สุดสำหรับการวัด แต่ครอบคลุมเฉพาะพื้นที่ 6 องศา

ระบบการอ้างอิงเชิงพื้นที่ของเครื่องบินอเมริกาหลายแห่ง (อิงตามมิเตอร์หรือฟุต) - โดยทั่วไปจะมีหนึ่งหรือ 2 ตัวต่อรัฐของสหรัฐอเมริกา ส่วนใหญ่ของเครื่องวัดนั้นอยู่ในแกนหลัก แต่ส่วนใหญ่ของฟุตหรือ ESRI ที่สร้างขึ้นคุณจะต้องดึงจาก spatialreference.org

อย่างไรก็ตามogr2ogr มีระบบการอ้างอิงเชิงพื้นที่ของ ESRIตามที่ฉันเพิ่งเรียนรู้ผ่านความเอื้ออาทรของผู้อื่น

ในทั้ง ogr2ogr และ spatial_ref_sys ดูเหมือนว่าข้อความที่อยู่ในไฟล์. proj นั้นถูกเปรียบเทียบกับตารางของ OGC WKT ซึ่งเป็นรูปแบบข้อความที่แตกต่างจากรูปแบบ ESRI WKT เล็กน้อยที่คุณมักพบในไฟล์. proj นอกจากนี้ฉันไม่แน่ใจว่า PostGIS ค้นหา SRS แต่ละรายการอย่างไร แต่ความแตกต่างเล็กน้อยระหว่าง ESRI WKT และ OGC WKT อาจส่งผลให้เกิดการแข่งขันที่ล้มเหลว

ดูเหมือนว่าจะง่ายต่อการแนบระบบการอ้างอิงเชิงพื้นที่ของ ESRI กับตาราง spatial_ref_sys เริ่มต้นใน PostGIS อาจมีบางคนมีอยู่แล้วด้วยโปรแกรมปะแก้หรือสคริปต์

ฉันอาจจะผิดเพราะฉันเพิ่งจะเจอเรื่องนี้ในช่วงไม่กี่วันที่ผ่านมาและฉันก็รู้สึกผิดหวังกับสิ่งเดียวกัน บางทีคนอื่นรู้ทรัพยากรที่ดี?


1

เป็นเวลานานแล้วที่ฉันต้องการ แต่เมื่อฉันจำhttp://spatialreference.org/ นอกเหนือจากการอนุญาตให้คุณค้นหาแล้วยังมีตัวเลือกในการอัปโหลดไฟล์ prj อีกด้วย

จากนั้นมันจะเป็นหนึ่งในตัวเลือกเอาต์พุตที่ให้คุณแทรก postgis ที่เทียบเท่าเพื่อแทรกลงในตาราง spatial_ref_sys

สำหรับคำสั่ง insert ที่ให้ฉันจะแทนที่ srid ที่สร้างขึ้นด้วย EPSG หรือ ESRI หากคุณได้รับการละเมิดคีย์หลักคุณจะรู้ว่าเป็นไปได้ว่าอยู่ในตาราง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.