Shapefile PRJ до таблиці пошуку PostGIS SRID?


38

Мені було цікаво, чи існує таке поняття, як форматний файл PRJ до таблиці пошуку PostGIS SRID? Щось, що може перетворити найбільш стандартні визначення PRJ форми форми у вірогідний SRID.

Якщо ви використовуєте PostGIS і pgAdminIII, якщо ви використовуєте postgisgui для імпорту ваших форм-файлів, SRID залишається як "-1". Схоже, інструмент повинен мати змогу проаналізувати PRI Esri та визначити правильні (або хоча б пару варіантів), які є ймовірним 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
Застереження, звичайно, це те, що він вимагає підключення до Інтернету і залежить від зовнішньої веб-служби, яка потребує роботи та роботи.
Майк Т

57

GDAL має приємний інтерфейс до бібліотеки PROJ4.

Якщо ви впевнені в Python, використовуючи прив'язки GDAL Python, якщо ви імпортуєте класи OSR, у вас будуть дуже зручні методи для читання та експортування проекційних представлень у різні формати, такі як PROJ4, WKT, Esri .PRJ.

Наприклад, цей скрипт перетворить ваш .PRJ файл вашої форми файлів у 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, але якщо вони просто EPSG-коди, ви можете використовувати http://prj2epsg.org/search, щоб шукати їх з (зламаних) файлів ESRI.prj.


Це дійсно розумний веб-сайт. Переглядаючи API , ви можете написати приємний сценарій на стороні сервера для автоматизації процедури.
Майк Т

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

Коли ви імпортуєте форми файлів за допомогою PostGIS (і завантажувача PostGIS для PGAdmin), він шукає інформацію про програму в таблиці під назвою просторовий_реф_sys.

З того, що я розумію, стандартна таблиця просторового_реф_sys, упакована з PostGIS, включає лише OGC WKT (добре відомий відкритий геопросторовий консорціум) уявлення про деякі просторові довідкові системи, а не про просторові довідкові системи ESRI.

З документації PostGIS 1.5.2:>

Таблиця просторової_реф_sys - це таблиця баз даних, що відповідає PostGIS, та сумісна з OGC, що містить понад 3001 відомих просторових систем відліку та деталі, необхідні для перетворення / повторного проекту між ними.

Хоча таблиця просторового_реф_sys PostGIS містить понад 3000 найпоширеніших визначень просторової системи відліку, якими можна обробляти бібліотеку proj, вона не містить усіх відомих людині, і ви навіть можете визначити власну власну проекцію, якщо ви знайомі з конструкціями proj4 . Майте на увазі, що більшість просторових систем відліку мають регіональний характер і не мають значення при використанні поза межами, для яких вони були призначені.

Прекрасним ресурсом для пошуку просторових систем відліку, не визначених у наборі ядер, є http://spatialreference.org/. Деякі з найбільш часто використовуваних просторових систем відліку: 4326 - WGS 84 Long Lat, 4269 - NAD 83 Long Lat, 3395 - WGS 84 World Mercator, 2163 - Національна рівна зона атласу США, просторові системи відліку для кожної зони NAD 83, WGS 84 UTM - зони UTM є одними з найбільш ідеальних для вимірювання, але охоплюють лише 6-градусні регіони.

Різні просторові системи відліку площин штату США (на основі метра або футів) - зазвичай одна або 2 існують на один штат США. Більшість вимірювальних приладів знаходяться в базовому наборі, але багато таких, що базуються на ногах, або створені ESRI, вам потрібно буде витягнути з простору.org.

Однак ogr2ogr містить просторові системи refRI ESRI, як я нещодавно дізнався завдяки щедрістю інших.

Як в ogr2ogr, так і в просторовому_реф_sys, здається, що текст, що міститься у файлі .proj, порівнюється з таблицею OGC WKT, що є дещо іншим текстовим форматом від формату ESRI WKT, який ви часто зустрічаєте у файлі .proj. Крім того, я не впевнений, як PostGIS виглядає на кожній SRS, але невеликі відмінності між ESRI WKT і OGC WKT можуть призвести до невдалих збігів.

Схоже, було б просто приєднати просторові системи ref ref ESRI до таблиці за замовчуванням простор_ref_sys у PostGIS. Можливо, у когось вже є, з якимсь патчем чи сценарієм.

Я можу помилятися, тому що я просто стикався з цим останні кілька днів, і мене розчарувало те саме. Можливо, хтось ще знає чудовий ресурс?


1

Минув деякий час, але, як я пам’ятаю, http://spatialreference.org/, крім того, що дозволяє здійснювати пошук, також дає можливість завантаження файлу prj.

Тоді він як один із варіантів виводу дасть вам еквівалентну вставку postgis, яку слід вставити в просторову таблицю простору__sys.

Для заяви, яку він дає, я замінюю створений срід, який він створює, на EPSG або ESRI. Якщо у вас є порушення первинного ключа, то ви, швидше за все, знаєте його вже в таблиці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.