เป็นไปได้หรือไม่ที่จะรับค่า EPSG จากคลาส OSR SpatialReference โดยใช้ OGR Python API


21

เมื่ออ่านเลเยอร์จากการเชื่อมต่อ OGR PostGIS ฉันจะได้รับ SpatialReference ของเลเยอร์ แต่เป็นไปได้หรือไม่ที่จะรับค่า 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]]

ดังนั้นฉันจะรับค่า EPSG สำหรับการฉายได้อย่างไร เช่น:

srs.GetEPSG()
print srs
27700

ฉันพยายามsrs.GetAttrValue('AUTHORITY')แล้ว แต่สิ่งนี้จะกลับมา'EPSG'อีกครั้ง


I've tried srs.GetAttrValue('AUTHORITY'), but this just returns 'EPSG'ซึ่งถูกต้อง กำไรต่อหุ้นคืออำนาจ
nmtoken

คำตอบ:


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'

ซึ่งอาจใช้ในการค้นหาระบบพิกัดทางภูมิศาสตร์ของ CS ที่คาดการณ์ไว้:

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

1
ขอบคุณมาก ฉันจะใช้มัน ฉันหมดเวลาสำหรับ 'เล่นเกี่ยวกับ' - การพัฒนาแอปพลิเคชันอย่างรวดเร็วถูกจัดขึ้นโดยขาดเอกสาร GDAL / OGR อีกครั้ง!
โทมัส

ฉันลองใช้ฟังก์ชัน GetAttrValue ด้วยอาร์กิวเมนต์ "AUTHORITY" และ "1" และสังเกตว่ามันไม่ได้ส่งคืนรหัส 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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.