Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算距离,包括公里线的高程/地形数据_Javascript_Computational Geometry_Google Earth Plugin - Fatal编程技术网

Javascript 计算距离,包括公里线的高程/地形数据

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桌面应用程序显示了线的
地图长度和
地面长度

在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);