Javascript 计算距离,包括公里线的高程/地形数据
Google Earth桌面应用程序显示了线的Javascript 计算距离,包括公里线的高程/地形数据,javascript,computational-geometry,google-earth-plugin,Javascript,Computational Geometry,Google Earth Plugin,Google Earth桌面应用程序显示了线的地图长度和地面长度 在Google Earth插件中,我想做一件类似的事情,那就是我想确定一个细分的Kmlinestring的地面长度,同时考虑地形 我可以这样做吗?如果可以,怎么做?如果使用。用它你可以做到 var length = (new geo.Path(linestring)).distance(); 尽管此方法不考虑地形,但在尝试使用海拔梯度计算距离之前,您应该注意一些注意事项 首先,在大多数情况下,地形和直接距离之间的任何差异都是最
地图长度和地面长度
在Google Earth插件中,我想做一件类似的事情,那就是我想确定一个细分的Kmlinestring
的地面长度,同时考虑地形
我可以这样做吗?如果可以,怎么做?如果使用。用它你可以做到
var length = (new geo.Path(linestring)).distance();
尽管此方法不考虑地形,但在尝试使用海拔梯度计算距离之前,您应该注意一些注意事项
首先,在大多数情况下,地形和直接距离之间的任何差异都是最小的。事实上,许多高质量的GPS接收机在计算距离时根本不考虑海拔的任何变化
其次,地面高度是最不可靠的数据之一。使用基于高程的坡度来确定距离通常会比使用简单的“如乌鸦”测量产生更大的距离测量误差
记住这一点,如果你仍然想这样做,那么有一种方法如下
在某些点(比如每10米)对线串进行取样
获取每个点的地面高度
将每个点转换为笛卡尔坐标
计算顺序中每个笛卡尔点之间的角距离
您可以通过两种方式提高这种方法的精度,一种是增加采样率(比如每米),另一种是对结果应用平滑程序
对于更粗糙的版本,您可以在kmlinestring
本身的坐标上循环,而不是在某个设定的距离上重新采样。您可以使用坐标的纬度、经度来获得每个点的地面高度。然后,您将根据这些数据(纬度、经度、高程=>X、Y、Z)构造笛卡尔坐标,并计算出它与下一个点之间的角距离…依此类推
像下面这样的想法应该是可行的——尽管它写在这里,没有经过测试
var EARTH_RADIUS = 6378135; // approximate in meters
var degreestoRadians = function(degrees) {
return degrees * Math.PI / 180;
}
var arcLength = function(point1 , point2) {
var length = Math.sqrt(Math.pow(point1.X-point2.X, 2)
+ Math.pow(point1.Y-point2.Y, 2)
+ Math.pow(point1.Z-point2.Z, 2));
var angle = 2 * Math.asin(length/2/EARTH_RADIUS);
return EARTH_RADIUS * angle;
}
var sphericalToCartesian = function(latitude, longitude, altitude) {
var phi = degreestoRadians(latitude);
var theta = degreestoRadians(longitude);
var rho = EARTH_RADIUS + altitude;
return {
X: Math.cos(phi) * Math.cos(theta) * rho,
Y: Math.cos(phi) * Math.sin(theta) * rho,
Z: Math.sin(phi) * rho
}
}
var topographicDistance = function(linestring) {
var coordinates = linestring.getCoordinates(); //KmlCoordArray
var last = null;
var distance = 0;
for(var i = 0; i < coordinates.length; i++) {
var coord = coordinates.get(i); //KmlCoord
var lat = coord.getLatitude();
var lng = coord.getLongitude();
var alt = ge.getGlobe().getGroundAltitude(lat, lng);
var latest = sphericalToCartesian(lat, lng, alt);
if(last != null) {
distance += arcLength(last, latest);
}
last = latest;
}
return distance;
}
var distance = topographicDistance(yourLinestring);