【问题标题】:st_make_grid method equivalent in pythonpython中等效的st_make_grid方法
【发布时间】:2021-08-13 10:15:14
【问题描述】:

是否有与 r-spatial in python 中的sf 包的非常好的st_make_grid 方法等效?该方法在多边形的边界框上创建矩形网格几何体。

我想做与this 问题中提出的解决方案完全相同的操作,例如将一个多边形分成几个面积相同的正方形,我选择。感谢您的帮助。


或者,我可以使用rpy2 在 r 中运行一个脚本,该脚本执行st_make_grid 方法,该方法将一个匀称的多边形作为输入并输出方形多边形,以便用匀称的方式读取。这对许多要处理的多边形有效吗?

【问题讨论】:

  • 如果您避免在 R 和 Python 之间频繁地双向移动对象,那么使用 rpy2 在 Python 中的效率与在 R 中一样有效。
  • 如果有大型数组或数据表,Apache Arrow 在 Python 和 R 之间共享数据时可能会提供非常显着的性能提升。检查 rpy2 扩展 rpy2-arrow。

标签: python geopandas sf rpy2 shapely


【解决方案1】:

这对许多要处理的多边形有效吗?

当然不是。没有内置的 Python 版本,但下面的函数可以解决问题。如果您需要性能,请确保在您的环境中安装了pygeos

def make_grid(polygon, edge_size):
    """
    polygon : shapely.geometry
    edge_size : length of the grid cell
    """
    from itertools import product
    import numpy as np
    import geopandas as gpd
    
    bounds = polygon.bounds
    x_coords = np.arange(bounds[0] + edge_size/2, bounds[2], edge_size)
    y_coords = np.arange(bounds[1] + edge_size/2, bounds[3], edge_size)
    combinations = np.array(list(product(x_coords, y_coords)))
    squares = gpd.points_from_xy(combinations[:, 0], combinations[:, 1]).buffer(edge_size / 2, cap_style=3)
    return gpd.GeoSeries(squares[squares.intersects(polygon)])

【讨论】:

  • 首先,非常感谢您的解决方案,它非常简洁,帮助我学习了新东西。其次,面积是边长的平方根,对吧?例如,对于以下多边形:POLYGON ((39.31869506835937 25.14777088272356, 39.88861083984375 25.14777088272356, 39.88861083984375 25.50526349022746, 39.31869506835937 25.50526349022746, 39.31869506835937 25.14777088272356)) edge_size 长度大于 0.8 会返回错误。长度为 0.01 的面积为 1.36 平方公里,0.02 的面积为 5.45 平方公里。 如何选择一个区域的长度? 8km2?
  • 为了计算面积,我进行如下:result = make_grid(polygon, 0.02) \ gdf = gpd.GeoDataFrame(geometry=result) \ gdf.crs = "epsg:4326" \ gdf = gdf.to_crs(epsg=3395) \ print(gdf.area*1e-6) # in km2
  • 上述函数假设为投影 CRS,如果您的几何图形为 EPSG:4326,它将无法正常工作。
  • 确实是以米为单位的..再次非常感谢!
  • 嗨@mar​​tinfleis,我遇到了一个问题。我在 4326 投影中有一个输入多边形。我将它投影到 3395 并执行 make_grid 函数。然后我重新投影在 4326 中获得的正方形多边形。(如您所解释的那样,全部在一个投影中 here)。然后我用.centroid 计算每个正方形的中心点,但即使在这里它们也不准确。有可能吗?
猜你喜欢
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2018-07-19
相关资源
最近更新 更多