首页 > 解决方案 > C#创建距离为100km的经纬度地图字典

问题描述

我正在尝试计算数学以获得彼此之间特定距离内的所有经度和纬度。我有计算地理坐标之间距离的数学,但我想从特定距离的标准平面地球地图中获取所有地理坐标的数组。你能帮我吗?

这是地球图图片的示例链接。我有分辨率为 43200x21600 的地球高度图,我想在 100 公里的精确距离内获得从左下角到右上角的高度/像素索引。如果我能得到距离 100 公里的经度和纬度,那么我可以读取这些高度。

这是地理点之间距离的数学:

public static float GetGeographicDistance(float latitudeA, float longitudeA, float latitudeB, float longitudeB, float earthRadius = 6371.007f)
        {
            float phi1 = latitudeA * Mathf.Deg2Rad;
            float phi2 = latitudeB * Mathf.Deg2Rad;
            float deltaPhi = (latitudeB - latitudeA) * Mathf.Deg2Rad;
            float deltaLambda = (longitudeB - longitudeA) * Mathf.Deg2Rad;

            float a = Mathf.Sin(deltaPhi / 2) * Mathf.Sin(deltaPhi / 2) +
                Mathf.Cos(phi1) * Mathf.Cos(phi2) *
                    Mathf.Sin(deltaLambda / 2) * Mathf.Sin(deltaLambda / 2);
            float c = 2.0f * Mathf.Atan2(Mathf.Sqrt(a), Mathf.Sqrt(1.0f - a));

            return earthRadius * c;
        }

标签: c#unity3d

解决方案


知道了。如果有人需要,这里是 C# 中的函数。

public static TGeographicCoordinate DestinationPointFromStartPoint(TGeographicCoordinate start, double distance = 100f, double bearing = 90f, double earthRadius = 6371.009d)
        {
            TGeographicCoordinate result = new TGeographicCoordinate();
            double angularDistanceRdn = distance / earthRadius;
            double bearingRad = Mathf.Deg2Rad * bearing;

            double startLatRad = start.Latitude * Mathf.Deg2Rad;
            double startLonRad = start.Longitude * Mathf.Deg2Rad;

            result.Latitude = Math.Asin((Math.Sin(startLatRad) * Math.Cos(angularDistanceRdn)) +
                      (Math.Cos(startLatRad) * Math.Sin(angularDistanceRdn) * Math.Cos(bearingRad)));
            result.Longitude = startLonRad + Math.Atan2(Math.Sin(bearingRad) * Math.Sin(angularDistanceRdn) * Math.Cos(startLatRad),
                                         Math.Cos(angularDistanceRdn) - (Math.Sin(startLatRad)) * Math.Sin(result.Latitude));

            result.Latitude *= Mathf.Rad2Deg;
            result.Longitude *= Mathf.Rad2Deg;

            return result;
        }

推荐阅读