シェープファイルPRJからPostGIS SRIDルックアップテーブルへ?


38

シェープファイルPRJからPostGIS SRIDルックアップテーブルのようなものがあるかどうか疑問に思っていましたか?最も標準的なシェープファイルPRJ定義をSRIDに変換できるもの。

PostGISおよびpgAdminIIIを使用する場合、postgisguiを使用してシェープファイルをインポートすると、SRIDは「-1」のままになります。このツールはEsri PRJを解析し、デフォルトをそのままにするのではなく、SRIDである可能性のある正しい(または少なくとも2、3のオプション)を決定できるように思われます。

または、別のSRIDを選択した場合、インポーターにはその場で再投影する機能がありますか?

私にとっては怠seemに思えるかもしれませんが、私にはこの機能がまだ導入されていないことに興味があります。この概念が機能しているのか、それとも除外されているのには正当な理由があるのか​​誰もが知っていますか?

回答:


9

@iantからアイデアを借り、ここで使用してPRJファイルからEPSGのSRIDの整数コードを検索しますPL /のpython3モジュールであるhttp://prj2epsg.org Webサービスを。

まず、PL / Python3をインストールします。

CREATE LANGUAGE plpython3u;

Python 3用に記述されたコードを持つSQL関数を追加します。

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');

テストShapefileの4326を返します。


これを解決策としてマークします。他のものはすべて素晴らしいですが、私はこのアイデアが大好きです。これで、コーディング機能を備えた誰かがpgAdmin PostGISシェープファイルローダーにこのタイプの機能を含めることができ、SHPの読み取り時に正しいSRIDが自動的に決定されるようになります。指を交差させたままにします。
ライアンダルトン

1
もちろん、インターネット接続が必要であり、実行する必要のある外部Webサービスに依存するという注意点があります。
マイクT

57

GDALには、PROJ4ライブラリへの便利で便利なインターフェイスがあります。

GDAL Pythonバインディングを使用して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

私は2つの問題、このアプローチに出くわした:(1)+proj=longlat +datum=WGS84 +no_defsではありませんspatial_ref_sysあなたはSRIDをルックアップするために出力を使用することはできませんので、テーブル。(2)SRIDプロパティまたはメソッドが見つからないようです(便利なImportFromEPSG(SRID)メソッドがありますが、その逆はありません)
Mike T

4
私は、魔法を行うAutoIdentifyEPSG()メソッドの呼び出しでスクリプトを更新しました;)
capooti

とてもかっこいい。素晴らしい仕事です!
ライアンダルトン

ときgdalsrsinfoogrinfo、あなたを失敗し、これが移動するための方法です!
-kontextify

srs.GetAuthorityCode(None)近いSRIDが識別されない場合、まだ何も返さないことに注意してください。
アストロフアンル

19

それは私がのPostGISのSRIDを使用しますが、彼らはただEPSGコードをしているならば、あなたが使用することができますので、しばらくしているhttp://prj2epsg.org/searchを(壊れた)ESRI.prjファイルからそれらをルックアップします。


これは本当に賢いウェブサイトです。APIを見ると、手順を自動化する素敵なサーバー側スクリプトを作成できます。
マイク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

ずーっと。私も欲しいです。

多くの人々はhttp://spatialreference.orgでそれらを調べるようです

PostGIS(およびPGAdminのPostGISローダー)を使用してシェープファイルをインポートすると、spatial_ref_sysというテーブルでproj情報を検索します。

私が理解したことから、PostGISにパッケージ化された標準のspatial_ref_sysテーブルには、ESRI Spatial参照システムではなく、いくつかの空間参照システムのOGC WKT(Open Geospatial Consortium Well Known Text)表現のみが含まれます。

PostGIS 1.5.2ドキュメントから:>

spatial_ref_sysテーブルは、PostGISに含まれるOGC準拠のデータベーステーブルであり、3001を超える既知の空間参照系と、それらの間の変換/再投影に必要な詳細をリストします。

PostGISのspatial_ref_sysテーブルには、projライブラリで処理できる3000以上のより一般的に使用される空間参照システム定義が含まれていますが、proj4コンストラクトに精通している場合は、人間に知られているすべてを含まず、独自のカスタム投影を定義することもできます。ほとんどの空間参照系は地域的なものであり、意図された範囲外で使用されても意味がありません。

コアセットで定義されていない空間参照系を見つけるための優れたリソースはhttp://spatialreference.org/ です。より一般的に使用される空間参照系の一部は次のとおりです。4326-WGS 84 Long Lat、4269-NAD 83 Long Lat、3395- WGS 84ワールドメルカトル、2163-米国国立アトラス平等地域、各NAD 83の空間参照システム、WGS 84 UTMゾーン-UTMゾーンは測定に最も理想的なゾーンの1つですが、6度の領域のみをカバーしています。

さまざまな米国の州平面空間参照システム(メートルまたはフィートベース)-通常、米国の州ごとに1つまたは2つ存在します。ほとんどのメーターはコアセットに含まれていますが、多くのフィートベースのものまたはESRI作成のものは、spatialreference.orgから取得する必要があります。

ただし、ogr2ogrに はESRI空間参照システムが含まれています。これは最近、他の人の寛大さを通じて学んだことです。

ogr2ogrとspatial_ref_sysの両方で、.projファイルに含まれるテキストは、OGC WKTのテーブルと比較されるようです。OGCWKTは、.projファイルでよく見られるESRI WKT形式とは少し異なるテキスト形式です。また、PostGISが各SRSをどのように検索するかわかりませんが、ESRI WKTとOGC WKTのわずかな違いにより、一致が失敗する可能性があります。

ESGIS空間参照システムをPostGISのデフォルトのspatial_ref_sysテーブルにアタッチするのは簡単だと思われます。誰かがすでにパッチまたはスクリプトを持っているかもしれません。

間違っている可能性があります。過去数日間この問題に遭遇したばかりで、同じことにイライラしていました。たぶん他の誰かが素晴らしいリソースを知っていますか?


1

私が必要になってからしばらく経ちましたが、思い出すように、http: //spatialreference.org/で検索できるようにすることに加えて、prjファイルをアップロードすることもできます。

次に、出力オプションの1つとして、spatial_ref_sysテーブルに挿入する同等のpostgis insertが提供されます。

挿入ステートメントについては、生成されたsridをEPSGまたはESRIのものに置き換えます。主キー違反が発生した場合、そのテーブルに既に存在する可能性が高いことを知っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.