ฉันกำลังพยายามใช้งานฟังก์ชั่นjoin attributes by location
ที่พบในเมนู QGIS Vector> เครื่องมือจัดการข้อมูล ฉันกำลังหาตัวเลือก python ของโอเพ่นซอร์สสำหรับสิ่งนี้ ฉันรู้ว่า arcpy มีspatial join
ฟังก์ชัน แต่ฉันพยายามทำสิ่งนี้นอกสภาพแวดล้อม ESRI
ฉันกำลังพยายามใช้งานฟังก์ชั่นjoin attributes by location
ที่พบในเมนู QGIS Vector> เครื่องมือจัดการข้อมูล ฉันกำลังหาตัวเลือก python ของโอเพ่นซอร์สสำหรับสิ่งนี้ ฉันรู้ว่า arcpy มีspatial join
ฟังก์ชัน แต่ฉันพยายามทำสิ่งนี้นอกสภาพแวดล้อม ESRI
คำตอบ:
คุณอาจต้องการที่จะดูที่รูปร่างดีและFiona Fiona เป็น wrapper สำหรับ gdal เพื่อให้สามารถนำเข้าและส่งออกไฟล์อวกาศ หุ่นดีให้ฟังก์ชั่นรูปทรงเรขาคณิต นี่เป็นตัวอย่างที่ง่ายมากที่จะให้ความคิดแก่คุณ มันรวมแอตทริบิวต์รูปหลายเหลี่ยมไปยังจุดทั้งหมดภายในรูปหลายเหลี่ยมนั้น
ข้อมูลตัวอย่างเช่นฉันได้ใช้เป็นรูปหลายเหลี่ยมเหล่านี้และจุดเหล่านี้
import fiona
from shapely.geometry import shape
from copy import deepcopy
with fiona.open("planning_neighborhoods.shp", "r") as n:
with fiona.open("Schools_Private_Pt.shp", "r") as s:
# create a schema for the attributes
outSchema = deepcopy(s.schema)
outSchema['properties'].update(n.schema['properties'])
with fiona.open ("Schools_withNbhd.shp", "w", s.driver, outSchema, s.crs) as output:
for school in s:
for neighborhood in n:
# check if point is in polygon and set attribute
if shape(school['geometry']).within(shape(neighborhood['geometry'])):
school['properties']['neighborho'] = neighborhood['properties']['neighborho']
# write out
output.write({
'properties': school['properties'],
'geometry': school['geometry']
})
แม้ว่าจะยังค่อนข้างหยาบรอบ ๆ ขอบโดยเฉพาะอย่างยิ่งเมื่อพูดถึงเอกสารและตัวอย่าง แต่อนาคตของ geopandas ดูสดใส มันเป็นการรวมพลังของดาต้าเบสแพนด้ากับความสามารถเชิงพื้นที่ของหุ่นดี
ฟังก์ชั่นที่คุณมองหาเรียกว่าsjoin
ตรวจสอบว่าเครื่อง / อินสแตนซ์ของคุณมีหน่วยความจำเพียงพอที่จะทำการดำเนินการ
import geopandas as gpd
import pandas as pd
import os
gdfLeft = gpd.read_file(os.path.join(PATH,INPUT_FILE_NAME_1))
gdfRight = gpd.read_file(os.path.join(PATH,INPUT_FILE_NAME_2))
gdfJoined = gpd.sjoin(gdfLeft, gdfRight, how="left", op='intersects')
Join attributes by location
คำสั่งจริงจากfTools
ปลั๊กอิน:doSpatialJoin.py
โดยเฉพาะcompute()
วิธีการ ไม่ควรยากเกินกว่าที่จะกำจัดรหัส UI ใด ๆ ออกจากนั้นและตัดมันลงไปยังฟังก์ชันหลามธรรมดา