Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 推断两个位置之间直线上不同位置的纬度坐标_C#_Sql_Geolocation_Sql Server 2008 R2_Geometry - Fatal编程技术网

C# 推断两个位置之间直线上不同位置的纬度坐标

C# 推断两个位置之间直线上不同位置的纬度坐标,c#,sql,geolocation,sql-server-2008-r2,geometry,C#,Sql,Geolocation,Sql Server 2008 R2,Geometry,我有两组lat/lng坐标,我在它们之间画了一条线。 当您沿线路“行走”时,是否有方法推导纬度/液化天然气坐标 因此,沿线10%的lat/lng将 沿线20%的lat/lng将 沿线30%的lat/lng将 等等 我希望sql中的地理信息可以有一个简单的解决方案 最好是在SQL(SQLServer2008R2数据库)中,或者-如果太复杂-可能是在C中# 任何帮助都将不胜感激 谢谢这个C#库提供了很多可能有用的工具: 编辑 它使用地图投影,因此不使用直线。您需要知道,纬度之间的距离或多或少是恒定

我有两组lat/lng坐标,我在它们之间画了一条线。 当您沿线路“行走”时,是否有方法推导纬度/液化天然气坐标

因此,沿线10%的lat/lng将

沿线20%的lat/lng将

沿线30%的lat/lng将

等等

我希望sql中的地理信息可以有一个简单的解决方案

最好是在SQL(SQLServer2008R2数据库)中,或者-如果太复杂-可能是在C中#

任何帮助都将不胜感激

谢谢

这个C#库提供了很多可能有用的工具:

编辑 它使用地图投影,因此不使用直线。您需要知道,纬度之间的距离或多或少是恒定的,但经度之间的距离取决于纬度

除了上面的库之外,还有一些更简单的近似方法,用于测量两点之间的距离,以及给定距离处的点坐标和从起点的方位

这是一些测量两点之间距离的代码:

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的引用只会改变角度等等——这很简单。FSPoint只是一个lat/long结构

因此,过程是:

  • 计算两点之间的距离和方向
  • 将距离除以10或任意值
  • 使用增量距离和方向角计算端子坐标
  • 继续沿着这条线走,直到到达另一端

  • 如果您需要更多JAVA帮助,请让我知道

    ,您可以使用这段代码,它工作得非常好(根据上面ScruffyDuck的回复进行转换)


    这条线是在球体的表面上还是在平地上?它只是一个国家的两个位置——如果有帮助的话——可能在该国的任何地方——因此在两个城市之间——直线——就像乌鸦一样——就足够了——正如你所说的地理信息(和术语)这不是我的强项——想象一下谷歌地图上两个地点之间的直线。对不起,如果我没有正确解释这一点,如果我们假设乌鸦可以在珠穆朗玛峰上空飞行,如果你从未穿过两极或-180/180线,那就太微不足道了。
    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);