好的,我最终使用了matplotlib库的Basemap工具包。我将解释它的工作原理,也许对某人会有所帮助。
1.在您的系统上下载并安装matplotlib库。
http://matplotlib.org/downloads.html
对于Windows二进制文件,我建议使用此页面:
http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib
注意提示:
需要numpy、dateutil、pytz、pyparsing、six以及可选的pillow、pycairo、tornado、wxpython、pyside、pyqt、ghostscript、miktex、ffmpeg、mencoder、avconv或imagemagick。
因此,如果尚未在系统上安装,您还必须下载并安装numpy、dateutil、pytz、pyparsing和six,以使matplotlib能够正常工作(对于Windows用户:所有这些都可以在该页面上找到,对于Linux用户,Python软件包管理器“pip”应该可以解决问题)。
2.从
http://matplotlib.org/basemap/users/installing.html
或者对于Windows二进制文件,也可以从这里下载并安装“basemap”工具包:
http://www.lfd.uci.edu/~gohlke/pythonlibs/#basemap
3.在Python代码中进行投影:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
long = -112.367
lat = 41.013
m = Basemap(projection='sinu',lon_0=0,resolution='c')
projected_coordinates = m(long,lat)
输出:
投影后的坐标为 (10587117.191355567, 14567974.064658936)
就是这么简单。现在,使用投影后的坐标来构建一个多边形,并通过Shapely的面积方法计算面积,您将得到平方米为单位的面积(根据所用的投影)。要获得平方千米,请除以10^6。
编辑: 我很难只转换单个坐标,而是像多边形那样处理整个几何对象,特别是当它们已经作为Shapely对象而不是通过其原始坐标给出时。这意味着要编写大量代码来
- 获取多边形外环的坐标
- 确定多边形是否具有孔,如果是,单独处理每个孔
- 转换外环和任何孔的每对坐标
- 重新组合所有内容并使用投影后的坐标创建多边形对象
- 对于多面体和几何集,需要添加更多的循环...
然后我偶然发现了Shapely文档中的这一部分,它使事情变得容易得多:
http://toblerity.org/shapely/manual.html#shapely.ops.transform
当投影地图被设置时,例如如上所做:
m = Basemap(width=1,height=1, resolution='l',projection='laea',lat_ts=50,lat_0=50,lon_0=-107.)
然后,可以使用此投影通过以下方式转换任何Shapely几何对象:
from shapely.ops import transform
projected_geometry = transform(m,geometry_object)