Shapefile PRJ PostGIS SRID arama tablosu için?


38

PostGIS SRID arama tablosu için bir shapefile PRJ diye bir şey olup olmadığını merak ediyordum? En standart şekil dosyası PRJ tanımlarını muhtemel SRID'ye çevirebilecek bir şey.

PostGIS ve pgAdminIII kullanırken, şekil dosyalarınızı almak için postgisgui'yi kullanırsanız, SRID "-1" olarak bırakılır. Görünüşe göre, araç Esri PRJ'yi ayrıştırabilmeli ve varsayılanı bırakmak yerine muhtemel SRID olanı doğru (ya da en azından birkaç seçenek) belirleyebilmelidir.

Yoksa ithalatçı başka bir SRID seçtiyseniz anında yeniden proje etme yeteneğine mi sahip?

Benim açımdan tembel görünebilir, ancak bana göre bu fonksiyonun yerine konmamış olması ilginç görünüyor. Bu konseptin eserlerinde olup olmadığını bilen var mı, yoksa neden bırakıldığının iyi bir nedeni var mı?

Yanıtlar:


9

@İant öğesinden ödünç aldığınızda, http://prj2epsg.org web hizmetini kullanarak PRG dosyasından EPSG SRID tam sayı kodlarını arayacak bir PL / Python3 modülü bulunmaktadır .

İlk önce, PL / Python3'ü kurun:

CREATE LANGUAGE plpython3u;

şimdi Python 3 için yazılmış kodu olan SQL işlevini ekleyin:

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'den kullanmak için:

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

benim test Shapefile için 4326 döndürür.


Bunu çözüm olarak işaretleyeceğim. Diğerleri mükemmel olsa da, bu fikri çok seviyorum. Şimdi, bu tür bir işlevselliği pgAdmin PostGIS şekil dosyası yükleyicisine dahil edebilecek kodlama özelliğine sahip birini bulursak, böylece SHP'yi okuduktan sonra doğru SRID'yi otomatik olarak belirleyecektir. Parmaklarımı çapraz tutacağım.
RyanDalton

1
Tabii ki uyarılar bir İnternet bağlantısı gerektiriyor ve çalışması ve çalışması gereken harici bir web servisine bağlı.
Mike T

57

GDAL, PROJ4 kütüphanesine uygun ve kullanışlı bir arayüze sahiptir.

Python'a güveniyorsanız, GDAL Python bağlamalarını kullanarak, osr sınıflarını içe aktarırsanız, projeksiyon gösterimlerini okumak ve PROJ4, WKT, Esri .PRJ gibi çeşitli formatlara aktarmak için çok uygun yöntemlere sahip olacaksınız.

Örneğin, bu komut dosyası, shapefile dosyanızın .PRJ dosyasını WKT ve PROJ4’e dönüştürür (en son PostGIS’de kullanılır):

#! /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])

Bunu komut satırında çalıştırın:

$ 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

Ben iki konu bu yaklaşım geldi: (1) +proj=longlat +datum=WGS84 +no_defsdeğil spatial_ref_syssen SRID bakmak için çıktı kullanamaması için, tablonun; ve (2) Herhangi bir SRID özelliği veya yöntemi bulamıyorum (kullanışlı bir ImportFromEPSG(SRID)yöntem var, ancak tersi değil)
Mike T

4
Senaryoyu sihir yapacak AutoIdentifyEPSG () yöntemine yapılan bir çağrı ile güncelledim;)
capooti

Çok havalı. Harika iş!
RyanDalton

Ne zaman gdalsrsinfove ogrinfobaşarısız olursun, işte yol bu!
17'de kontextify

Uyarı srs.GetAuthorityCode(None)hiçbir yakın SRID tespit edilmiştir eğer hala hiçbiri döndürebilir.
astrojuanlu

19

Bir süredir POSTGIS yazılarını kullandım, ancak bunlar sadece EPSG kodlarıysa, onları (bozuk) ESRI.prj dosyalarından aramak için http://prj2epsg.org/search kullanabilirsiniz .


Bu gerçekten akıllı bir web sitesi. API'ye bakarak işlemi otomatikleştirmek için güzel bir sunucu tarafı komut dosyası yazabilirsiniz.
Mike T

4

Çözümlerin bir karışımı olarak, rasgele şekil dosyalarını postgise yüklememe yardımcı olacak bir senaryo oluşturdum. Ayrıca, DBF'nin kodlamasını da tespit etmeye çalışır.

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. Bende bir tane istiyorum.

Birçok insan http://spatialreference.org adresinde onlara bakar gibi görünüyor

PostGIS (ve PGAdmin için PostGIS yükleyicisi) kullanarak shapefile dosyalarını içe aktarırken, proje bilgisini spatial_ref_sys adlı bir tabloda arar.

Anladığım kadarıyla, PostGIS ile paketlenmiş standart spatial_ref_sys tablosu, bazı Mekansal Referans Sistemlerinin ve ESRI Mekansal referans sistemlerinin değil, yalnızca OGC WKT (Açık Mekansal Konsorsiyum Tanınmış Metin) temsillerini içerir.

PostGIS 1.5.2 belgelerinden:>

Spatial_ref_sys tablosu, 3001'den fazla bilinen mekansal referans sistemini ve aralarında dönüştürmek / yeniden planlamak için gereken ayrıntıları listeleyen bir PostGIS dahil ve OGC uyumlu veritabanı tablosudur.

PostGIS spatial_ref_sys tablosu, proje kütüphanesi tarafından işlenebilecek daha yaygın kullanılan uzaysal referans sistemi tanımlarının 3000'inden fazlasını içermesine rağmen, insan tarafından bilinen tüm bilgileri içermez ve hatta proj4 yapılarına aşina iseniz, kendi özel projeksiyonunuzu bile tanımlayabilirsiniz. . Mekansal referans sistemlerinin çoğunun bölgesel olduğunu ve amaçlandıkları sınırların dışında kullanıldığında hiçbir anlamı olmadığını unutmayın.

Çekirdek kümesinde tanımlanmayan uzaysal referans sistemlerini bulmak için mükemmel bir kaynak http://spatialreference.org/ En yaygın kullanılan uzaysal referans sistemlerinden bazıları şunlardır: 4326 - WGS 84 Long Lat, 4269 - NAD 83 Long Lat, 3395 - WGS 84 World Mercator, 2163 - ABD Ulusal Atlas Eşit Alanı, her NAD 83 için Mekansal referans sistemleri, WGS 84 UTM bölgesi - UTM bölgeleri, ölçüm için en ideal alanlardan biridir, ancak yalnızca 6 derece bölgeleri kapsar.

Çeşitli ABD devlet düzlemi uzamsal referans sistemleri (metre veya ayak tabanlı) - ABD devleti başına genellikle bir veya 2 var. Sayaçların çoğu çekirdek settedir, ancak ayak tabanlı olanların veya ESRI'nin oluşturduğu ayakların çoğu spatialreference.org'dan çekmeniz gerekecek.

Ancak ogr2ogr , yakın zamanda başkalarının cömertliği yoluyla öğrendiğim gibi ESRI uzaysal ref sistemlerini içeriyor .

Hem ogr2ogr hem de spatial_ref_sys'de, .proj dosyasında yer alan metnin, genellikle bir .proj dosyasında bulduğunuz ESRI WKT biçiminden biraz farklı bir metin biçimi olan OGC WKT tablosu ile karşılaştırıldığı görülmektedir. Ayrıca, PostGIS'in her bir SRS'yi nasıl aradığından emin değilim, ancak ESRI WKT ve OGC WKT arasındaki küçük farklılıklar başarısız sonuçlara neden olabilir.

ESRI uzaysal ref sistemlerini PostGIS'teki varsayılan spatial_ref_sys tablosuna eklemenin kolay olduğu anlaşılıyor. Belki birileri zaten bir yama veya senaryo ile sahip.

Yanılıyor olabilirim, çünkü son birkaç gündür buna rastlamıştım ve aynı şeyle ilgili hayal kırıklığına uğradım. Belki bir başkası harika bir kaynak biliyordur?


1

Aramaya başladığımdan bu yana bir süre geçti, ama hatırladığım kadarıyla, http://spatialreference.org/ aramanıza izin vermenin yanı sıra, prj dosyası yükleme seçeneği de veriyor.

Daha sonra, çıkış seçeneklerinden biri olarak spatial_ref_sys tablosuna eklenecek eşdeğer postgis ekini verecektir.

Verdiği insert cümlesi için oluşturduğu oluşturulan EPSG veya ESRI ile değiştirilir. Birincil anahtar ihlali alırsanız, büyük olasılıkla zaten tabloda olduğunu biliyorsunuzdur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.