当前位置: 首页 > 知识库问答 >
问题:

删除具有一个或多个公共侧部的多边形

轩辕炎彬
2023-03-14

我试图解决多边形与其他多边形比较的特殊情况。我有五个多边形分布如下图。面积最大的是黑色多边形。

可能还有其他类似的情况,主要规则是删除所有具有一个或多个公共边部分的多边形中最小的多边形。

此案例的数据位于GeoJson文件中,如下所示:

{"type":"FeatureCollection","features":[
    {"type":"Feature","properties":{"id":1},"geometry":{"type":"Polygon","coordinates":[[[3.4545135498046875,45.533288879467456],[3.4960556030273433,45.533288879467456],[3.4960556030273433,45.57055337226086],[3.4545135498046875,45.57055337226086],[3.4545135498046875,45.533288879467456]]]}},
    {"type":"Feature","properties":{"id":2},"geometry":{"type":"Polygon","coordinates":[[[3.4545135498046875,45.52917023833511],[3.4960556030273433,45.52917023833511],[3.4960556030273433,45.53891018749409],[3.4545135498046875,45.53891018749409],[3.4545135498046875,45.52917023833511]]]}},
    {"type":"Feature","properties":{"id":3},"geometry":{"type":"Polygon","coordinates":[[[3.4845542907714844,45.5298015824607],[3.5159683227539062,45.5298015824607],[3.5159683227539062,45.543388795387294],[3.4845542907714844,45.543388795387294],[3.4845542907714844,45.5298015824607]]]}},
    {"type":"Feature","properties":{"id":4},"geometry":{"type":"Polygon","coordinates":[[[3.465328216552734,45.542667432984864],[3.4735679626464844,45.542667432984864],[3.4735679626464844,45.5478369923404],[3.465328216552734,45.5478369923404],[3.465328216552734,45.542667432984864]]]}},
    {"type":"Feature","properties":{"id":5},"geometry":{"type":"Polygon","coordinates":[[[3.4545138850808144,45.56799974017372],[3.4588050842285156,45.56799974017372],[3.4588050842285156,45.57055290285386],[3.4545138850808144,45.57055290285386],[3.4545138850808144,45.56799974017372]]]}}]}

是否有只删除两个蓝色多边形(id 2和5)的解决方案?在python中。

通过将多边形转换为LineString,人们可以查看一个LineString是否是另一个LineString的一部分?但是我不知道怎么做。或者也许是想看看黑色和蓝色多边形的LineString是否有两个以上的共同点?但是我们不能将LineString转换为两个以上的点。

共有1个答案

东方明亮
2023-03-14

使用共享_路径可以正确调用多边形1、2和5之间的路径重叠,以下方法可能适用于您:

import json
import shapely as sh
import shapely.ops as ops
import shapely.geometry as geo

with open('./test.json') as f:
  features = json.load(f)['features']

for f1 in features:
  for f2 in features:
    id1 = f1['properties']['id']
    id2 = f2['properties']['id']
    if int(id1) > int(id2):
      s1 = geo.shape(f1['geometry'])
      s2 = geo.shape(f2['geometry'])
      coll = ops.shared_paths(s1.boundary, s2.boundary)
      if not coll.is_empty:
        print(f"{id1} and {id2} have shared path")
        # update your feature collection etc

我不得不将精度降低到您的特征几何中的小数点后5位,因为最初它只检测多边形1和2之间的重叠。多边形1和5之间的共享角在您的输入中稍显突出FeatureCollection:

{
  "type": "FeatureCollection",
  "features": [{
      "type": "Feature",
      "properties": {
        "id": 1
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [3.45451, 45.53328],
            [3.49605, 45.53328],
            [3.49605, 45.57055],
            [3.45451, 45.57055],
            [3.45451, 45.53328]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "id": 2
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [3.45451, 45.52917],
            [3.49605, 45.52917],
            [3.49605, 45.53891],
            [3.45451, 45.53891],
            [3.45451, 45.52917]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "id": 3
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [3.48455, 45.52980],
            [3.51596, 45.52980],
            [3.51596, 45.54338],
            [3.48455, 45.54338],
            [3.48455, 45.52980]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "id": 4
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [3.465328, 45.54266],
            [3.473567, 45.54266],
            [3.473567, 45.54783],
            [3.465328, 45.54783],
            [3.465328, 45.54266]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "id": 5
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [3.454513, 45.56799],
            [3.458805, 45.56799],
            [3.458805, 45.57055],
            [3.454513, 45.57055],
            [3.454513, 45.56799]
          ]
        ]
      }
    }
  ]
}
 类似资料:
  • 问题内容: 我正在尝试从多个表中删除。这是我的桌子的样子 给定B中的记录ID,我试图删除A_has_B,B和C_has_B中的所有行。我将MySQL与innodb存储引擎配合使用,并为A_has_B和C_has_B定义了引用B中ID的外键。 我正在尝试执行删除操作,如下所示: 问题是当我执行查询时,mysql抱怨: 我该如何解决这个问题? 问题答案: 最简单的方法是分别从每个表中删除: MySQL

  • 我正在尝试从技能作业表中删除一行 以下是我的疑问 但它抛出以下错误; 致命错误:未捕获的异常'异常'消息'您有一个错误在您的SQL语法;检查手册,对应于您的MySQL服务器版本的正确的语法使用附近'skj内连接作业j上<--plhd--0/<--#############################################################################

  • 问题内容: 所以我有四个桌子。每个表都有一个与前一个表ID相同的ID。因此,我的点击表中有一个ID和一个广告来源的ID。在广告表中,它有一个广告ID和一个来自其广告系列的ID。所以这是一个例子。 因此,要找出表4中的值从何而来,我需要遍历每个表并检查它们具有哪个ID。基本上,我想知道表1中的哪些值与表4中的值相关联。 表4中的内容是网站的访问者,表1中的内容是互联网广告。我想知道哪些访客来自哪些广

  • 我的实体: 这就是我的问题,实际上很少有。 问题1: 我删除了一个Cat对象,设置了cascade类型。所有在Cat中拥有的列表中,因此当我删除Cat对象时,UC中带有Cat的所有记录都将被删除,但我得到“已删除的对象将通过级联重新保存”,这是因为我在UC中与用户有另一个关系,用户将UC存储在列表中。当我从UC中删除Cat对象和记录时,我不想删除用户对象,因此在UC中的@ManyToOne上设置c

  • 有一个应用程序需要像搜寻列表这样的东西。这个应用程序可以用不同的配置多次启动。有没有办法跨JVM共享数据结构。在JVM中是有效的。有一个数据库可以解决这个问题。但是,有没有更简单、更快速的方法?

  • 我正在尝试做一个使用组合键的场景。我想有更多的公钥,这样我就可以用其中任何一个密钥来签署一个txn。 该场景的参考如下:https://docs.corda.net/api/kotlin/corda/net.corda.core.crypto/-composite-key/index.html 根据我的理解,deployNodes任务使用单个公钥生成节点。如果我偏离了轨道,请纠正我。