มีตัวเลือกหลามเพื่อ“ เข้าร่วมคุณสมบัติตามตำแหน่ง” หรือไม่?


9

ฉันกำลังพยายามใช้งานฟังก์ชั่นjoin attributes by locationที่พบในเมนู QGIS Vector> เครื่องมือจัดการข้อมูล ฉันกำลังหาตัวเลือก python ของโอเพ่นซอร์สสำหรับสิ่งนี้ ฉันรู้ว่า arcpy มีspatial joinฟังก์ชัน แต่ฉันพยายามทำสิ่งนี้นอกสภาพแวดล้อม ESRI


1
ฉันขอแนะนำให้ดูซอร์สโค้ดของJoin attributes by locationคำสั่งจริงจากfToolsปลั๊กอิน: doSpatialJoin.pyโดยเฉพาะcompute()วิธีการ ไม่ควรยากเกินกว่าที่จะกำจัดรหัส UI ใด ๆ ออกจากนั้นและตัดมันลงไปยังฟังก์ชันหลามธรรมดา
Lukas Graf

สวัสดีฉันมีปัญหาแตกต่างกันเล็กน้อยฉันต้องการตรวจสอบว่ามีข้อต่อระหว่างสองเลเยอร์หรือไม่ฉันกำลังมองหาตัวเลือก python ของโอเพ่นซอร์สสำหรับสิ่งนี้ ฉันต้องการทดสอบว่ามีการใช้งานฟังก์ชั่น s.join หรือไม่และฉันพยายามทำสิ่งนี้นอกสภาพแวดล้อม ESRI .. ทุกคนช่วยฉันได้ไหม!
Rania Ben othmen

คำตอบ:


8

คุณอาจต้องการที่จะดูที่รูปร่างดีและ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']
                        })

ขอบคุณ @cengel ดูเหมือนว่ามันจะทำให้ฉันถูกทาง! จริง ๆ แล้วฉันสนใจที่จะเข้าร่วมกับเส้นและรูปหลายเหลี่ยม (โดยเฉพาะการค้นหาที่แม่น้ำตัดกับเซลล์แบบจำลอง) และฉันคิดว่ามันจะทำงานตามตัวอย่างของคุณ
mishaF

@cengel สถานี qgis ที่ใช้ปลั๊กอินใช้วิธีการเหล่านี้จำเป็นต้องติดตั้งโมดูลและ gdal หรือไม่?
user25976

@ user25976 ขออภัยไม่แน่ใจว่าฉันค่อนข้างเข้าใจคำถามของคุณ ตัวอย่างรหัสของฉันคือสคริปต์หลามแบบสแตนด์อโลน ทั้งฟิโอน่าและหุ่นดีต้องการ gdal
cengel

@cengel ขอโทษฉันให้ฉันอธิบาย (ฉันใหม่กับการเขียนโปรแกรม) เกี่ยวกับสคริปต์ python แบบสแตนด์อโลน: คุณหมายความว่าปลั๊กอินที่เขียนด้วย fiona และการนำเข้าที่มีรูปทรงสามารถใช้งานได้โดยผู้ใช้ QGIS แม้ว่าพวกเขาจะไม่มี python หรือโมดูลที่ติดตั้งในคอมพิวเตอร์
25976

@ user25976 พวกเขาต้องการโมดูลที่ติดตั้งบนคอมพิวเตอร์ของพวกเขา ดูตัวอย่างได้ที่นี่
cengel

2

แม้ว่าจะยังค่อนข้างหยาบรอบ ๆ ขอบโดยเฉพาะอย่างยิ่งเมื่อพูดถึงเอกสารและตัวอย่าง แต่อนาคตของ 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')

โค้ดส่วนนี้ดำเนินการเข้าร่วมเชิงพื้นที่ แต่แอตทริบิวต์ของ shapefile ที่เข้าร่วมนั้นว่างเปล่า ตัวชี้ใด ๆ
เมษายน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.