ওজিআর পাইথন এপিআই ব্যবহার করে কোনও ওএসআর স্পেশাল রেফারেন্স ক্লাস থেকে ইপিএসজি মান পাওয়া কি সম্ভব?


21

ওজিআর পোস্টজিআইএস সংযোগ থেকে একটি স্তর পড়ার সময় আমি স্তরের স্পেসিয়াল রেফারেন্স পেতে পারি, তবে ইপিএসজি মান পাওয়া কি সম্ভব? এটিতে কোনও দলিল আছে?

উদাহরণ স্বরূপ:

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 () এর দ্বিতীয় প্যারামিটার রয়েছে যা সেই অর্ডিনালের মানটি দেয় returns সুতরাং আমি এটি করতে পারি:

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
ধন্যবাদ, দুর্দান্ত। আমি এটি বাস্তবায়ন করব। আমি আরও 'খেলার' জন্য সময় নষ্ট করেছিলাম - আবারও জিডিএল / ওজিআর ডকুমেন্টেশনের অভাবে দ্রুত অ্যাপ্লিকেশন বিকাশ ধরে রাখা হচ্ছে!
টমাস

আমি "অথোরিটি" এবং "1" যুক্তি দিয়ে গেটআটারভ্যালু ফাংশনটি চেষ্টা করেছি এবং লক্ষ্য করেছি যে এটি সর্বদা EPSG কোডটি ফেরায় না কারণ ইপিএসজি কোড সর্বদা ডাব্লুকেটিতে অন্তর্ভুক্ত থাকে না। কেন এই ঘটনা তা নিয়ে আমি এখনও কিছুটা অস্পষ্ট। : আমি ভাল আমার প্রয়োজনের জন্য কাজ করার জন্য নিম্নলিখিত সমাধান পাওয়া gis.stackexchange.com/questions/7608/...
গর্ত করা

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