- 背景介绍
工作中需要处理经纬度数据,需要进行缓冲区计算等操作.想将经纬度转换到utm下,使用距离单位制作缓冲区方便且准确,处理完数据后,再将utm坐标转换回经纬度. - 问题描述
将经纬度的图幅框mesh_wgs,转换为utm对应的图幅框mesh_utm时,在qgis查看发现不能重合,即坐标在转换前后发生偏移了,误差在10m+,如下图
- 坐标转换代码如下(有问题的)
'''
错误示例
'''
utm_minxy = geoCalcSet.coord_crs_transform([minX,minY], 4326, geomFunction.calcUtmSrid(minX))
utm_maxxy = geoCalcSet.coord_crs_transform([maxX,maxY], 4326, geomFunction.calcUtmSrid(maxX))
utm_minx = utm_minxy[0][0]
utm_miny = utm_minxy[0][1]
utm_maxx = utm_maxxy[0][0]
utm_maxy = utm_maxxy[0][1]
utm_edge_a = [(utm_minx, utm_miny), (utm_minx, utm_maxy)]
utm_edge_b = [(utm_minx, utm_maxy), (utm_maxx, utm_maxy)]
utm_edge_c = [(utm_maxx, utm_maxy), (utm_maxx, utm_miny)]
utm_edge_d = [(utm_maxx, utm_miny), (utm_minx, utm_miny)]
- 调查过程
对比图幅框的左下角和右上角(即[utm_minx,utm_miny]和[utm_maxx,utm_maxy]),UTM坐标能和原经纬度下的图幅框对应位置重合,误差在毫米左右.这两个点的坐标为使用投影转换得到的,而左上角和右下角的utm坐标为使用上面两个坐标推导出来的,即直接使用utm_minx和utm_maxy组合出左上角utm坐标.
考虑到坐标转换时,需要考虑球面参数,相对平面直角坐标,存在形变等情况,故采取对左上角和右下角都进行坐标转换操作,得到投影变换后的utm坐标 - 效果对比
叠加后的效果如下图所示,转换得到的坐标是符合预期的 - 坐标正确转换的代码
utm_minxminy = geoCalcSet.coord_crs_transform([minX,minY], 4326, geomFunction.calcUtmSrid(minX))
utm_maxxmaxy = geoCalcSet.coord_crs_transform([maxX,maxY], 4326, geomFunction.calcUtmSrid(maxX))
utm_minxmaxy = geoCalcSet.coord_crs_transform([minX,maxY], 4326, geomFunction.calcUtmSrid(minX))
utm_maxxminy = geoCalcSet.coord_crs_transform([maxX,minY], 4326, geomFunction.calcUtmSrid(maxX))
utm_edge_a = [utm_minxminy, utm_minxmaxy]
utm_edge_b = [utm_minxmaxy, utm_maxxmaxy]
utm_edge_c = [utm_maxxmaxy, utm_maxxminy]
utm_edge_d = [utm_maxxminy, utm_minxminy]
- 总结
坐标投影转换在gis数据处理中十分常见,在转换时要考虑到球面与平面的区别,不能简单的进行算术计算.除了本文中遇到的问题,在进行距离计算等操作时,也需要注意球面与平面的区别.