Google Earth デスクトップ アプリケーションでは、行のmap length
との両方が表示されground length
ます。
Google Earth プラグインでも同様のことを行いたいと考えています。つまり、地形を考慮してground length
テッセレーションのを決定したいと考えています。KmlLineString
私はこれを行うことができますか?
Google Earth デスクトップ アプリケーションでは、行のmap length
との両方が表示されground length
ます。
Google Earth プラグインでも同様のことを行いたいと考えています。つまり、地形を考慮してground length
テッセレーションのを決定したいと考えています。KmlLineString
私はこれを行うことができますか?
earth-api-utility-libraryを使用すれば、確かにかなり簡単に長さを取得できます。それを使ってできること。
var length = (new geo.Path(linestring)).distance();
確かに、この方法は地形を考慮していませんが、標高勾配を使用して距離を計算する前に知っておくべき注意事項がいくつかあります。
まず、ほとんどの場合、地形と直接距離の違いは最小限です。実際、多くの高品質の GPS 受信機は、距離を計算する際に標高の変化をまったく考慮していません。
第二に、地上高度は最も信頼性の低いデータの 1 つです。距離を決定するために標高に基づく勾配を使用すると、単純な「カラスが飛ぶように」測定を使用するよりも、距離の測定がより不正確になることがよくあります。
それを踏まえて、どうしてもやりたいというのであれば、以下のような方法がひとつ考えられます。
この種の方法の精度は、サンプリング レートを増やす (たとえば、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);