क्या ओजीआर पायथन एपीआई का उपयोग करके ओएसआर स्पैटियलरेंस क्लास से ईपीएसजी मूल्य प्राप्त करना संभव है?


21

OGR PostGIS कनेक्शन से एक लेयर को पढ़ते समय मैं लेयर के स्थानिक संदर्भ प्राप्त कर सकता हूं, लेकिन क्या EPSG मान प्राप्त करना संभव है? क्या इस पर कोई दस्तावेज है?

उदाहरण के लिए:

lyr = conn.GetLayerByName(tbl) # Where conn is OGR PG connection
srs = ly.GetSpatialRef()
print srs

यह दिखाता है:

PROJCS["OSGB 1936 / British National Grid",
GEOGCS["OSGB 1936",
    DATUM["OSGB_1936",
        SPHEROID["Airy 1830",6377563.396,299.3249646,
            AUTHORITY["EPSG","7001"]],
        AUTHORITY["EPSG","6277"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4277"]],
UNIT["metre",1,
    AUTHORITY["EPSG","9001"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",49],
PARAMETER["central_meridian",-2],
PARAMETER["scale_factor",0.9996012717],
PARAMETER["false_easting",400000],
PARAMETER["false_northing",-100000],
AUTHORITY["EPSG","27700"],
AXIS["Easting",EAST],
AXIS["Northing",NORTH]]

तो मुझे प्रक्षेपण के लिए ईपीएसजी मूल्य कैसे मिलेगा? उदाहरण के लिए:

srs.GetEPSG()
print srs
27700

मैंने कोशिश की है srs.GetAttrValue('AUTHORITY'), लेकिन यह सिर्फ लौटता है 'EPSG'


I've tried srs.GetAttrValue('AUTHORITY'), but this just returns 'EPSG'क्या सही है।
ईपीएसजी

जवाबों:


30

यह थोड़ा दफन है, लेकिन GetAttrValue () के लिए एक दूसरा पैरामीटर है जो उस क्रम पर मूल्य लौटाता है। तो मैं कर सकता हूँ:

In [1]: import osgeo.osr as osr

In [2]: srs = osr.SpatialReference()

In [3]: srs.SetFromUserInput("EPSG:27700")
Out[3]: 0

In [4]: print srs
PROJCS["OSGB 1936 / British National Grid",
    GEOGCS["OSGB 1936",
        DATUM["OSGB_1936",
            SPHEROID["Airy 1830",6377563.396,299.3249646,
                AUTHORITY["EPSG","7001"]],
            TOWGS84[375,-111,431,0,0,0,0],
            AUTHORITY["EPSG","6277"]],
        PRIMEM["Greenwich",0,
            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4277"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",49],
    PARAMETER["central_meridian",-2],
    PARAMETER["scale_factor",0.9996012717],
    PARAMETER["false_easting",400000],
    PARAMETER["false_northing",-100000],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","27700"]]

In [5]: srs.GetAttrValue("AUTHORITY", 0)
Out[5]: 'EPSG'

In [6]: srs.GetAttrValue("AUTHORITY", 1)
Out[6]: '27700'

थोड़ा सा खेलने के बाद, मैंने पाया है कि आप |पथ विभाजक के रूप में पाइप का उपयोग करके किसी भी पैरामीटर के लिए मूल्य प्राप्त कर सकते हैं :

In [12]: srs.GetAttrValue("PRIMEM|AUTHORITY", 1)
Out[12]: '8901'

जो एक अनुमानित सीएस की भौगोलिक समन्वय प्रणाली खोजने में उपयोग किया जा सकता है:

In [13]: srs.GetAttrValue("PROJCS|GEOGCS|AUTHORITY", 1)
Out[13]: '4277'

1
धन्यवाद, यह बहुत अच्छा है। मैं इसे लागू करूंगा। मैं आगे 'के बारे में खेल' के लिए समय से बाहर चला गया था - तेजी से अनुप्रयोग विकास GDAL / OGR प्रलेखन की कमी से एक बार फिर से आयोजित किया जा रहा है!
टॉमस

मैंने "AUTHORITY" और "1" तर्कों के साथ GetAttrValue फ़ंक्शन की कोशिश की और ध्यान दिया कि यह हमेशा EPSG कोड वापस नहीं करता है क्योंकि EPSG कोड हमेशा WKT में शामिल नहीं होता है। मैं अभी भी थोड़ा फजी हूं कि यह मामला क्यों है। मुझे अपनी आवश्यकताओं के लिए अच्छी तरह से काम करने के लिए निम्नलिखित समाधान मिला: gis.stackexchange.com/questions/7608/…
Burrow

5

यहाँ एक कोड स्निपेट है जो मेरे लिए काम करता है:

def wkt2epsg(wkt, epsg='/usr/local/share/proj/epsg', forceProj4=False):
''' Transform a WKT string to an EPSG code

Arguments
---------

wkt: WKT definition
epsg: the proj.4 epsg file (defaults to '/usr/local/share/proj/epsg')
forceProj4: whether to perform brute force proj4 epsg file check (last resort)

Returns: EPSG code

'''
code = None
p_in = osr.SpatialReference()
s = p_in.ImportFromWkt(wkt)
if s == 5:  # invalid WKT
    return None
if p_in.IsLocal() == 1:  # this is a local definition
    return p_in.ExportToWkt()
if p_in.IsGeographic() == 1:  # this is a geographic srs
    cstype = 'GEOGCS'
else:  # this is a projected srs
    cstype = 'PROJCS'
an = p_in.GetAuthorityName(cstype)
ac = p_in.GetAuthorityCode(cstype)
if an is not None and ac is not None:  # return the EPSG code
    return '%s:%s' % \
        (p_in.GetAuthorityName(cstype), p_in.GetAuthorityCode(cstype))
else:  # try brute force approach by grokking proj epsg definition file
    p_out = p_in.ExportToProj4()
    if p_out:
        if forceProj4 is True:
            return p_out
        f = open(epsg)
        for line in f:
            if line.find(p_out) != -1:
                m = re.search('<(\\d+)>', line)
                if m:
                    code = m.group(1)
                    break
        if code:  # match
            return 'EPSG:%s' % code
        else:  # no match
            return None
    else:
        return None

0

SpatialReference.GetAuthorityCode()Noneएक पैरामीटर के रूप में लेता है , जो रूट एलिमेंट पर अथॉरिटी नोड ढूंढता है (जैसे कि प्रॉजेक्टेड / जियोग्राफिक उपयुक्त)। उसी पर लागू होता है GetAuthorityName():

In [1]: import osgeo.osr as osr

In [2]: srs = osr.SpatialReference()

In [3]: srs.SetFromUserInput("EPSG:27700")
Out[3]: 0

In [4]: srs.GetAuthorityCode(None)
Out[4]: '27700'

In [5]: srs.GetAuthorityCode(None)
Out[5]: 'EPSG'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.