- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下MultiPolygon
:
MULTIPOLYGON (
(
(10.8849956 49.8901705, 10.8849507 49.8902499, 10.884969 49.8902588, 10.8851033 49.8903298, 10.8851183 49.8903132, 10.88512882654868 49.8903054, 10.8851246 49.8903054, 10.8851246 49.8902754, 10.8851546 49.8902754, 10.8851546 49.89028643275958, 10.8853289 49.8901612, 10.885421 49.8901035, 10.8854414638889 49.8900896, 10.8854205 49.8900896, 10.8854205 49.8900596, 10.8854505 49.8900596, 10.8854505 49.89008346226415, 10.885527 49.8900315, 10.885519 49.8899952, 10.8854851 49.8899903, 10.8853164 49.8899957, 10.8852419 49.8899981, 10.8851711 49.8899919, 10.8851165 49.8899814, 10.8850728 49.8899652, 10.8850692 49.8899713, 10.8849925 49.8900275, 10.8850251 49.890083, 10.8850275 49.8901159, 10.8850185 49.8901733, 10.8849956 49.8901705),
(10.8852028 49.8901715, 10.8852328 49.8901715, 10.8852328 49.8902015, 10.8852028 49.8902015, 10.8852028 49.8901715),
(10.8852889 49.8900884, 10.8853146 49.8900884, 10.8853146 49.8901184, 10.8853078 49.8901184, 10.8853078 49.8901337, 10.8852808 49.8901337, 10.8852808 49.8901463, 10.8852508 49.8901463, 10.8852508 49.8901346, 10.8852239 49.8901346, 10.8852239 49.8901046, 10.8852305 49.8901046, 10.8852305 49.8900815, 10.8852589 49.8900815, 10.8852589 49.8900812, 10.8852889 49.8900812, 10.8852889 49.8900884),
(10.8851133 49.890201, 10.8851433 49.890201, 10.8851433 49.890231, 10.8851133 49.890231, 10.8851133 49.890201),
(10.8849849 49.8902202, 10.8850149 49.8902202, 10.8850149 49.8902502, 10.8849849 49.8902502, 10.8849849 49.8902202)
),
(
(10.8852605 49.8901112, 10.8852605 49.8901115, 10.8852539 49.8901115, 10.8852539 49.8901163, 10.8852778 49.8901163, 10.8852778 49.8901112, 10.8852605 49.8901112)
)
)
如何获得包含每个(唯一)点的平面列表?列表项不必是有形状的 Points
,它们也可以是元组。我真的不明白如何迭代这个结构。
最佳答案
不幸的是,Shapely 不提供立即从 MultiPolygon
对象中提取所有点的功能。相反,您必须先 iterate over individual polygons of a MultiPolygon
,其次,extract individual points of each Polygon
.
人们可以想出不同的方法来解决这个问题。例如,如果您知道您的多边形都没有孔,您可以简单地执行以下操作:
points = []
for polygon in multipolygon:
points.extend(polygon.exterior.coords[:-1])
注意防止复制第一个顶点的[:-1]
。如果您希望使用更简洁的语法并且不关心每个多边形有一个重复点,则可以将其删除。
这也可以使用带有两个循环的列表推导式写在一行中:
points = [point for polygon in multipolygon for point in polygon.exterior.coords[:-1]]
或借助itertools.chain.from_iterable
:
from itertools import chain
points = list(chain.from_iterable(polygon.exterior.coords[:-1] for polygon in multipolygon))
一般来说,当多边形可以包含孔时,我们可以,例如,编写以下函数来从内部环中提取坐标:
def to_coords(multipolygon):
for polygon in multipolygon:
yield from polygon.exterior.coords[:-1]
yield from chain.from_iterable(interior.coords[:-1] for interior in polygon.interiors)
使用示例:
mp = MultiPolygon([Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]),
Polygon([(2, 0), (3, 0), (3, 1), (2, 1)],
holes=[[(2.25, 0.25), (2.75, 0.25), (2.75, 0.75), (2.25, 0.75)]])])
points = list(to_coords(mp))
# [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0),
# (2.0, 0.0), (3.0, 0.0), (3.0, 1.0), (2.0, 1.0),
# (2.25, 0.25), (2.75, 0.25), (2.75, 0.75), (2.25, 0.75)]
甚至可以更进一步,将其推广到任何输入几何体(Python ≥3.7):
from functools import singledispatch
from itertools import chain
from typing import (List,
Tuple,
TypeVar)
from shapely.geometry import (GeometryCollection,
LinearRing,
LineString,
Point,
Polygon)
from shapely.geometry.base import (BaseGeometry,
BaseMultipartGeometry)
Geometry = TypeVar('Geometry', bound=BaseGeometry)
@singledispatch
def to_coords(geometry: Geometry) -> List[Tuple[float, float]]:
"""Returns a list of unique vertices of a given geometry object."""
raise NotImplementedError(f"Unsupported Geometry {type(geometry)}")
@to_coords.register
def _(geometry: Point):
return [(geometry.x, geometry.y)]
@to_coords.register
def _(geometry: LineString):
return list(geometry.coords)
@to_coords.register
def _(geometry: LinearRing):
return list(geometry.coords[:-1])
@to_coords.register
def _(geometry: BaseMultipartGeometry):
return list(set(chain.from_iterable(map(to_coords, geometry))))
@to_coords.register
def _(geometry: Polygon):
return to_coords(GeometryCollection([geometry.exterior, *geometry.interiors]))
使用示例:
from shapely.geometry import (MultiLineString,
MultiPoint,
MultiPolygon)
geometry_objects = [Point(0, 0),
LineString([(0, 0), (1, 1)]),
LinearRing([(0, 0), (1, 0), (1, 1)]),
Polygon([(0, 0), (1, 0), (1, 1), (0, 1)],
holes=[[(0.25, 0.25), (0.75, 0.25), (0.75, 0.75), (0.25, 0.75)]]),
MultiPoint([(0, 0), (1, 1)]),
MultiLineString([LineString([(0, 0), (1, 1)]), LineString([(2, 0), (3, 1)])]),
MultiPolygon([Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]),
Polygon([(2, 0), (3, 0), (3, 1), (2, 1)],
holes=[[(2.25, 0.25), (2.75, 0.25), (2.75, 0.75), (2.25, 0.75)]])]),
GeometryCollection([Point(0, 0), LineString([(0, 0), (1, 1)])])]
for geometry in geometry_objects:
print(f"For {geometry.wkt}\nwe got:\n"
f"{to_coords(geometry)}\n")
输出:
For POINT (0 0)
we got:
[(0.0, 0.0)]
For LINESTRING (0 0, 1 1)
we got:
[(0.0, 0.0), (1.0, 1.0)]
For LINEARRING (0 0, 1 0, 1 1, 0 0)
we got:
[(0.0, 0.0), (1.0, 0.0), (1.0, 1.0)]
For POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0), (0.25 0.25, 0.75 0.25, 0.75 0.75, 0.25 0.75, 0.25 0.25))
we got:
[(0.0, 1.0), (0.0, 0.0), (0.25, 0.25), (0.75, 0.25), (0.75, 0.75), (0.25, 0.75), (1.0, 0.0), (1.0, 1.0)]
For MULTIPOINT (0 0, 1 1)
we got:
[(0.0, 0.0), (1.0, 1.0)]
For MULTILINESTRING ((0 0, 1 1), (2 0, 3 1))
we got:
[(2.0, 0.0), (0.0, 0.0), (3.0, 1.0), (1.0, 1.0)]
For MULTIPOLYGON (((0 0, 1 0, 1 1, 0 1, 0 0)), ((2 0, 3 0, 3 1, 2 1, 2 0), (2.25 0.25, 2.75 0.25, 2.75 0.75, 2.25 0.75, 2.25 0.25)))
we got:
[(0.0, 1.0), (0.0, 0.0), (3.0, 0.0), (3.0, 1.0), (2.0, 1.0), (2.0, 0.0), (2.25, 0.25), (2.75, 0.25), (2.75, 0.75), (2.25, 0.75), (1.0, 0.0), (1.0, 1.0)]
For GEOMETRYCOLLECTION (POINT (0 0), LINESTRING (0 0, 1 1))
we got:
[(0.0, 0.0), (1.0, 1.0)]
关于python - 如何使用 Shapely 获取 MultiPolygon 内每个点的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58844463/
我有 2 个相交的 OGR 多边形,因此我想将它们级联并联。我尝试了这个,但它返回给我空并且不合并它。似乎这仅适用于多边形,不适用于多重多边形。最好的方法是什么? >>geom = ogr.Geome
从包含相当多(大约 20000)个可能部分重叠的多边形的 shapefile 开始,我需要提取所有通过与不同“边界”相交而产生的子多边形。 在实践中,从一些模型数据开始: library(tibble
我尝试在我的 postgre 数据库中添加 MultiPolygon 几何图形,因此我使用了以下 SQL 语句: 'INSERT INTO potentiel_foncier_ccry (nature
我正在尝试将我的 polygon 列类型更改为 multipolygon 列类型。 我的代码很简单。 change_column :messages, :area_shape, :multipolyg
我正在读取一组包含大量 multypoligons 的数据。我正在使用 Geotools,我想将此列表存储在 mysql 数据库表中。 我不知道如何以有效的方式存储形状并能够重新创建多多边形对象。 如
OpenLayers 3.10.1 中的默认标签标记 MultiPolygon 的每个部分。我想知道是否可以只标记 MultiPolygon 中的第一个多边形。 最佳答案 您可以为带有 geometr
我正在使用geotools库来提取位置信息。这样我就得到了一个类型的对象 class com.vividsolutions.jts.geom.MultiPolygon 我现在想通过 jdbc 连接将此
我正在使用geotools库来提取位置信息。这样我就得到了一个类型的对象 class com.vividsolutions.jts.geom.MultiPolygon 我现在想通过 jdbc 连接将此
我将 leaflet.js 与 postgis (postgres) 一起使用。我想将多面体转换为几何图形以存储在数据库中。但是我收到了这个错误: An error occurred when exe
我有一个表 Town,其列 TownBoundary 包含相关城镇的多边形(geography 数据类型)。 对于每个城镇,我都会获得生成 KML(XML) 文件所需的多边形数据,例如: sqlg =
我有一个世界国家数据集,想在本初子午线上拆分它,并将数据重新集中在太平洋上。 我正在尝试使用简单功能 (sf) 来执行此操作,但遇到了一个我无法解决的对象类型问题。 为了拆分数据,我尝试了以下操作:
我有一个由大约 100 个条目(多多边形几何图形)组成的 cartoDB 数据集,我使用 cartodb.js API 检索该数据集。单击区域时更改给定条目(倍数)的不透明度的最佳方法(性能方面)是什
所以这是我第一次做一个涉及 map 和图层的项目, map 上有很多点和很多多边形。 我倾向于为点和多边形创建单独的表,然后在它们与图层表之间创建多对多关系。如果这样做,我最终会得到 5 个表:poi
我有以下MultiPolygon: MULTIPOLYGON ( ( (10.8849956 49.8901705, 10.8849507 49.8902499, 10.884969 49.89025
我需要将PostgreSQL的几何(MultiPolygon)类型变量存储到java变量中这是因为我尝试将几何列添加到非空间表以使用 map 服务器查询 map 我试图将它存储在一个字符串中,这导致了
我正在从 Trimble 导入一些 OSM 数据到 PostGIS 数据库中,将其作为 Django 应用程序的一部分进行处理。这适用于点和线,但我正在努力处理多边形。 导入似乎工作正常: shp2p
有没有人用PHP解析过MySql中的Polygon/Multipolygon几何数据?我是 MySQL 空间函数的新手。请帮我从 MySQL 中的多面体中获取经纬度点。 我有一个表格,其中有一个类型为
我有两个 GeoDataFrame。一个是爱荷华州,另一个是北美 future 72 小时内预料到的降雨。我想创建一个覆盖爱荷华州的降雨预报的 GeoDataFrame。但是我得到一个错误。 stat
我正在从不同来源收集位置信息并将所有内容存储在 MongoDb 集合中。除了具有单一纬度/经度坐标的点位置外,我还存储区域。 现在,一个数据给我的位置信息为 GeometryCollection,但所
如何在 NodeJs sequelize 中创建具有多多边形数据类型的表字段? myfield: { type: ?????, allowNull: true } MySQL表结构是-
我是一名优秀的程序员,十分优秀!