ฉันต้องการสร้าง shapefile จากเฟรมข้อมูล Pandas โดยใช้แถว lon & lat
ฉันมีไฟล์ csv และฉันประมวลผลด้วยแพนด้าเพื่อทำเฟรมข้อมูลซึ่งง่ายต่อการจัดการ
มันเป็นไปได้ไหมที่จะทำอย่างนั้นโดยไม่ต้องทำ loop loop ทีละบรรทัด
ฉันต้องการสร้าง shapefile จากเฟรมข้อมูล Pandas โดยใช้แถว lon & lat
ฉันมีไฟล์ csv และฉันประมวลผลด้วยแพนด้าเพื่อทำเฟรมข้อมูลซึ่งง่ายต่อการจัดการ
มันเป็นไปได้ไหมที่จะทำอย่างนั้นโดยไม่ต้องทำ loop loop ทีละบรรทัด
คำตอบ:
สายเล็ก ๆ น้อย ๆ แต่อาจมีประโยชน์สำหรับผู้อื่น ใช่ว่าสามารถทำได้ด้วยและshapely
geopandas
สมมติว่าแพนด้าของคุณมีลักษณะดังนี้
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
ก่อนอื่นตรวจสอบให้แน่ใจgeopandas
และshapely
ติดตั้งอย่างถูกต้องซึ่งบางครั้งไม่ใช่เรื่องง่ายเพราะมาพร้อมกับการพึ่งพา (เช่น GEOS และ GDAL) หากไม่สามารถลองใช้งานได้ในตอนแรกให้pip install geopandas shapely
ค้นหาข้อผิดพลาดใน Google หรือ StackOverflow / Gis.Stackexchange เพราะอาจเป็นไปได้ที่จะมีคำตอบให้คุณในการแก้ปัญหานั้น
จากนั้นเป็นเพียงเรื่องของการสร้างคอลัมน์รูปทรงเรขาคณิตใหม่ใน dataframe ของคุณซึ่งรวมค่า lat และ lon เข้ากับshapely Point()
วัตถุ โปรดทราบว่าPoint()
คอนสตรัคคาดว่า tuple ของค่าลอยเพื่อการแปลงจะต้องรวมถ้า dtypes คอลัมน์ dataframe 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)
ตอนนี้แปลงหมีแพนด้า DataFrame GeoDataFrame
เป็น คอนสตรัคเตอร์ geopandas คาดว่าคอลัมน์รูปทรงเรขาคณิตซึ่งอาจประกอบด้วยวัตถุรูปทรงเรขาคณิตที่สวยงามดังนั้นคอลัมน์ที่เราสร้างขึ้นนั้นใช้ได้ดี:
import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')
ในการถ่ายโอนข้อมูล GeoDataFrame นี้ให้เป็น shapefile ให้ใช้to_file()
วิธีการของ geopandas (ไดรเวอร์อื่น ๆ ที่สนับสนุนโดยFionaเช่นGeoJSON
ควรทำงาน):
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
และนั่นคือสิ่งที่รูปร่างไฟล์ผลลัพธ์ดูเหมือนเมื่อแสดงภาพด้วยQGIS :
สำหรับ ArcMap คุณต้องกำหนดการฉายภาพก่อนที่จะส่งออกไปยัง 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"
ในการฉายรูปร่างไฟล์ของฉันตาม British National Grid อย่างไรก็ตามเมื่อฉันเปิดใน ArcGIS ระบบพิกัดไม่เป็นที่รู้จัก ผมทำอะไรผิดหรือเปล่า?