是否有python选项可以“按位置连接属性”?


9

我正在尝试执行join attributes by locationQGIS菜单“矢量”>“数据管理工具”上的功能。我正在为此寻找开放源代码的python选项。我知道arcpy具有spatial join功能,但是我正在尝试在ESRI环境之外执行此操作。


1
我建议看一下Join attributes by location来自fToolsplugin:的实际命令的源代码doSpatialJoin.py,尤其是compute()方法。从其中消除任何UI代码并将其剥离为简单的python函数应该不太困难。
卢卡斯·格拉夫

嗨,我有一些不同的问题,我想检查两层之间是否有连接处!我正在为此寻找开放源代码python选项。我想测试是否已使用s.join函数,并且正在尝试在ESRI环境之外执行此操作。任何人都可以帮助我!
Rania ben othmen

Answers:


8

您可能想看看ShapelyFiona。Fiona是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 2013年

@cengel使用采用这些方法的插件的qgis站是否需要安装模块和gdal?
user25976 2014年

@ user25976对不起,不确定我是否完全理解您的问题。我的代码示例是一个独立的python脚本。菲奥娜和身材匀称的都需要盖达尔。
cengel 2014年

@cengel对不起,让我澄清一下(我是编程新手)。关于独立的python脚本:您的意思是说,即使他们没有python或未在计算机上安装模块,QGIS用户也可以使用由fiona编写的插件和有形导入的插件?
user25976 2014年

@ user25976他们确实需要在计算机上安装模块。在这里
cengel,2014年

2

尽管仍然有些困难,尤其是在文档和示例方面,但是大熊猫的前途一片光明。它基本上将熊猫数据框的功能与Shape的地理空间功能结合在一起。

您寻找的功能称为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的属性为空。有指针吗?
4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.