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

以平面单位(如平方米)计算多边形面积

贝钧
2023-03-14

我使用Python 3.4和shapely 1.3.2创建一个多边形对象的长/lat坐标对列表,我转换成一个众所周知的文本字符串,以便解析它们。这样的多边形可能看起来像:

POLYGON ((-116.904 43.371, -116.823 43.389, -116.895 43.407, -116.908 43.375, -116.904 43.371))

由于shapely不处理任何投影并实现carthesian空间中的所有几何体对象,因此对该多边形调用area方法,如:

poly.area

以平方度为单位给出多边形的面积。为了得到以平方米为单位的平面面积,我想我必须使用不同的投影变换多边形的坐标(哪一个?)。

我多次读到pyproj库应该提供这样做的方法。使用pyproj,有没有一种方法可以将整个形状优美的多边形对象转换为另一个投影,然后计算面积?

我用我的多边形做了一些其他的事情(不是你现在想的那样),只有在某些情况下,我需要计算面积。

到目前为止,我只发现了这个例子:http://all-geo.org/volcan01010/2012/11/change-coordinates-with-pyproj/

这意味着将每个多边形对象拆分为其外圈和内圈(如果存在的话),获取坐标,将每对坐标转换为另一个投影并重建多边形对象,然后计算其面积(它是什么单位?)。这看起来是一个解决方案,但不太实际。

还有更好的主意吗?

共有3个答案

陈浩
2023-03-14

转换成弧度,假设地球是半径6370公里的完美球体:

p=np。数组([-116.904,43.371]、-116.823,43.389]、-116.895,43.407]、-116.908,43.375]、-116.904,43.371])

Poly=多边形(np.radians(p))

聚。面积=4.468737548271707e-07

聚。面积*6370**2=18.132751662246623

俞子实
2023-03-14

计算一个测地线面积,非常精确,只需要一个椭球(不是投影)。这可以用pyproj 2.3.0或更高版本来完成。

from pyproj import Geod
from shapely import wkt

# specify a named ellipsoid
geod = Geod(ellps="WGS84")

poly = wkt.loads('''\
POLYGON ((-116.904 43.371, -116.823 43.389, -116.895 43.407,
-116.908 43.375, -116.904 43.371))''')

area = abs(geod.geometry_area_perimeter(poly)[0])

print('# Geodesic area: {:.3f} m^2'.format(area))

# # Geodesic area: 13205034.647 m^2

abs()仅用于返回正区域。根据多边形的缠绕方向,可能会返回负区域。

岳鸿畴
2023-03-14

好的,我终于用matplotlib库的Basemap工具包完成了。我会解释它是如何工作的,也许这会对某些人有所帮助。

1.在系统上下载并安装matplotlib库。http://matplotlib.org/downloads.html

对于Windows二进制文件,我建议使用此页面:http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib当心提示:

需要numpy、dateutil、pytz、pyparsing、six,还可以选择枕头、pycairo、tornado、wxpython、pyside、pyqt、ghostscript、miktex、ffmpeg、mencoder、avconv或imagemagick。

因此,如果系统上尚未安装,则必须下载并安装numpy、dateutil、pytz、pyparsing和six,才能使matplotlib正常工作(对于Windows用户:所有这些都可以在页面上找到,对于Linux用户,python包管理器“pip”应该起作用)。

2.下载并安装matplotlib的“basemap”工具包。要么来自http://matplotlib.org/basemap/users/installing.html或者对于Windows二进制文件,也可以从这里开始:http://www.lfd.uci.edu/~gohlke/pythonlibs/#底图

3.在Python代码中进行投影:

#Import necessary libraries
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

#Coordinates that are to be transformed
long = -112.367
lat = 41.013

#Create a basemap for your projection. Which one you use is up to you.
#Some examples can be found at http://matplotlib.org/basemap/users/mapsetup.html
m = Basemap(projection='sinu',lon_0=0,resolution='c')

#Project the coordinates:
projected_coordinates = m(long,lat)

输出:

投影坐标(10587117.19135556714567974.064658936)

就这么简单。现在,当使用投影坐标用shapely构建多边形,然后通过shapely的面积方法计算面积时,您将获得以平方米为单位的面积(根据您使用的投影)。要得到平方公里,除以10^6。

编辑:我努力不只是变换单个坐标,而是变换整个几何体对象,比如多边形,而这些对象已经被赋予了形状优美的对象,而不是通过它们的原始坐标。这意味着要编写大量的代码

  • 得到多边形外环的坐标
  • 确定多边形是否有孔,如果有,分别处理每个孔
  • 变换外环和任意孔的每对坐标
  • 把整个东西放回一起,并创建一个多边形对象与投影坐标
  • 这只适用于多边形...为多边形和几何集合添加更多的循环

然后我偶然发现了shapely文档的这一部分,它使事情变得更容易:http://toblerity.org/shapely/manual.html#shapely.ops.transform

当设置投影贴图时,例如如上所述:

m=Basemap(宽度=1,高度=1,分辨率=l',投影=laea',纬度=50,纬度0=50,经度0=-107。)

然后,可以通过以下方式使用该投影变换任何形状几何体对象:

from shapely.ops import transform
projected_geometry = transform(m,geometry_object)

 类似资料:
  • 总结: 我试图在r中计算大量多边形的面积。我读过几篇关于如何做的文章(例1 扩展说明: 我实际上是在计算澳大利亚维多利亚州的房产面积。多边形表示这些属性。我从Spatial Datamart下载了所有维多利亚州的VicMaps简化模型1和2。然而,考虑到形状文件的大小,我不得不将搜索范围缩小到一个地方政府区域(LGA),并计算多边形区域(仅用于测试)。形状文件为15.5MB。 这是有效的,但它不是

  • 问题内容: 标题基本上说明了一切。我需要使用Python计算地球表面上的多边形内部的面积。计算地球表面上任意多边形所围成的面积虽然可以说明这一点,但在技术细节上仍然含糊不清: 如果要使用更“ GIS”的样式来执行此操作,则需要为您的区域选择一个度量单位,并找到保留该区域的适当投影(并非全部如此)。由于您正在谈论计算任意多边形,因此我将使用类似Lambert Azimuthal等面积投影的方法。将投

  • 简要说明: 我试图用多米诺骨牌或者换句话说,用2x1和1x2瓷砖生成正方形的瓷砖。 有时我的算法会以某种方式放置垂直磁贴,这使得无法填充最后一行。 我目前的方法是用0初始化网格(例如8x8网格)。我在网格中用1表示水平平铺的左半部分,用2表示右半部分。 因此,垂直瓷砖的上半部分是3,下半部分是4。 然后我从左到右遍历网格的每一行,在0处放置一个平铺: 每当我在网格的右侧边缘或右侧的空间不是0时,我

  • 问题内容: 假设我有一组任意的纬度和经度对,它们代表一些简单的闭合曲线上的点。在笛卡尔空间中,我可以使用格林定理轻松计算出此类曲线所包围的面积。计算球体表面面积的类似方法是什么?我想我所追求的是Matlabareaint函数背后的算法(甚至是近似算法)。 问题答案: 有几种方法可以做到这一点。 1)整合纬度带的贡献。此处每个条带的面积为(Rcos(A)(B1-B0))(RdA),其中A为纬度,B1

  • 本文向大家介绍Java多边形重心计算,包括了Java多边形重心计算的使用技巧和注意事项,需要的朋友参考一下 多边形重心计算 三角形重心 顶点为a,b,c的三角形重心为x = (xa + xb + xc) / 3,y = (ya + yb + yc) / 3 多边形重心 x = (x1w1 + x2w2 + … + xnwn)/W y = (y1w1 + y2w2 + … + ynwn)/W 总结

  • 共5轮面试 hr面试过程中,问的问题其实不算很难,估计是hr也不懂设计吧,之后是部门负责人面,他重点是介绍了公司的岗位要求和公司定义的视觉以及vi,他们的定义的视觉风格是工业风、精工感和设计感,并给我看了他们的参考意向图。之后给我布置了一个作业,让我按照他们定义的视觉风格找一些我认为和这个风格吻合的参考图,我现场就找了一些给他,也给他分析了为什么。 由于面试临近中午,他们还主动提供了零食,虽然我没