0

緯度/経度座標の 2 つのセットがあり、視覚的にそれらの間に線を引きます。線に沿って「歩く」ときに緯度/経度座標を推測する方法はありますか

したがって、線に沿って 10% で、緯度/経度は次のようになります。

線に沿って 20% で、緯度/経度は次のようになります。

線に沿って 30% で、緯度/経度は次のようになります。

等..

私は、SQLの地理的なものに簡単な解決策があることを望んでいました..

理想的には SQL (SQL Server 2008 R2 データベース) で、または - 難しすぎる場合は - おそらく C# で

どんな助けでもいただければ幸いです

ありがとう

4

2 に答える 2

1

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は単なる緯度/経度の構造体です。

したがって、プロセスは次のとおりです。

  1. 2点間の距離と方位を計算します
  2. 距離を100rで割ります
  3. デルタ距離と方位を使用して端子座標を計算します。
  4. もう一方の端に到達するまで、「ラインを歩き続ける」

さらにサポートが必要な場合はお知らせください

于 2012-10-27T13:03:14.337 に答える
0

JAVA では、このコードを使用でき、非常にうまく機能します (上記の ScruffyDuck の返信からの変換)。

double x2 = next.latitude; 
                double y2 = next.longitude;
                double x1 = current.latitude;
                double y1 = current.longitude;

                double lat1 = Math.toRadians(x1);
                double lon1 = Math.toRadians(y1) * -1;
                double lat2 = Math.toRadians(x2);
                double lon2 = Math.toRadians(y2) * -1;
                double distance = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));

                double var1 = 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));
                double var2 = 2 * Math.PI;
                double bearing = var1 - var2 * Math.floor(var1 / var2);

                double lat = Math.asin(Math.sin(lat1) * Math.cos(distance) + Math.cos(lat1) * Math.sin(distance) * Math.cos(bearing));
                double lon = ((lon1 - Math.asin(Math.sin(bearing) * Math.sin(distance) / Math.cos(lat)) + Math.PI) % (2 * Math.PI)) - Math.PI;

                double x = Math.toDegrees(lat);
                double y = Math.toDegrees(lon) * -1;
                //****************

                Location l = new Location("temp");
                l.setLatitude(x);
                l.setLongitude(y); 
于 2013-07-01T02:47:48.593 に答える