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

使用shapely在多多边形内创建矩形多边形

胡星汉
2023-03-14

我正在寻找一种方法来创建一组多边形(rechtangles),沿着一条线在多个多边形中创建一组多边形(rechtangles),并将其水平隔开,如图所示。

我尝试生成点并将其用作多边形的中点,但问题是,通过创建等间距的点光栅,除了180度之外,不可能以任何其他方向旋转。

例子

给出了一个多多边形形状的对象和由宽度和高度以及每个多边形之间的垂直和水平间距定义的多边形。多边形应仅放置在多多边形内,且不相交。

额外的问题:也许有一种方法可以将它们沿着向量放置,这样就可以旋转直线。

共有1个答案

庞瀚
2023-03-14

如果行间距和矩形尺寸以米为单位。尝试以下方法。

import folium
import geopy
import numpy as np
from shapely.geometry import Polygon, MultiPoint


def get_rectangle_points(coordinates, bearing, width, height):
    start = geopy.Point(coordinates)
    hypotenuse = np.hypot(width/1000, height/1000)
    d = geopy.distance.distance(kilometers=hypotenuse/2)

    opposite_angle = np.degrees(np.arctan(width/height))
    northeast_angle = 0 - opposite_angle
    southwest_angle = 180  - opposite_angle
    northwest_angle = opposite_angle
    southeast_angle = 180 + opposite_angle

    points = []
    for angle in [northeast_angle, northwest_angle, southwest_angle, southeast_angle]:
        point = d.destination(point=start, bearing=angle+bearing)
        coords = (point.latitude, point.longitude)
        #coords = (point.longitude, point.latitude)
        points.append(coords)

    return points

lat_point_list = [50.854457, 52.518172, 50.072651, 48.853033, 50.854457]
lon_point_list = [4.377184, 13.407759, 14.435935, 2.349553, 4.377184]

polygon_geom = Polygon(zip(lon_point_list, lat_point_list))

latmin, lonmin, latmax, lonmax = polygon_geom.bounds

v = 100 #vertical spacing in meters
h = 500 #horizontal spacing in meters
height = 20000
width = 50000

vertical_spacing = geopy.units.degrees(arcminutes=geopy.units.km(meters=2*v+height)) #spacing in degrees
horizontal_spacing = geopy.units.degrees(arcminutes=geopy.units.km(meters=2*h+width)) #spacing in degrees
x, y = np.round(np.meshgrid(np.arange(latmin, latmax, horizontal_spacing), np.arange(lonmin, lonmax, vertical_spacing)),4)
points = MultiPoint(list(zip(x.flatten(),y.flatten())))
valid_points = []
valid_points.extend([i for i in points if polygon_geom.contains(i)])

map_coords = [polygon_geom.centroid.y, polygon_geom.centroid.x]

webmap = folium.Map(map_coords, zoom_start=6)
folium.GeoJson(polygon_geom).add_to(webmap)

for point in valid_points:
    coords = (point.y, point.x)
    rect_coords = get_rectangle_points(coords, 0, width, height) #increase bearing to rotate rectangle    
    folium.Polygon(rect_coords, color='red').add_to(webmap)

webmap.save('webmap.html')
 类似资料:
  • 返回顶点的输入数组,并且附有一些其他方法,如下面所描述 polygon.area() 返回此多边形的标定区域。如果顶点是逆时针顺序,面积为正,否则为负。 polygon.centroid() 返回一个表示此多边形的质心的两元素数组。 polygon.clip(subject) 对这个多边形剪切主题多边形。换句话说,返回一个多边形表示这个多边形和主题多边形的交集。假定剪切的多边形是逆时针方向以及凸多

  • 我有一个带有lat和lon的商店位置csv文件。我还有一个geojson文件,其中包含美国人口普查区的多边形特征。我想使用Python查看每个位置存在哪些多边形。 我使用Shapely Python库的包含()来循环通过存储位置的csv文件,获取lat和lon坐标,然后检查这些坐标是否存在于Geojson文件中的一个多边形中。 如果我先遍历每个位置/坐标,然后遍历每个多边形,使用contains(

  • 我有一个geopandas数据框,其中包含一个形状良好的点几何体列表。还有一列包含ID列表,用于指定每个点所属的唯一多边形。简化输入代码为: 我想按多边形ID分组,以便将几何体从点转换为多边形。该输出基本上如下所示: 我想这很简单,但我很难让它工作。我发现下面的代码允许我将其转换为开放式多段线,但无法计算出多边形。有人能建议如何适应这种情况吗? 简单地用多边形替换LineString会导致Type

  • 我试图从顶点位置创建一组多边形,保存在X,Y格式。 下面是我的数据的一个例子——每行代表一个多边形的顶点。多边形是正方形 我正在使用,因此我的数据需要在列表中。所以我创建了一个循环来尝试从矩阵中将我的数据转换为列表格式。 我创建了一个循环,遵循我在这个网站上的其他一些问题中找到的代码。我突破了每一步,试图理解为什么我只有一个多边形作为输出,即使我有2组点。 你能帮我理解我如何调整代码写出两个多边形

  • 我希望通过一条线串拆分一个多多边形(代表一个有岛屿的国家),从而将该县一分为二。 此结果是GeometryCollection对象中的一组多边形。如何将结果分组为两个多多边形对象,每个对象都包含各自一半的多边形? 使现代化 问题:确定分裂形状几何的“左”和“右”侧提供了一个很好的解决方案,其中从结果中的每个多边形中提取一个点,看看当与分裂的LineString结合时,它是否形成顺时针或逆时针线串。

  • 基础示例 <vuep template="#example"></vuep> <script v-pre type="text/x-template" id="example"> <template> <div class="amap-page-container"> <el-amap vid="amap" :zoom="zoom" :amap-manager="ama