好的,我终于用 matplotlib 库的 Basemap 工具包做到了。我会解释它是如何工作的,也许这对某人有帮助。
1。
在您的系统上下载并安装 matplotlib 库。
http://matplotlib.org/downloads.html
对于 Windows 二进制文件,我建议使用此页面:
http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib
请注意以下提示:
需要 numpy、dateutil、pytz、pyparsing、6 和可选的枕头,
pycairo,龙卷风,wxpython,pyside,pyqt,ghostscript,miktex,ffmpeg,
mencoder、avconv 或 imagemagick。
因此,如果您的系统上尚未安装,您必须下载并安装 numpy、dateutil、pytz、pyparsing 和六个,以便 matplotlib 正常工作(对于 Windows 用户:所有这些都可以在页面上找到,对于 Linux 用户,python 包管理器“pip”应该可以解决问题)。
2。
下载并安装 matplotlib 的“底图”工具包。无论是从
http://matplotlib.org/basemap/users/installing.html
或者对于 Windows 二进制文件也来自这里:
http://www.lfd.uci.edu/~gohlke/pythonlibs/#basemap
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.191355567, 14567974.064658936)
就这么简单。现在,当使用投影坐标构建一个带有 shapely 的多边形,然后通过 shapely 的面积方法计算面积时,您将获得以平方米为单位的面积(根据您使用的投影)。要获得平方公里,除以 10^6。
编辑:我努力不只是变换单个坐标,而是像多边形这样的整个几何对象,因为这些对象已经作为匀称的对象而不是通过它们的原始坐标给出。这意味着要编写大量代码来
- 获取多边形外环坐标
- 确定多边形是否有孔,如果有,分别处理每个孔
- 变换外环和任意孔的每一对坐标
- 将整个东西重新组合在一起,并使用投影坐标创建一个多边形对象
- 这仅适用于多边形...为多多边形和几何集合添加更多循环
然后我偶然发现了这部分匀称的文档,它使事情变得容易多了:
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.)
然后,可以通过以下方式使用此投影变换任何形状匀称的几何对象:
from shapely.ops import transform
projected_geometry = transform(m,geometry_object)