Apakah ada opsi python untuk "menggabungkan atribut berdasarkan lokasi"?

9

Saya mencoba menjalankan fungsi join attributes by locationseperti yang ditemukan pada menu QGIS, Vektor> Alat Manajemen Data. Saya mencari opsi python open source untuk ini. Saya tahu arcpy memiliki spatial joinfungsi tetapi saya mencoba melakukan ini di luar lingkungan ESRI.

mishaF
sumber
1
Saya akan menyarankan untuk melihat kode sumber dari Join attributes by locationperintah aktual dari fToolsplugin:, doSpatialJoin.pykhususnya compute()metode. Seharusnya tidak terlalu sulit untuk menghilangkan kode UI apa pun dari itu dan menghapusnya ke fungsi python biasa.
Lukas Graf
Hai Saya punya masalah yang sedikit berbeda, saya ingin memeriksa apakah ada sambungan antara dua lapisan! Saya mencari opsi python open source untuk ini. Saya ingin menguji apakah fungsi s.join telah digunakan dan saya mencoba melakukan ini di luar lingkungan ESRI .. Adakah yang bisa membantu saya!
Rania ben othmen

Jawaban:

8

Anda mungkin ingin melihat Shapely dan Fiona . Fiona adalah pembungkus untuk gdal untuk memudahkan impor dan ekspor file spasial. Shapely menyediakan fungsionalitas geometri. Ini adalah contoh yang sangat sederhana untuk memberi Anda ide. Ini menggabungkan atribut poligon ke semua titik dalam poligon itu.

Contoh data yang saya gunakan adalah poligon dan titik-titik ini .

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
sumber
Terima kasih @engel. Ini sepertinya akan menempatkan saya di jalur yang benar! Saya sebenarnya tertarik bergabung dengan garis dan poligon (khusus menemukan di mana sungai berpotongan sel model) dan saya pikir itu akan bekerja mengikuti contoh Anda.
mishaF
@cengel Apakah stasiun qgis menggunakan plugin yang menggunakan metode ini memerlukan pemasangan modul dan gdal?
user25976
@ user25976 maaf, saya tidak yakin saya cukup mengerti pertanyaan Anda. Contoh kode saya adalah skrip python mandiri. Baik fiona dan bentuk membutuhkan gdal.
cengel
@cengel Maaf, izinkan saya mengklarifikasi (saya baru dalam pemrograman). Mengenai skrip python mandiri: maksud Anda, plugin yang ditulis dengan fiona dan impor rupawan dapat digunakan oleh pengguna QGIS bahkan jika mereka tidak memiliki python atau modul yang diinstal pada komputer mereka?
user25976
@ user25976 Mereka perlu modul yang diinstal di komputer mereka. Lihat misalnya di sini
cengel
2

Meskipun masih agak kasar, terutama dalam hal dokumentasi dan contoh, tetapi masa depan geopanda terlihat cerah. Ini pada dasarnya menggabungkan kekuatan panda dataframe dengan kemampuan geospasial dari rupawan.

fungsi yang Anda cari disebut sjoin

Pastikan mesin / instance Anda memiliki memori yang cukup untuk melakukan operasi

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')
RutgerH
sumber
Potongan kode ini melakukan penggabungan spasial tetapi atribut dari shapefile yang bergabung kosong. Ada petunjuk?
April