qgis中的测距
初学qgis,知道两点经纬度坐标,不知道如何计算两点的距离,用QgsDistanceArea类的measureLine方法,得出的好像是度值的差,用QgsPoint类的sqrDist方法,也类似,怎么得到以米表示的距离。还有在QgsMapCanvas上,如何得到一个像素值长度是多少米? --------------------编程问答-------------------- 如果知道经纬度可以通过了解他的投影方式来计算,你如果通过象素来计算那真是剑走偏峰了。
这是web墨卡托坐标系下的经纬度转平面坐标,直接做加减就是近似距离(纬度越高越不准)
//经纬度转web墨卡托
MapPoint lonLat2Mercator(MapPoint lonLat)
{
MapPoint mercator = new MapPoint();
double x = lonLat.X * 20037508.34 / 180;
double y = Math.Log(Math.Tan((90 + lonLat.Y) * Math.PI / 360)) / (Math.PI / 180);
y = y * 20037508.34 / 180;
mercator.X = x;
mercator.Y = y;
return mercator;
}
//web墨卡托转经纬度
MapPoint Mercator2lonLat(MapPoint mercator)
{
MapPoint lonLat = new MapPoint();
double x = mercator.X / 20037508.34 * 180;
double y = mercator.Y / 20037508.34 * 180;
y = 180 / Math.PI * (2 * Math.Atan(Math.Exp(y * Math.PI / 180)) - Math.PI / 2);
lonLat.X = x;
lonLat.Y = y;
return lonLat;
} --------------------编程问答-------------------- 楼上说的是坐标变换,在自己实现GIS系统时确实需要,但我这里使用的是qgis,坐标变换都是gis引擎自动处理的,在qgis中QgsMapToPixel都提供了相应的接口,我主要是不太清楚使用qgis如何实现距离计算 --------------------编程问答-------------------- 看来你没有GIS基础,无论qgis,mapinfo,arcgis,supermap还是什么其他的,计算距离的原理都一样。
经纬度是地理坐标,你也可以理解成地心坐标,直接计算两点间的距离是不现实的
通常的做法是将地理坐标转换成平面坐标(笛卡尔坐标,以x,y为轴)再计算两点间的距离
所以,计算经纬度坐标的第一步就是转换坐标,而后在x,y轴上计算两点间距离只需要用初中的数学就能搞定了。
顺便说一下,你提到的QgsMapToPixel的坐标转换是地理坐标到屏幕坐标的转换,实际生活中的距离与屏幕中的距离只存在一个比例尺的关系。 --------------------编程问答-------------------- 谢谢楼上的持续关注!楼上可能误解了我的意思,我是这样认为的
地图引擎既然能将地图显示在平面上,其内部肯定是已经进行了坐标变换,不管是高斯还是墨卡托,还是什么其他的,也应该提供了相应的接口,方便二次开发者进行测距、绘图等。这里不应该还需要开发者自己来实现一个投影算法,再来计算。我主要是对qgis的API还不熟,不知道用什么方法 --------------------编程问答--------------------
我没有专门了解过qgis的api, 但是我猜测他只是组装了gdal/org,proj4而已,也有可能没有封装完整的open api。 --------------------编程问答--------------------
补充:移动开发 , Qt