C#のこのライブラリは、役立つ可能性のある多くのツールを提供します。
http://www.gavaghan.org/blog/free-source-code/geodesy-library-vincentys-formula/
編集これは地図投影法を使用するため、直線は使用しません。緯度間の距離はほぼ一定ですが、経度間の距離は緯度に依存することに注意する必要があります。
上記のライブラリに加えて、2点間の距離を測定するためのより簡単な近似値と、開始点からの特定の距離と方位にある点の座標もあります。
これは、2点間の距離を測定するコードです。
double lat1 = FSConvert.DegreesToRadians(start.Latitude.Decimal);
double lon1 = FSConvert.DegreesToRadians(start.Longitude.Decimal) * -1;
double lat2 = FSConvert.DegreesToRadians(end.Latitude.Decimal);
double lon2 = FSConvert.DegreesToRadians(end.Longitude.Decimal) * -1;
double result = Math.Acos(Math.Sin(lat1) * Math.Sin(lat2) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon1 - lon2));
distance = FSConvert.DradtoMeters(result);
これは、ベアリングを解決するためのコードです。
if (start == null || end == null)
{
return 0.0f;
}
double lat1 = FSConvert.DegreesToRadians(start.Latitude.Decimal);
double lon1 = FSConvert.DegreesToRadians(start.Longitude.Decimal) * -1;
double lat2 = FSConvert.DegreesToRadians(end.Latitude.Decimal);
double lon2 = FSConvert.DegreesToRadians(end.Longitude.Decimal) * -1;
double y = Math.Atan2(Math.Sin(lon1 - lon2) * Math.Cos(lat2), Math.Cos(lat1) * Math.Sin(lat2) - Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(lon1 - lon2));
const double x = 2 * Math.PI;
double result = y - x * Math.Floor(y / x);
bearing = FSConvert.RadiansToDegrees(result);
これは、原点からの距離と方位に基づいて終端座標を計算するためのコードです。
double lat1 = FSConvert.DegreesToRadians(start.Latitude.Decimal);
double lon1 = FSConvert.DegreesToRadians(start.Longitude.Decimal) * -1;
double d = FSConvert.MetersToDrad(distance);
double tc = FSConvert.DegreesToRadians(bearing);
double lat = Math.Asin(Math.Sin(lat1) * Math.Cos(d) + Math.Cos(lat1) * Math.Sin(d) * Math.Cos(tc));
double lon = ((lon1 - Math.Asin(Math.Sin(tc) * Math.Sin(d) / Math.Cos(lat)) + Math.PI) % (2 * Math.PI)) - Math.PI;
var returnPoint = new FSPoint {
Latitude = {
Decimal = FSConvert.RadiansToDegrees(lat)
},
Longitude = {
Decimal = FSConvert.RadiansToDegrees(lon) * -1
}
};
point = returnPoint;
FSConvertへの参照は、RadiansToDegreesなどを変更するだけです。これは簡単なことです。FSPointは単なる緯度/経度の構造体です。
したがって、プロセスは次のとおりです。
- 2点間の距離と方位を計算します
- 距離を100rで割ります
- デルタ距離と方位を使用して端子座標を計算します。
- もう一方の端に到達するまで、「ラインを歩き続ける」
さらにサポートが必要な場合はお知らせください