2

Google Earth デスクトップ アプリケーションでは、行のmap lengthとの両方が表示されground lengthます。

Google Earth プラグインでも同様のことを行いたいと考えています。つまり、地形を考慮してground lengthテッセレーションのを決定したいと考えています。KmlLineString

私はこれを行うことができますか?

4

1 に答える 1

6

earth-api-utility-libraryを使用すれば、確かにかなり簡単に長さを取得できます。それを使ってできること。

var length = (new geo.Path(linestring)).distance(); 

確かに、この方法は地形を考慮していませんが、標高勾配を使用して距離を計算する前に知っておくべき注意事項がいくつかあります。

まず、ほとんどの場合、地形と直接距離の違いは最小限です。実際、多くの高品質の GPS 受信機は、距離を計算する際に標高の変化をまったく考慮していません。

第二に、地上高度は最も信頼性の低いデータの 1 つです。距離を決定するために標高に基づく勾配を使用すると、単純な「カラスが飛ぶように」測定を使用するよりも、距離の測定がより不正確になることがよくあります。

それを踏まえて、どうしてもやりたいというのであれば、以下のような方法がひとつ考えられます。

  1. 特定のポイント (たとえば 10 メートルごと) でライン ストリングをサンプリングします。
  2. 各ポイントの地上高度を取得します。
  3. 各ポイントをデカルト座標に変換します
  4. 各デカルト ポイント間の角度距離を順番に計算します。

この種の方法の精度は、サンプリング レートを増やす (たとえば、1 メートルごとに) か、結果に平滑化手順を適用するという 2 つの方法で改善できます。

KmlLinestring より粗いバージョンの場合、設定された距離で再サンプリングするのではなく、座標自体をループすることができます。座標の緯度と経度を使用して、各ポイントの地上高度を取得します。次に、このデータ (緯度、経度、標高 => 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);
于 2012-12-21T07:58:01.200 に答える