শেপফিল পিআরজে থেকে পোস্টজিআইএস এসআরআইডি দেখার টেবিলে?


38

আমি ভাবছিলাম যে পোস্টজিআইএস এসআরআইডি লক টেবিল থেকে শেপফিল পিআরজে-র মতো কোনও জিনিস আছে? এমন কিছু যা সম্ভাব্য এসআরডি-র মধ্যে সর্বাধিক স্ট্যান্ডার্ড শেফফিল পিআরজে সংজ্ঞা অনুবাদ করতে পারে।

পোস্টজিআইএস এবং পিজিএডমিনিআইআইআই ব্যবহার করার সময়, আপনি যদি নিজের শেপফায়ালগুলি আমদানির জন্য পোস্টগিজগুই ব্যবহার করেন তবে এসআরআইডি "-1" হিসাবে রেখে দেওয়া হবে। দেখে মনে হচ্ছে হাতিয়ারটি Esri PRJ কে বিশ্লেষণ করতে সক্ষম হবে এবং সঠিক (বা কমপক্ষে কয়েকটি বিকল্প) যা ডিআরএলটি ছাড়ার পরিবর্তে সম্ভাব্য এসআরআইডি রয়েছে তা নির্ধারণ করতে সক্ষম হবে।

বা আপনি যদি অন্য একটি এসআরআইডি চয়ন করেন তবে আমদানিকারীর ফ্লাইতে পুনরায় প্রসারণের সক্ষমতা আছে কি?

এটি আমার পক্ষে অলস বলে মনে হতে পারে তবে আমার কাছে এটি কৌতূহল বলে মনে হচ্ছে যে এই ফাংশনটি ইতিমধ্যে স্থাপন করা হয়নি। কেউ কি জানেন যে এই ধারণাটি কাজ করছে বা সঠিক কারণেই কেন এটি বাদ দেওয়া হয়েছে?

উত্তর:


9

@ বিড়াল থেকে ধারণা ধারন করার জন্য, এখানে একটি পিএল / পাইথন 3 মডিউল রয়েছে যা HTTP://prj2epsg.org ওয়েব পরিষেবাটি ব্যবহার করে একটি PRJ ফাইল থেকে EPSG SRID পূর্ণসংখ্যার কোডগুলি সন্ধান করবে ।

প্রথমে, পিএল / পাইথন 3 ইনস্টল করুন:

CREATE LANGUAGE plpython3u;

একটি এখন এসকিউএল ফাংশন যুক্ত করে, এতে পাইথন 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 ফেরত দেয়।


আমি এটি সমাধান হিসাবে চিহ্নিত করতে যাচ্ছি। অন্যরা সবাই দুর্দান্ত হলেও আমি এই ধারণাটি পছন্দ করি। এখন যদি আমরা কেবলমাত্র এই ধরণের কার্যকারিতাটি পিজএডমিন পোস্টজিআইএস শেফফাইল লোডারে অন্তর্ভুক্ত করার কোডিং ক্ষমতা সহ কাউকে পেতে পারি যাতে এটি এসএইচপি পড়ার পরে সঠিকভাবে এসআরআইডি নির্ধারণ করে। আমি আমার আঙ্গুলগুলি অতিক্রম করব।
রায়ানডাল্টন

1
অবশ্যই সতর্কতাগুলি এটির জন্য একটি ইন্টারনেট সংযোগ প্রয়োজন এবং এটি একটি বহিরাগত ওয়েব পরিষেবাদির উপর নির্ভর করে যা আপ এবং চলমান প্রয়োজন।
মাইক টি

57

জিডিএল এর PROJ4 লাইব্রেরিতে একটি দুর্দান্ত সুবিধাজনক ইন্টারফেস রয়েছে।

যদি আপনি পাইথনের সাথে আত্মবিশ্বাসী হন, জিডিএল পাইথন বাইন্ডিংগুলি ব্যবহার করে, আপনি যদি ওএসআর ক্লাসগুলি আমদানি করেন তবে আপনার কাছে প্রজেকশন উপস্থাপনাগুলি পড়ার এবং রফতানির জন্য প্রজেক্ট 4, ডাব্লুকেটি, এসরি .পিজেজে বিভিন্ন ধরণের ফর্ম্যাট থাকবে।

উদাহরণস্বরূপ, এই স্ক্রিপ্টটি আপনার আকারের ফাইলের .PRJ ফাইলটিকে WKT এবং PROJ4 এ রূপান্তর করবে (শেষটি পোস্টজিআইএস থেকে ব্যবহৃত হয়):

#! /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 খোঁজা আউটপুট ব্যবহার করতে পারবেন না, টেবিল; এবং (২) আমি কোনও এসআরআইডি সম্পত্তি বা পদ্ধতি খুঁজে পাচ্ছি না (একটি সহজ ImportFromEPSG(SRID)পদ্ধতি আছে তবে অন্যভাবে নয়)
মাইক টি

4
আমি স্ক্রিপ্টটি অটোআইডিটিফটিইপিএসজি () পদ্ধতিতে যা যাদু করবে;)
ক্যাপুটি

খুব ঠান্ডা. চমৎকার কাজ!
রায়ানডাল্টন

কখন gdalsrsinfoএবং ogrinfoআপনাকে ব্যর্থ করে, এই পথে যাওয়ার উপায়!
কনটেক্সটিফাই

লক্ষ্য করুন যে srs.GetAuthorityCode(None)কোনও নিকটবর্তী এসআরডি সনাক্ত না করা থাকলে এখনও কোনওটিই ফেরত আসতে পারে না।
অ্যাস্ট্রজুয়ানলু

19

পোস্টজিআইএস শ্রীডগুলি ব্যবহার করার পরে এটি হয়ে গেছে তবে তারা যদি কেবল ইপিএসজি কোড হয় তবে আপনি এটিকে (ভাঙা) ESRI.prj ফাইলগুলি থেকে সন্ধান করতে http://prj2epsg.org/search ব্যবহার করতে পারেন ।


এটি একটি সত্যই স্মার্ট ওয়েবসাইট। এপিআইয়ের দিকে তাকানো , আপনি পদ্ধতিটি স্বয়ংক্রিয় করতে একটি দুর্দান্ত সার্ভার-সাইড স্ক্রিপ্ট লিখতে পারেন।
মাইক টি

4

সমাধানের মিশ্রণ হিসাবে আমি একটি স্ক্রিপ্ট তৈরি করেছি আমাকে পোস্টগ্রিসে স্বেচ্ছাসেবী আকারের ফাইল লোড করতে সহায়তা করার জন্য। এটি ডিবিএফের এনকোডিং সনাক্ত করার চেষ্টা করে।

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://spatialreferences.org এ দেখায় বলে মনে হচ্ছে

আপনি যখন পোস্টজিআইএস (এবং পিজিএডমিনের জন্য পোস্টজিআইএস লোডার) ব্যবহার করে শেফফিলগুলি আমদানি করেন, তখন এটি স্থানিক_আরফ_সিস নামে একটি সারণীতে প্রজ তথ্যটি সন্ধান করে।

আমি যা বুঝি সেগুলি থেকে, পোস্টজিআইএসের সাথে স্ট্যান্ডার্ড স্ট্যান্ডিয়াল_রেফ_সিস টেবিলের মধ্যে কেবলমাত্র ওজিসি ডাব্লুকেটি (ওপেন জিওপ্যাটিয়াল কনসোর্টিয়াম ওয়েল ননড টেক্সট) কিছু স্পেসিয়াল রেফারেন্স সিস্টেমের উপস্থাপনা এবং ইএসআরআই স্পেসিয়াল রেফারেন্স সিস্টেমগুলি অন্তর্ভুক্ত করে না।

পোস্টজিআইএস থেকে 1.5.2 ডকুমেন্টেশন:>

স্পেসিয়াল_রেফ_সিস টেবিলটি একটি পোস্টজিআইএস অন্তর্ভুক্ত এবং ওজিসি অনুগত ডাটাবেস টেবিল যা 3001 টিরও বেশি পরিচিত স্থানিক রেফারেন্স সিস্টেম এবং তাদের মধ্যে রূপান্তর / পুনঃপ্রক্রিয়া করার জন্য প্রয়োজনীয় বিশদ তালিকাভুক্ত করে।

যদিও পোস্টজিআইএস স্পেসিয়াল_রেফ_সিস টেবিলটিতে প্রজ লাইব্রেরি দ্বারা পরিচালিত আরও সাধারণভাবে ব্যবহৃত স্থানিক রেফারেন্স সিস্টেম সংজ্ঞাগুলির মধ্যে 3000 টি রয়েছে তবে এতে মানুষের জানা নেই এবং আপনি প্রজ 4 নির্মাণের সাথে পরিচিত হলে আপনি নিজের কাস্টম প্রজেকশনটিও সংজ্ঞায়িত করতে পারেন । মনে রাখবেন যে বেশিরভাগ স্থানিক রেফারেন্স সিস্টেমগুলি আঞ্চলিক এবং যখন তাদের সীমাবদ্ধতার বাইরে নির্ধারিত ছিল তখন তাদের কোনও অর্থ নেই।

মূল সেটটিতে সংজ্ঞায়িত না হয় স্থানিক রেফারেন্স সিস্টেমগুলি সন্ধানের জন্য একটি দুর্দান্ত উত্স হ'ল http://spatialreferences.org/ সর্বাধিক ব্যবহৃত স্থানিক রেফারেন্স সিস্টেমগুলির মধ্যে কয়েকটি হ'ল : 4326 - ডাব্লুজিএস 84 লং ল্যাট, 4269 - এনএডি 83 লং ল্যাট, 3395 - ডাব্লুজিএস ৮৪ বিশ্ব মারকেটর, 2163 - মার্কিন জাতীয় আটলাস সমান অঞ্চল, প্রতিটি এনএডি 83 এর জন্য স্থানিক রেফারেন্স সিস্টেম, ডাব্লুজিএস 84 ইউটিএম জোন - ইউটিএম অঞ্চলগুলি পরিমাপের জন্য সবচেয়ে আদর্শ এক, তবে কেবল 6-ডিগ্রি অঞ্চলগুলিকে অন্তর্ভুক্ত করে।

মার্কিন যুক্তরাষ্ট্রের বিভিন্ন রাষ্ট্রের বিমানের স্থানিক রেফারেন্স সিস্টেমগুলি (মিটার বা ফুট ভিত্তিক) - সাধারণত মার্কিন যুক্তরাষ্ট্রের জন্য এক বা ২ টি বিদ্যমান। মিটারগুলির বেশিরভাগটি মূল সেটে রয়েছে তবে অনেকগুলি ফুট ভিত্তিক বা ইএসআরআই তৈরি করেছেন যা আপনাকে স্থানিক রেফারেন্স.org থেকে টানতে হবে।

তবে ওজিআর 2ogr তে ESRI স্থানিক রেফ সিস্টেম রয়েছে যা আমি সম্প্রতি অন্যের উদারতার মাধ্যমে শিখেছি।

Ogr2ogr এবং স্থানিক_আরফ_সিস উভয় ক্ষেত্রেই মনে হয় যে .proj ফাইলে থাকা পাঠ্যটি ওজিসি ডব্লিউকেটি-র একটি টেবিলের সাথে তুলনা করা হয়, যা আপনি প্রায়শই একটি .proj ফাইলে খুঁজে পান এমন ESRI WKT ফর্ম্যাট থেকে কিছুটা আলাদা পাঠ্য বিন্যাস। এছাড়াও, আমি নিশ্চিত নই যে পোস্টজিআইএস প্রতিটি এসআরএসকে কীভাবে দেখায়, তবে ইএসআরআই ডব্লিউকেটি এবং ওজিসি ডব্লু কেটি-র মধ্যে সামান্য পার্থক্য ব্যর্থ ম্যাচের ফলস্বরূপ হতে পারে।

দেখে মনে হচ্ছে পোস্টজিআইএস-এর ডিফল্ট স্পেসিয়াল_রেফ_সিস টেবিলের সাথে ইএসআরআই স্পেসিয়াল রেফ সিস্টেম সংযুক্ত করা সহজ হবে। কারও কাছে ইতিমধ্যে কিছু প্যাচ বা স্ক্রিপ্ট রয়েছে has

আমি ভুল হতে পারি, কারণ আমি গত কয়েকদিন ধরেই এটির মধ্যে চলেছি এবং আমি একই জিনিসটি নিয়ে হতাশ হয়েছি। অন্য কেউ হয়ত একটি দুর্দান্ত সংস্থান জানেন?


1

আমার প্রয়োজন হওয়ার পরে এটি খুব একটা সময় হয়েছে, তবে আমার মনে আছে, http://spatialreferences.org/ আপনাকে অনুসন্ধানের অনুমতি দেওয়ার পাশাপাশি আপনাকে একটি প্রাইজ ফাইল আপলোড করার বিকল্প দেয়।

তারপরে এটি আউটপুট বিকল্পগুলির মধ্যে একটি হিসাবে আপনাকে স্থানিক_আরফ_সিস সারণিতে সন্নিবেশ করার জন্য সমতুল্য পোস্টগ্রিস sertোকাতে দেবে।

এটি যে সন্নিবেশ বিবৃতি দেয় তার জন্য, আমি এটি তৈরি করা উত্সগুলি ইপিএসজি বা ইএসআরআই এর সাথে প্রতিস্থাপন করি। যদি আপনি একটি প্রাথমিক কী লঙ্ঘন পান তবে আপনি সম্ভবত তা ইতিমধ্যে টেবিলে জানেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.