考虑投影坐标系的空间计算:shapely + pyproj

空间数据的坐标使用经纬度,空间计算希望按照"米"处理,该怎么办?

如果对投影坐标系不了解,我们只能对上述需求做个近似,用度来逼近米。假设地球为一个球体,对于赤道和经度圈,360度对应4万km,所以1度对应111km。因此我们可以用“度”和“米”的近似换算来达成上述目的。不过这个简化存在一些问题,在纬度圈上不适用,纬度越大,1度对应的公里数越小。比如,我们希望对一个空间对象外扩50m的范围,那么在东西方向上,实际的外扩范围,黑龙江 < 北京 < 广东。

那么如果希望能精确按照米做空间计算呢?这就需要引入投影坐标系(相关概念请参考我的另一篇文章《瓦片地图原理》)。Python中可以用pyproj完成这个功能,将WGS84的经纬度坐标系投影到UTM的米制坐标系。下面给一个代码示例:

from shapely.geometry import LineString
from shapely.ops import transform
import pyproj

wgs84 = pyproj.CRS('EPSG:4326')
utm = pyproj.CRS('EPSG:32618')
line = LineString([[126.631021,45.7443], [126.631021,45.74138], [126.635699,45.74138]])
degree_buffer = line.buffer(0.00050, cap_style=2)
project = pyproj.Transformer.from_crs(wgs84, utm, always_xy=True).transform
distline = transform(project, line)
dist_buffer = distline.buffer(55.5, cap_style=2)
reverse = pyproj.Transformer.from_crs(utm, wgs84, always_xy=True).transform
dist_buffer = transform(reverse, dist_buffer)
print line
print degree_buffer
print dist_buffer

将数据可视化后,效果如下:

绿色为按“米”精确开的范围,红色为按“度”开的范围。可以看到在东西向上,用“度”近似的方法范围偏小,南北向上范围精确。

更新

UTM需要根据经纬度选择正确的UTM带号,带号=(经度整数位/6)的整数部分+31,详见:
https://blog.csdn.net/tap8805...

你可能感兴趣的:(r可视化空间计算地图)