Ánh xạ giữa các loại dữ liệu OGR và Python?


8

Tôi đang viết một shapefile bằng OGR trong python, tạo các trường đang hoạt động từ nguồn dữ liệu của python. Tạo một trường mới yêu cầu loại dữ liệu OGR, có ánh xạ giữa các loại dữ liệu OGR và python không?

Ví dụ: đây sẽ là chuẩn mực:

new_field = ogr.FieldDefn('MYFLD', ogr.OFTInteger)

Lý tưởng nhất:

ogr_datatype = get_ogr_data_type(python_data)
new_field = ogr.FieldDefn('MYFLD', ogr_datatype)

Hiện tại các chuyển đổi của tôi được mã hóa cứng (ví dụ int = ogr.OFTInteger), nhưng điều này hơi đau và phụ thuộc vào tôi mã hóa tất cả các loại dữ liệu có thể.


Tôi nghĩ rằng trình bao bọc geodjango ogr là trình bao bọc tốt nhất mà tôi từng sử dụng. Nó cung cấp một cách rất trực quan để mô tả các tính năng địa lý. Bạn có thể tìm thêm thông tin về nó trong trang web geodjango .
xiao

Câu trả lời:


9

Bạn sẽ phải tạo một từ điển các loại Python thành "loại" OGR vì chúng chỉ là số nguyên. Đó là một chút đau đớn tôi cấp cho bạn, nhưng OGR (và các ràng buộc do SWIG tạo ra) không có khái niệm về các loại ngôn ngữ cho dù đó là bằng C hay Python.

Một cái gì đó như thế này sẽ hoạt động:

OGRTypes = {int: ogr.OFTInteger, str: ogr.OFTString, ...}

...

new_field = ogr.FieldDefn('MYFLD', OGRTypes[type(python_data)])

7

Để biết giá trị của nó, tôi đã có một gói Python chứa ánh xạ như vậy. Xem https://github.com/Toblerity/Fiona/blob/master/src/fiona/ogrext.pyx#L18 . Sao chép tại đây:

# Mapping of OGR integer field types to Fiona field type names.
#
# Only ints, floats, and unicode strings are supported. On the web, dates and
# times are represented as strings (see RFC 3339). 
FIELD_TYPES = [
    'int',          # OFTInteger, Simple 32bit integer
    None,           # OFTIntegerList, List of 32bit integers
    'float',       # OFTReal, Double Precision floating point
    None,           # OFTRealList, List of doubles
    'str',          # OFTString, String of ASCII chars
    None,           # OFTStringList, Array of strings
    None,           # OFTWideString, deprecated
    None,           # OFTWideStringList, deprecated
    None,           # OFTBinary, Raw Binary data
    None,           # OFTDate, Date
    None,           # OFTTime, Time
    None,           # OFTDateTime, Date and Time
    ]

# Mapping of Fiona field type names to Python types.
FIELD_TYPES_MAP = {
    'int':      IntType,
    'float':    FloatType,
    'str':      UnicodeType,
    }

Ánh xạ của tôi không đầy đủ vì tôi không chạy vào nhiều trường OFT * Liệt kê. Bạn muốn ánh xạ các mảng này sang mảng Python, tôi cho rằng (ví dụ OFTIntegerList -> mảng ('i')) vì danh sách của Python không được gõ. Các trường OFTDate / Time là ma quỷ và ánh xạ chúng vào Python DateTime sẽ không làm cho tình hình trở nên tốt hơn vì API mô-đun datetime là khủng khiếp. Trong dự án của tôi, tôi sẽ ánh xạ ngày và thời gian tới các chuỗi ISO 8601 như "2012-01-02T20: 59: 38Z". Dữ liệu nhị phân thô sẽ được ánh xạ tới chuỗi Python không unicode (trở thành kiểu byte trong Python 3).


Sẽ đề cập đến fiona và sau đó tôi cuộn xuống và thấy bạn đã đăng :)
Nathan W

1

Nếu mục tiêu của bạn chỉ đơn giản là chỉnh sửa shapefile trong Python, hãy xem PyShp:

http://code.google.com.vn/p/pyshp/

Đó là python thuần nên bạn chỉ sử dụng các loại dữ liệu python. Tôi cũng có các ví dụ về các hoạt động hình học và thuộc tính phổ biến trên GeospatialPython.com

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.