GeoPandas to_file () lưu GeoDataFrame mà không cần hệ tọa độ


13

Tôi có

  • GeoPandas 0.2.1 py27_0
  • fiona 1.7.0 np110py27_1
  • Python 2.7.10

được cài đặt trong môi trường Anaconda 2-4.1.1-Windows-x86. Tôi có thể xây dựng GeoDataFramebằng cách đọc các bộ dữ liệu đầu vào và vận hành dữ liệu nhưng việc lưu bộ dữ liệu đầu ra không bảo toàn hệ tọa độ.

import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world.to_file(driver='ESRI Shapefile',filename=r'C:\GIS\Temp\world_out.shp')

world_out.shpkhông chứa các tính năng và lược đồ của shapefile nguồn, nhưng hệ tọa độ không xác định ( <Unknown>). Các world_out.prjtập tin là 0 KB và không chứa bất cứ điều gì.

out = gpd.read_file(r'C:\GIS\Temp\world_out.shp')
print out.crs
>>> {}

Tôi đã thử nghiệm để thực hiện thao tác này bằng Fiona thuần túy và nó hoạt động tốt, bảo toàn crsthông tin:

import fiona

datasrc_path = r'C:\Program Files (x86)\ArcGIS\Desktop10.4\TemplateData\TemplateData.gdb'

with fiona.drivers():
    with fiona.open(datasrc_path,layer='cities') as source:
        meta = source.meta
        meta['driver'] = 'ESRI Shapefile'
        meta['layer'] = source.name

        with fiona.open(r'C:\GIS\CitiesFiona.shp', 'w', **meta) as sink:
            for f in source:
                sink.write(f)

Các CitiesFiona.prjtập tin có chứa thông tin về hệ tọa độ.

Vì vậy, có vẻ như GeoPandas không thể đọc / ghi crskhung dữ liệu vào tập dữ liệu đầu ra khi gọi to_file()phương thức. Tôi đã thử gọi to_file()vào được GeoDataFramesxây dựng từ nhiều nguồn và bộ dữ liệu khác nhau và thông tin hệ tọa độ không bao giờ có trong bộ dữ liệu đầu ra.

Có ai gặp phải vấn đề này trước đây chưa? Bất cứ ai có thể kiểm tra điều này?

Câu trả lời:


11

Tôi đã đi qua hành vi này trước đây.

Bạn cần truyền một cách rõ ràng chuỗi văn bản (crs_wkt) nổi tiếng vào to_file()phương thức. Chuỗi sau đó sẽ được chuyển đến fiona.open(), ghi ra tệp .prj.

Sử dụng mã mẫu của bạn, làm một cái gì đó như thế này:

ws = r"D:\temp_se"
prj_file = gpd.datasets.get_path('naturalearth_lowres').replace(".shp",".prj")
prj = [l.strip() for l in open(prj_file,'r')][0]
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
temp_shp = os.path.join(ws,"world_out.shp")
world.to_file(filename=temp_shp,driver='ESRI Shapefile',crs_wkt=prj)

nên sản xuất: nhập mô tả hình ảnh ở đây

Các chức năng read_file()to_file()chỉ đơn giản phục vụ như các chức năng bao bọc. Họ gọi fiona.open(), có chữ ký được hiển thị dưới đây:

nhập mô tả hình ảnh ở đây

Bạn cần phải vượt qua một giá trị crs_wkt một cách rõ ràng khi đọc / ghi tệp bằng geopandas.


1
Cảm ơn đã đăng bài này. Đáng ngạc nhiên là đủ, tôi không thể tái tạo vấn đề nữa. Khi chạy mã tôi đã đăng ở trên, tôi nhận được .prjtệp có thông tin về crs. Có thể là do tôi đã nâng cấp fionalên fiona 1.7.0 np110py27_2.
Alex Tereshenkov

Thật không may, vẫn còn vấn đề trong các phiên bản mới hơn. Tôi có geopandas 0.4.1 và fiona 1.8.4.
Vaiaro
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.