Làm shapefile từ khung dữ liệu Pandas?


12

Tôi muốn xây dựng một shapefile từ Khung dữ liệu Pandas bằng cách sử dụng các hàng lon & lat.

Tôi đã có một tệp csv và tôi xử lý nó với gấu trúc để tạo khung dữ liệu dễ xử lý hơn

Có thể làm điều đó mà không thực hiện một vòng lặp theo từng dòng?


Nếu là csv, bạn có thể sử dụng Thêm dữ liệu XY trong ArcMap để tạo một lớp, sau đó xuất dưới dạng shapefile (lớp rt-click và chọn dữ liệu, xuất dữ liệu)?
mkennedy

Cảm ơn. Nhưng tôi muốn làm điều đó để tạo ra một kịch bản python. Không cần GIS
kamome

1
sử dụng GeoPandas
gen

À, hiểu rồi Có lẽ tôi sẽ xóa bình luận của tôi!
mkennedy

Câu trả lời:


16

Một chút muộn nhưng cũng có thể hữu ích cho những người khác. Vâng, điều đó có thể được thực hiện với shapelygeopandas.

Giả sử rằng loại cơ sở dữ liệu gấu trúc của bạn trông như thế này:

import pandas as pd
data = [
        {'some_attribute': 'abc', 'lat': '50.1234', 'lon': '10.4023'},
        {'some_attribute': 'def', 'lat': '40.5678', 'lon': '8.3365'},
        {'some_attribute': 'ghi', 'lat': '60.9012', 'lon': '6.2541'},
        {'some_attribute': 'jkl', 'lat': '45.3456', 'lon': '12.5478'},
        {'some_attribute': 'mno', 'lat': '35.7890', 'lon': '14.3957'},
        ]

df = pd.DataFrame(data)
print(df)

=>

       lat      lon some_attribute
0  50.1234  10.4023            abc
1  40.5678   8.3365            def
2  60.9012   6.2541            ghi
3  45.3456  12.5478            jkl
4  35.7890  14.3957            mno

Trước tiên, hãy chắc chắn rằng geopandasshapelyđược cài đặt đúng cách đôi khi không dễ dàng vì chúng đi kèm với một số phụ thuộc (ví dụ GEOS và GDAL). Nếu lần đầu tiên không hoạt động pip install geopandas shapely, hãy tìm kiếm lỗi trên Google hoặc StackOverflow / Gis.Stackexchange vì rất có thể sẽ có câu trả lời giải quyết vấn đề đó cho bạn.

Sau đó, vấn đề chỉ là tạo một cột hình học mới trong khung dữ liệu của bạn kết hợp các giá trị lat và lon thành một shapely Point()đối tượng. Lưu ý rằng hàm Point()tạo dự kiến ​​một bộ giá trị float, do đó, phải bao gồm chuyển đổi nếu các kiểu mẫu cột của khung dữ liệu chưa được đặt thành float.

from shapely.geometry import Point

# combine lat and lon column to a shapely Point() object
df['geometry'] = df.apply(lambda x: Point((float(x.lon), float(x.lat))), axis=1)

Bây giờ, chuyển đổi DataFrame của gấu trúc thành a GeoDataFrame. Hàm tạo geopandas mong đợi một cột hình học có thể bao gồm các đối tượng hình học có hình dạng, vì vậy cột chúng ta tạo ra là tốt:

import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')

Để kết xuất GeoDataFrame này vào một shapefile, hãy sử dụng to_file()phương pháp của geopandas (các trình điều khiển khác được Fiona hỗ trợ, chẳng hạn như GeoJSONcũng nên hoạt động):

df.to_file('MyGeometries.shp', driver='ESRI Shapefile')

Và đó là hình dạng của shapefile khi hiển thị với QGIS :

Kết quả shapefile


2
Xin chào, tôi có một tình huống tương tự, nhưng thay vì điểm, tôi có đa giác. Có thể làm một cái gì đó tương tự df ['hình học'] = df.apply (lambda x: Point ((float (x.lon), float (x.lat))), trục = 1) nhưng với đa giác?
Valerio D. Ciotti

4

Đối với ArcMap, bạn cần xác định Phép chiếu trước khi xuất sang Shapefile.

import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')

# proj WGS84

df.crs= "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"

df.to_file('MyGeometries.shp', driver='ESRI Shapefile')

Tôi đã làm một cái gì đó tương tự, sử dụng df.crs= "+init=epsg:27700"để chiếu shapefile của mình theo National National Grid. Tuy nhiên, khi tôi mở nó trong ArcGIS, hệ thống tọa độ không xác định. Tôi đang làm gì sai?
FaCoffee
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.