Shapefile PRJ PostGIS SRID लुकअप टेबल के लिए?


38

मैं सोच रहा था कि क्या एक आकृति पीआरजे के रूप में ऐसी चीज है जिसे पोस्टग्रेस एसआरआईडी लुकअप टेबल है? कुछ ऐसा है जो सबसे मानक शेपफाइल पीआरजे परिभाषाओं का एसआरआईडी में अनुवाद कर सकता है।

PostGIS और pgAdminIII का उपयोग करते समय, यदि आप अपनी आकृति को आयात करने के लिए postgisgui का उपयोग करते हैं, तो SRID को "-1" के रूप में छोड़ दिया जाता है। ऐसा लगता है कि उपकरण को Esri PRJ को पार्स करने और सही (या कम से कम कुछ विकल्प) निर्धारित करने में सक्षम होना चाहिए जो कि संभवत: एसआरआईडी हैं, बजाय केवल डिफ़ॉल्ट को छोड़ने के।

या यदि आप किसी अन्य SRID का चयन करते हैं तो क्या आयातक में मक्खी को फिर से हटाने की क्षमता है?

यह मेरी ओर से आलसी लग सकता है, लेकिन मुझे यह उत्सुक लगता है कि यह फ़ंक्शन पहले से ही नहीं रखा गया है। क्या किसी को पता है कि यह अवधारणा काम करती है, या अच्छे कारण की वजह से इसे छोड़ दिया गया है?

जवाबों:


9

@Iant से विचार को उधार लेते हुए, यहां एक पीएल / पायथन 3 मॉड्यूल है जो http://prj2epsg.org वेब सेवा का उपयोग करके PRJ फ़ाइल से EPSG SRID पूर्णांक कोड को देखेगा ।

सबसे पहले, PL / Python3 स्थापित करें:

CREATE LANGUAGE plpython3u;

अब SQL फ़ंक्शन जोड़ें, जिसमें पायथन 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 लौटाता है।


मैं इसे समाधान के रूप में चिह्नित करने जा रहा हूं। जबकि अन्य सभी उत्कृष्ट हैं, मुझे यह विचार बहुत पसंद है। अब अगर हम किसी को इस प्रकार की कार्यक्षमता को pgAdmin PostGIS शेपफाइल लोडर में शामिल करने की कोडिंग क्षमता के साथ प्राप्त कर सकते हैं, ताकि यह SHP पढ़ने पर स्वचालित रूप से सही SRID निर्धारित कर सके। मुझे आशा है ऐसा ही होगा।
रयानडाल्टन

1
बेशक, यह एक इंटरनेट कनेक्शन की आवश्यकता है और एक बाहरी वेब सेवा पर निर्भर करता है जिसे ऊपर और चलने की आवश्यकता है।
माइक टी

57

PROD4 लाइब्रेरी में GDAL का एक अच्छा सुविधाजनक इंटरफ़ेस है।

यदि आप Python के साथ आश्वस्त हैं, GDAL पायथन बाइंडिंग का उपयोग करते हुए, यदि आप osr क्लासेस आयात करते हैं, तो आपके पास PROJ4, WKT, Esri .PRJ जैसे विभिन्न स्वरूपों के प्रक्षेपण अभ्यावेदन पढ़ने और निर्यात करने के लिए बहुत सुविधाजनक तरीके होंगे।

उदाहरण के लिए यह स्क्रिप्ट आपकी आकृति की .PRJ फ़ाइल को WKT और PROJ4 में बदल देगी (अंतिम का उपयोग PostGG से किया जाता है):

#! /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)तरीका है, लेकिन अन्य तरीके से नहीं)
माइक टी

4
मैंने AutoIdentifyEPSG () विधि जो जादू करेगी;)
capooti

बहुत ही शांत। उत्कृष्ट कार्य!
रयानडाल्टन

जब gdalsrsinfoऔर ogrinfoआप असफल, यह जाने का रास्ता है!
12

ध्यान दें कि srs.GetAuthorityCode(None)अगर एसआरआईडी की कोई पहचान नहीं की गई थी, तब भी कोई भी वापस नहीं लौट सकता है।
एस्ट्रोजुनलू

19

जब से मैंने POSTGIS srids का उपयोग किया है, तब से थोड़ी देर हो गई है, लेकिन अगर वे सिर्फ EPSG कोड हैं तो आप http://prj2epsg.org/search का उपयोग उन्हें (टूटी हुई) ESRI.prj फ़ाइलों से देखने के लिए कर सकते हैं ।


यह वास्तव में स्मार्ट वेबसाइट है। एपीआई को देखते हुए , आप प्रक्रिया को स्वचालित करने के लिए एक अच्छा सर्वर-साइड स्क्रिप्ट लिख सकते हैं।
माइक टी

4

समाधानों के मिश्रण के रूप में मैंने एक स्क्रिप्ट बनाई है जिससे मुझे मनमाने ढंग से आकार देने में मदद मिलेगी। यह 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 लोडर) का उपयोग करके शेपफाइल्स आयात करते हैं, तो यह spatial_ref_sys नामक तालिका में proj जानकारी को देखता है।

मुझे जो समझ में आया है, पोस्टजीआईएस के साथ पैक की गई मानक स्थानिक_संग्रह तालिका में केवल ओजीसी डब्ल्यूकेटी (ओपन जियोस्पेशियल कंसोर्टियम वेल नॉन टेक्स्ट) कुछ स्थानिक संदर्भ प्रणालियों का प्रतिनिधित्व है और ईएसआरआई वैटियल संदर्भ प्रणाली नहीं है।

PostGIS 1.5.2 प्रलेखन से:>

Spatial_ref_sys तालिका एक PostGIS शामिल है और OGC अनुरूप डेटाबेस तालिका है जो 3001 ज्ञात स्थानिक संदर्भ प्रणालियों और उनके बीच रूपांतरण / अस्वीकृति के लिए आवश्यक विवरणों को सूचीबद्ध करती है।

हालाँकि PostGIS spatial_ref_sys तालिका में सामान्य रूप से उपयोग की जाने वाली स्थानिक संदर्भ प्रणाली परिभाषाओं में से 3000 से अधिक समाहित है, जो कि proj पुस्तकालय द्वारा नियंत्रित की जा सकती हैं, इसमें सभी मनुष्य ज्ञात नहीं हैं और यदि आप proj4 के निर्माण से परिचित हैं तो आप अपने स्वयं के कस्टम को परिभाषित भी कर सकते हैं। । ध्यान रखें कि ज्यादातर स्थानिक संदर्भ प्रणाली क्षेत्रीय हैं और इसका कोई मतलब नहीं है जब वे सीमा के बाहर उपयोग किए गए थे, जो वे चाहते थे।

मुख्य सेट में परिभाषित स्थानिक संदर्भ प्रणालियों को खोजने के लिए एक उत्कृष्ट संसाधन http://spatialreference.org/ है जो आमतौर पर इस्तेमाल किए जाने वाले स्थानिक संदर्भ प्रणालियों में से कुछ हैं: 4326 - डब्ल्यूजीएस 84 लॉन्ग लाट, 4269 - एनएडी 83 एनएएस लाट, 3395 - डब्ल्यूजीएस 84 वर्ल्ड मर्केटर, 2163 - यूएस नेशनल एटलस इक्वल एरिया, प्रत्येक एनएडी 83 के लिए स्थानिक संदर्भ प्रणाली, डब्ल्यूजीएस 84 यूटीएम जोन - यूटीएम जोन माप के लिए सबसे आदर्श हैं, लेकिन केवल 6-डिग्री क्षेत्रों को कवर करते हैं।

विभिन्न अमेरिकी राज्य विमान स्थानिक संदर्भ प्रणाली (मीटर या पैर आधारित) - आमतौर पर प्रति अमेरिकी राज्य में एक या 2 मौजूद होते हैं। ज्यादातर मीटर वाले कोर सेट में हैं, लेकिन कई फुट आधारित या ईएसआरआई बनाए गए हैं जिन्हें आपको spatialreference.org से खींचना होगा।

हालाँकि, ogr2ogr में ESRI स्थानिक रेफ री सिस्टम है जैसा कि मैंने हाल ही में दूसरों की उदारता के माध्यम से सीखा है।

दोनों ogr2ogr और spatial_ref_sys में, ऐसा लगता है कि .proj फ़ाइल में निहित पाठ की तुलना OGC WKT की तालिका से की जाती है, जो ESRI WKT प्रारूप से थोड़ा अलग पाठ प्रारूप है जिसे आप अक्सर एक .proj फ़ाइल में पाते हैं। इसके अलावा, मुझे यकीन नहीं है कि PostGIS प्रत्येक SRS को कैसे देखता है, लेकिन ESRI WKT और OGC WKT के बीच छोटे अंतर के परिणामस्वरूप विफल मैच हो सकते हैं।

ऐसा लगता है कि PostGIS में डिफ़ॉल्ट spatial_ref_sys तालिका में ESRI स्थानिक रेफरी सिस्टम संलग्न करना सरल होगा। हो सकता है कि किसी के पास पहले से ही कुछ पैच या स्क्रिप्ट हो।

मैं गलत हो सकता हूं, क्योंकि मैं पिछले कुछ दिनों से इस पर चल रहा हूं, और मैं उसी चीज से निराश हूं। हो सकता है कि कोई और महान संसाधन जानता हो?


1

आपकी आवश्यकता के कुछ समय हो गया है, लेकिन जैसा कि मुझे याद है, http://spatialreference.org/ आपको खोजने की अनुमति देने के अलावा, आपको एक prj फ़ाइल अपलोड करने का विकल्प भी देता है।

तब यह आउटपुट विकल्पों में से एक होगा, जो आपको spatial_ref_sys तालिका में सम्मिलित करने के लिए समान पोस्टगिस सम्मिलित करेगा।

मेरे द्वारा दिए गए इन्सर्ट स्टेटमेंट के लिए, मैं ईपीएसजी या ईएसआरआई के साथ सृजित श्री को प्रतिस्थापित करता हूं। यदि आपको एक प्राथमिक कुंजी उल्लंघन मिलता है, तो आप सबसे अधिक संभावना पहले से ही तालिका में जानते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.