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?
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?
Câu trả lời:
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 shapely
và geopandas
.
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 geopandas
và shapely
đượ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ư GeoJSON
cũ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 :
Đố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')
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?