Чи є можливість python "приєднати атрибути за місцем розташування"?


9

Я намагаюся виконувати функцію join attributes by location, яку знайдено в меню QGIS Вектор> Інструменти управління даними. Я шукаю для цього варіант з відкритим кодом python. Я знаю, що arcpy має spatial joinфункцію, але я намагаюся виконувати це поза середовищем ESRI.


1
Я б запропонував переглянути вихідний код фактичної Join attributes by locationкоманди з fToolsплагіна:, doSpatialJoin.pyзокрема, compute()метод. Не повинно бути занадто важким, щоб усунути з цього будь-який код інтерфейсу та відключити його до простої функції пітона.
Лукас Граф

Привіт У мене є дещо інша проблема, я хочу перевірити, чи є стик між двома шарами! Я шукаю варіант з відкритим кодом python для цього. Я хочу перевірити, чи була використана функція s.join, і я намагаюся виконувати це за межами середовища ESRI. Чи може хто-небудь допомогти мені, будь ласка!
Rania ben othmen

Відповіді:


8

Ви можете поглянути на Shapely та Fiona . Fiona - це обгортка для gdal, щоб полегшити імпорт та експорт просторових файлів. Shapely забезпечує функціональність геометрії. Ось дуже простий приклад, щоб дати вам ідею. Він приєднує атрибути полігону до всіх точок цього полігону.

Прикладними даними, які я використав, є ці багатокутники та ці точки .

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?
користувач25976

@ user25976 Вибачте, не впевнений, що я цілком розумію ваше запитання. Мій приклад коду - це окремий сценарій python. І фіона, і струнка вимагають gdal.
cengel

@cengel Вибачте, дозвольте уточнити (я новачок у програмуванні). Що стосується автономних сценаріїв python: ви маєте на увазі, що плагін, написаний разом із fiona та імпортним імпортом, може бути використаний користувачами QGIS, навіть якщо у них на комп'ютері не встановлено python чи модулі?
користувач25976

@ user25976 Їм потрібні модулі, встановлені на їхньому комп’ютері. Дивіться, наприклад, тут
cengel

2

Хоча все ще трохи шорстко по краях, особливо якщо мова йде про документацію та приклади, але майбутнє геопанд виглядає яскравим. Він в основному поєднує в собі потужність фреймів даних панд з геопросторовими можливостями стрункого.

функція, яку ви шукаєте, називається 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')

Цей фрагмент коду виконує просторове з'єднання, але атрибути об'єднаного файлу форм порожні. Якісь покажчики?
квітня
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.