【问题标题】:Finding features of one geodataframe that contain at least one feature from another geodataframe查找一个地理数据框的特征,其中至少包含另一个地理数据框的一个特征
【发布时间】:2022-01-19 19:20:31
【问题描述】:

我有两个多边形层。一个是宗地图层(名称为“parcl”),另一个是多边形图层(名称为“房屋”)。我正在尝试从房屋数据框中找到包含至少一项功能的所有地块。我试图通过如下所示的循环来做到这一点:

same = np.empty((0,parcl.shape[1]))

for i in parcl.index:
  for j in houses.index:
    a = parcl.loc[i]
    b = houses.loc[j]
    if (a.contains(b))==True:
      same.append(a)

很遗憾,我收到以下错误消息:

---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-36-cedb059e5a3b> in <module>()
      5     a = parcl.loc[i]
      6     b = houses.loc[j]
----> 7     if (a.contains(b))==True:
      8       same.append(a)

/usr/local/lib/python3.7/dist-packages/pandas/core/generic.py in __getattr__(self, name)
   5139             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5140                 return self[name]
-> 5141             return object.__getattribute__(self, name)
   5142 
   5143     def __setattr__(self, name: str, value) -> None:

AttributeError: 'Series' object has no attribute 'contains'

任何帮助将不胜感激! :)

【问题讨论】:

    标签: contains geopandas


    【解决方案1】:

    这是sjoin()的简单案例

    • 模拟了一些房屋(矩形)
    • 将一些英国县定义用作地块
    • gdf_containssjoin() 的结果,现在是包含至少一所房子的地块
    • 可视化以证明它有效(绿色包裹)
    import geopandas as gpd
    import shapely.geometry
    import numpy as np
    import requests
    
    
    world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).loc[lambda d: d["iso_a3"].eq("GBR")]
    BOXES = 25
    a, b, c, d = world.total_bounds
    
    # manufactuer some houses
    gdf_houses = gpd.GeoDataFrame(
        geometry=[
            shapely.geometry.box(minx, miny, maxx, maxy)
            for minx, maxx in zip(np.linspace(a, c, BOXES), np.linspace(a, c, BOXES)[1:])
            for miny, maxy in zip(np.linspace(b, d, BOXES), np.linspace(b, d, BOXES)[1:])
        ],
        crs="epsg:4326",
    ).sample(35)
    
    gdf_houses.explore()
    res = requests.get(
        "https://opendata.arcgis.com/datasets/37363d379f4f40fa8c3f0d28eedfdd37_0.geojson"
    )
    gdf_parcl = gpd.GeoDataFrame.from_features(res.json(), crs="epsg:4326")
    
    gdf_contains = gdf_parcl.sjoin(gdf_houses)
    
    m = gdf_parcl.explore(color="grey")
    m = gdf_contains.explore(m=m, color="green")
    m = gdf_houses.explore(m=m, style_kwds=dict(fillOpacity=.9))
    
    m
    

    【讨论】:

    • 谢谢!有效!不过,我有一个简短的问题……如果我想确定既有房子又有井的地块(第三个 shapefile)怎么办。我可以做类似 gdf_contains = gdf_parcl.sjoin([gdf_houses, gdf_wells]) 的事情吗?
    • 几乎...gdf_contains.sjoin(gdf_well) 即包含带有水井的房屋的地块的结果,那么您有包含两者的地块
    • 哦好吧...空间连接只能是迭代的?没有办法通过一个命令获得所需的结果?
    • 然后可以被链接(不像pd.concat()那样迭代)
    • 我有一个问题...空间连接返回的带有房屋的地块多于房屋的数量(在我的例子中,一所房子不能坐在两个地块上)。
    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多