Có thể lấy giá trị EPSG từ lớp OSR SpatialReference bằng API OGR Python không?


21

Khi đọc một lớp từ kết nối OGR PostGIS, tôi có thể nhận được SpatialReference của lớp, nhưng có thể lấy giá trị EPSG không? Có tài liệu nào về điều này?

Ví dụ:

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

Trả về:

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]]

Vậy làm thế nào để tôi có được giá trị EPSG cho phép chiếu? Ví dụ:

srs.GetEPSG()
print srs
27700

Tôi đã thử srs.GetAttrValue('AUTHORITY'), nhưng điều này chỉ trở lại 'EPSG'.


I've tried srs.GetAttrValue('AUTHORITY'), but this just returns 'EPSG'cái nào đúng EPSG là cơ quan có thẩm quyền
nmtoken

Câu trả lời:


30

Đó là một chút chôn vùi, nhưng có một tham số thứ hai cho GetAttrValue () trả về giá trị tại thứ tự đó. Vì vậy, tôi có thể làm:

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'

Sau khi chơi một chút, tôi thấy bạn có thể nhận giá trị cho bất kỳ tham số nào bằng cách sử dụng đường ống |làm dấu phân cách đường dẫn:

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

Có thể được sử dụng trong việc tìm kiếm hệ tọa độ địa lý của một CS được chiếu:

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

1
Cảm ơn, điều đó thật tuyệt. Tôi sẽ thực hiện nó. Tôi đã hết thời gian để tiếp tục 'chơi về' - việc phát triển ứng dụng nhanh chóng bị trì hoãn do thiếu tài liệu GDAL / OGR một lần nữa!
Tomas

Tôi đã thử hàm GetAttrValue với các đối số "AUTHORITY" và "1" và nhận thấy không phải lúc nào nó cũng trả về mã EPSG vì mã EPSG không phải lúc nào cũng được bao gồm trong WKT. Tôi vẫn còn hơi mơ hồ về lý do tại sao lại như vậy. Tôi tìm thấy giải pháp sau để hoạt động tốt cho nhu cầu của mình: gis.stackexchange.com/questions/7608/ mẹo
Burrow

5

Đây là một đoạn mã đã làm việc cho tôi:

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()lấy Nonenhư một tham số, tìm thấy một nút thẩm quyền trên phần tử gốc (nghĩa là dự kiến ​​/ địa lý là phù hợp). Áp dụng tương tự cho 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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.