地图经纬度坐标与屏幕坐标的转换(android版)

     我们在开发GIS系统的时候,首先要解决的就是地图的可视化问题,这个问题的关键就在于如何把地图的坐标转换成屏幕坐标,然后才到渲染着色、标注等。以下以wgs84经纬度坐标为基准,介绍一下地图经纬度坐标与屏幕坐标转换的问题。

     一、比例尺

     首先地图本身就是表达地球上各种事物的空间分布、联系及时间中的发展变化状态绘制的图形。如何把地球上大量的空间信息显示在有限的地图上,这就是涉及到比例尺的问题。比例尺=图上距离与实际距离的比。

     比例尺有resolution和scale两个概念

    Resolution是指屏幕上一个像素和其所显示的地图在实际地面上的距离之比。

    Scale是图上线段的长度和该段距离在地面的实际长度之比

    一般来说计算机是使用Resolution这个概念,而人们生活中就是使用scale这个概念,因为Resolution直接就使用屏幕像素来计算,所以性能上比scale要快。

//计算resolution
double Resolution=map.width / screen.width

//计算scale
float dpi=this.view.getResources().getDisplayMetrics().xdpi;
double PIXEL_SIZE=(1/dpi)*0.0254;
PIXEL_SIZE=(1/dpi)*0.0254
double Scale=Resolution* MetersPerUnit /PIXEL_SIZE
//0.0254为1英寸=0.0254米

   二、地图坐标和屏幕坐标的转换

如图所示,由于地球是球形的,同样两条经线,纬度越高,经线之间的直线距离越短,但经度还是保持不变的,所以在北半球或南半球上任意两条经线和纬线之间的区域,都是类似梯形的,由于这个梯形的左上角和左下角,右上角和右下角的经度都是相同的,所以我们可以把这个梯形看成是长方形,经过投影转换,在屏幕上看到的地图就是经过拉伸长方形了。

由于越向北,两条经线之间的实际距离越短,所以,要投影成长方形,就必须确定一个经度的长度:MetersPerUnit=111319.4908

//地图坐标转屏幕坐标:
screenPt.x=screen.center.x+ ((mapPt.x-mapExtent.center.x)/resolution+0.5);
screenPt.y=screen.center.y- (mapPt.y-mapExtent.center.y)/resolution+0.5);
//屏幕坐标转地图坐标:
mapPt.x=mapExtent.center.x+(screenPt.x-screen.center.x)*resolution;
mapPt.y=mapExtent.center.y-(screenPt.x-screen.center.x)*resolution;
原文地址:https://www.cnblogs.com/gdguansun/p/4771277.html