“Nitelikleri konuma göre birleştirmek” için bir python seçeneği var mı?


9

join attributes by locationQGIS menüsü Vektör> Veri Yönetim Araçları menüsünde bulunan işlevi yerine getirmeye çalışıyorum . Bunun için bir açık kaynak python seçeneği arıyorum. Arcpy'nin bir spatial joinişlevi olduğunu biliyorum ama bunu ESRI ortamının dışında gerçekleştirmeye çalışıyorum.


1
Eklentiden gerçek Join attributes by locationkomutun kaynak koduna bakmanızı öneririm fTools: doSpatialJoin.pyözellikle compute()yöntem. Bundan herhangi bir UI kodunu ortadan kaldırmak ve düz bir python işlevine dönüştürmek çok zor olmamalıdır.
Lukas Graf

Merhaba ben biraz farklı bir sorun var, ben iki katman arasında bir ortak olup olmadığını kontrol etmek istiyorum! Bunun için bir açık kaynak python seçeneği arıyorum. S.join işlevinin kullanılıp kullanılmadığını test etmek istiyorum ve bunu ESRI ortamının dışında gerçekleştirmeye çalışıyorum.
Rania ben othmen

Yanıtlar:


8

Sen bir göz atmak isteyebilirsiniz düzgün ve Fiona . Fiona, uzaysal dosya içe ve dışa aktarmayı kolaylaştırmak için gdal için bir sargıdır. Şekilli geometri işlevselliği sağlar. İşte size fikir vermek için çok basit bir örnek. Bu çokgen içindeki tüm noktalara çokgen niteliklerini birleştirir.

Kullandığım örnek veriler bu çokgenler ve bu noktalardır .

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']
                        })

Teşekkürler @cengel. Bu beni doğru yola sokacak gibi görünüyor! Aslında çizgiler ve çokgenler ile birleştirmekle ilgileniyorum (özellikle nehirlerin model hücreleriyle kesiştiği yeri bulmak) ve bunun örneğinize göre çalışacağını düşünüyorum.
mishaF

@cengel Bu yöntemleri kullanan eklentileri kullanan qgis istasyonları modül ve gdal kurulumu gerektirir mi?
user25976

@ user25976 Üzgünüz, sorunuzu oldukça anladığımdan emin değilim. Kod örneğim bağımsız bir python betiğidir. Hem fiona hem de düzgün gdal gerektirir.
cengel

@cengel Affedersiniz, açıklığa kavuşturayım (programlama konusunda yeniyim). Bağımsız python komut dosyaları ile ilgili olarak: fiona ve düzgün bir şekilde içe aktarılan bir eklentinin, python veya bilgisayarlarında yüklü modüller olmasa bile QGIS kullanıcıları tarafından kullanılabileceğini mi söylüyorsunuz?
user25976

@ user25976 Bilgisayarlarında kurulu modüllere ihtiyaç duyarlar. Örnek için buraya
cengel

2

Kenarlarda hala biraz pürüzlü olsa da, özellikle dokümantasyon ve örnekler söz konusu olduğunda, ancak geopandaların geleceği parlak görünüyor. Temel olarak panda veri çerçevelerinin gücünü jeo-uzamsal yeteneklerle birleştirir.

Aradığınız işleve sjoin denir

Makinenizin / örneğinizin işlemi gerçekleştirmek için yeterli belleğe sahip olduğundan emin olun

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')

Bu kod parçası uzamsal birleştirme gerçekleştirir, ancak birleştirilmiş şekil dosyasının öznitelikleri boştur. İşaretçi var mı?
Ekim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.