ทำ shapefile จากดาต้าดาต้าเฟรม


12

ฉันต้องการสร้าง shapefile จากเฟรมข้อมูล Pandas โดยใช้แถว lon & lat

ฉันมีไฟล์ csv และฉันประมวลผลด้วยแพนด้าเพื่อทำเฟรมข้อมูลซึ่งง่ายต่อการจัดการ

มันเป็นไปได้ไหมที่จะทำอย่างนั้นโดยไม่ต้องทำ loop loop ทีละบรรทัด


ถ้าเป็น csv คุณสามารถใช้เพิ่มข้อมูล XY ใน ArcMap เพื่อสร้างเลเยอร์จากนั้นส่งออกเป็นรูปร่างไฟล์ (เลเยอร์ rt-click แล้วเลือกข้อมูลส่งออกข้อมูล)
mkennedy

ขอบคุณ แต่ฉันต้องการทำเช่นนั้นเพื่อสร้างสคริปต์ไพ ธ อน ไม่จำเป็นต้องใช้ GIS
kamome

1
ใช้GeoPandas
ยีน

อ่าเข้าใจแล้ว บางทีฉันอาจจะลบความคิดเห็นของฉัน!
mkennedy

คำตอบ:


17

สายเล็ก ๆ น้อย ๆ แต่อาจมีประโยชน์สำหรับผู้อื่น ใช่ว่าสามารถทำได้ด้วยและshapelygeopandas

สมมติว่าแพนด้าของคุณมีลักษณะดังนี้

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 :

ส่งผลให้ shapefile


2
สวัสดีฉันมีสถานการณ์ที่คล้ายกัน แต่แทนที่จะเป็นคะแนนฉันมีรูปหลายเหลี่ยม เป็นไปได้ไหมที่จะทำสิ่งที่คล้ายกัน df ['เรขาคณิต'] = df.apply (lambda x: Point ((float (x.lon), float (x.lat))), Axis = 1) แต่มีรูปหลายเหลี่ยม?
Valerio D. Ciotti

4

สำหรับ 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 ระบบพิกัดไม่เป็นที่รู้จัก ผมทำอะไรผิดหรือเปล่า?
FaCoffee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.