Chuyển đổi các tệp KML để sử dụng với thư viện Python Shapely


8

Tôi đang cố gắng đưa tệp KML ( wijken.kml ) vào Shapely . Tệp KML được xác thực theo lược đồ XML thích hợp, vì vậy tôi đoán đầu vào là chính xác.

Các tuyến tôi đã thử:

1) Chuyển đổi sang định dạng WKT hoặc WKB và đọc với chức năng xây dựng

Chuyển đổi:

ogr2ogr -f CSV wijken.csv wijken.kml -lco GEOMETRY=AS_WKT
ogr2ogr -f SQLite wijken.wkb wijken.kml

Trong hình dạng:

from shapely import wkt, wkb
f = open('../kml/wijken.wkb')
wkb.load(f) 

Mà cho (tương tự cho wkt()):

ReadingError: Could not create geometry because of errors while reading input.

Vì nó không cung cấp thêm thông tin và mã Python bao bọc các thư viện (C?) Khác, tôi không biết điều gì sai với định dạng. Tệp CSV chứa nhiều cột, có lẽ có gì đó không đúng, nhưng tôi chưa tìm thấy ví dụ WKT trực tuyến có thể so sánh để kiểm tra.

2) Chuyển đổi sang GeoJSON và sử dụng asShapechức năng xây dựng trong hàm Shapely

ogr2ogr2 -f GeoJSON wijken.json wijken.kml

Trong hình dạng:

import json
from shapely.geometry import asShape
f = open('wijken.json', 'r')
js = json.load(f)
f.close()
asShape(js)

Cung cấp cho:

ValueError: Unknown geometry type: featurecollection

Lỗi này là giống nhau đối với một ví dụ GeoJSON tối thiểu, hợp lệ. Nhìn vào mã Shapley, vấn đề là các loại GeoJSON cơ bản như "Feature" và "FeatureCollection" không được nhận dạng. Không rõ tuyến đường nào cần đi từ các tính năng của GeoJSON đến các tính năng mà Shapely hiểu.

3) Đọc bằng KML với fastkml , trả về các đối tượng Shapely

Điều này hoạt động, nhưng dường như mất các thuộc tính / giá trị ExtendedData trong KML (hoặc ít nhất là không truyền nó cho các đối tượng Shapely).

Tôi cảm thấy mình đang thiếu thứ gì đó, thật khó để lấy dữ liệu vào Shapely. Ai đó có thể chỉ cho tôi hướng tới giải pháp mạnh mẽ nhất / làm việc không?

Câu trả lời:


8

Tạo hình mạnh mẽ với các đối tượng hình học, không phải tính năng hoặc bộ sưu tập các tính năng. Xem hướng dẫn về hình dạng () .

Mã của bạn (với JSON) có thể là:

import json
from shapely.geometry import shape
f = open('wijken.json', 'r')
js = json.load(f)
f.close()

for f in js['features']:    
    s = shape(f['geometry'])
    ...

1

Để có được một số dòng và đa giác thành hình dạng, tôi đã sử dụng Bản đồ của tôi tại maps.google.com, xuất nó dưới dạng KML và sau đó sử dụng chức năng nhỏ này:

def ExtractPoints(kml):
  rv = {}
  ns = "{http://earth.google.com/kml/2.2}"
  tree = ElementTree()
  tree.parse(kml)
  for placemark in tree.findall(".//" + ns + "Placemark"):
    name = placemark.findtext(ns + "name")
    print "Found %s" % name
    coordinates_text = placemark.findtext(ns + "LineString/" + ns + "coordinates")
    coordinates = []
    for point_text in coordinates_text.split():
      floats = point_text.split(",")
      coordinates.append((float(floats[0]), float(floats[1])))
    if coordinates[0] == coordinates[-1]:
      rv[name] = Polygon(coordinates)
    else:
      rv[name] = LineString(coordinates)
  return rv

Tái bút: Tôi không thấy cách nào để thêm nhận xét vào câu trả lời của Sean nhưng tự hỏi tại sao anh ta không đề cập đến Keytree, mà tôi đã tìm thấy qua một câu hỏi tương tự khác: Làm cách nào để biết một lat lat cụ thể có trong vòng tuyến tính KML không sử dụng tạo hình?

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.