计算给定距离、方位、起点的终点
我正在尝试找到目的地点,给定起点纬度/经度、方位和方向。距离。下面这个网站的计算器给了我想要的结果。
http://www.movable-type.co.uk/scripts/latlong.html
当我尝试通过代码实现相同的功能时,我没有得到正确的结果。
下面是我的代码 -
private GLatLng pointRadialDistance(double lat1, double lon1,
double radianBearing, double radialDistance)
{
double rEarth = 6371.01;
lat1 = DegreeToRadian(lat1);
lon1 = DegreeToRadian(lon1);
radianBearing = DegreeToRadian(radianBearing);
radialDistance = radialDistance / rEarth;
double lat = Math.Asin(Math.Sin(lat1) * Math.Cos(radialDistance) + Math.Cos(lat1)
* Math.Sin(radialDistance) * Math.Cos(radianBearing));
double lon;
if (Math.Cos(lat) == 0)
{ // Endpoint a pole
lon = lon1;
}
else
{
lon = ((lon1 - Math.Asin(Math.Sin(radianBearing) * Math.Sin(radialDistance) / Math.Cos(lat))
+ Math.PI) % (2 * Math.PI)) - Math.PI;
}
lat = RadianToDegree(lat);
lon = RadianToDegree(lon);
GLatLng newLatLng = new GLatLng(lat, lon);
return newLatLng;
}
public double Bearing(double lat1, double long1, double lat2, double long2)
{
//Convert input values to radians
lat1 = DegreeToRadian(lat1);
long1 = DegreeToRadian(long1);
lat2 = DegreeToRadian(lat2);
long2 = DegreeToRadian(long2);
double deltaLong = long2 - long1;
double y = Math.Sin(deltaLong) * Math.Cos(lat2);
double x = Math.Cos(lat1) * Math.Sin(lat2) -
Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(deltaLong);
double bearing = Math.Atan2(y, x);
return bearing;
}
public double DegreeToRadian(double angle)
{
return Math.PI * angle / 180.0;
}
public double RadianToDegree(double angle)
{
return 180.0 * angle / Math.PI;
}
从主程序中,我调用子程序如下 -
double bearing = Bearing(-41.294444, 174.814444, -40.90521, 175.6604);
GLatLng endLatLng = pointRadialDistance(-41.294444, 174.814444, bearing, 80);
我得到以下结果 -
Bearing=1.02749621782165
endLatLng=-40.5751022737927,174.797458881699
我期望的答案是 -40.939722,175.646389
(来自上面的网站链接)。
谁能建议我在这里的代码中犯了什么错误?
I am trying to find the destination point, given a starting point lat/long, bearing & distance. The calculator from this website below gives me the desired results.
http://www.movable-type.co.uk/scripts/latlong.html
When I try to implement the same through code, I don't get the right results.
Below is my code -
private GLatLng pointRadialDistance(double lat1, double lon1,
double radianBearing, double radialDistance)
{
double rEarth = 6371.01;
lat1 = DegreeToRadian(lat1);
lon1 = DegreeToRadian(lon1);
radianBearing = DegreeToRadian(radianBearing);
radialDistance = radialDistance / rEarth;
double lat = Math.Asin(Math.Sin(lat1) * Math.Cos(radialDistance) + Math.Cos(lat1)
* Math.Sin(radialDistance) * Math.Cos(radianBearing));
double lon;
if (Math.Cos(lat) == 0)
{ // Endpoint a pole
lon = lon1;
}
else
{
lon = ((lon1 - Math.Asin(Math.Sin(radianBearing) * Math.Sin(radialDistance) / Math.Cos(lat))
+ Math.PI) % (2 * Math.PI)) - Math.PI;
}
lat = RadianToDegree(lat);
lon = RadianToDegree(lon);
GLatLng newLatLng = new GLatLng(lat, lon);
return newLatLng;
}
public double Bearing(double lat1, double long1, double lat2, double long2)
{
//Convert input values to radians
lat1 = DegreeToRadian(lat1);
long1 = DegreeToRadian(long1);
lat2 = DegreeToRadian(lat2);
long2 = DegreeToRadian(long2);
double deltaLong = long2 - long1;
double y = Math.Sin(deltaLong) * Math.Cos(lat2);
double x = Math.Cos(lat1) * Math.Sin(lat2) -
Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(deltaLong);
double bearing = Math.Atan2(y, x);
return bearing;
}
public double DegreeToRadian(double angle)
{
return Math.PI * angle / 180.0;
}
public double RadianToDegree(double angle)
{
return 180.0 * angle / Math.PI;
}
From the main program, I call the sub procedures as follows -
double bearing = Bearing(-41.294444, 174.814444, -40.90521, 175.6604);
GLatLng endLatLng = pointRadialDistance(-41.294444, 174.814444, bearing, 80);
I get below results -
Bearing=1.02749621782165
endLatLng=-40.5751022737927,174.797458881699
The answer I expect is -40.939722,175.646389
(from website link above).
Can anyone suggest what mistake I am making in the code here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是一些可以实现您想要做的事情的代码。
Here's some code that achieves what you want to do.
这是我从 http://www.movable- 转换为 C# 的代码type.co.uk/scripts/latlong.html。使用起来应该非常简单。
radius
是地球半径的常数,以米为单位。它使用元组,因此您可以使用
.Lat
或.Lon
单独访问纬度或经度。Here is my code that I converted to C# from http://www.movable-type.co.uk/scripts/latlong.html. It should be pretty simple to use.
radius
is a constant for the Earth's radius in meters.It uses tuples so you can access the latitude or longitude individually with
.Lat
or.Lon
.下面是 http://www.movable-type 上的 JavaScript 代码的实现。 co.uk/scripts/latlong.html 我为自己编写并在自己的项目中使用。如果愿意,您可以将其实施到您的项目中。
注意:坐标是一个具有X(经度)、Y(纬度)、Z(高度)属性的类。 ToDegree() 和 ToRadian() 是 Double 类型的扩展。最后,GetTarget() 是坐标实例的扩展。
Below is the implementation of the JavaScript code at http://www.movable-type.co.uk/scripts/latlong.html which I wrote for myself and use in my own projects. You can implement it to your project if you will.
Note: Coordinate is a class with X (longitude), Y (latitude), Z (altitude) properties. ToDegree() and ToRadian() are extensions for Double type. Finally, GetTarget() is an extension for a Coordinate instance.
几何库(V3)中非常简单的解决方案,如果您在使用谷歌地图 API V3 时没有问题(取决于应用程序 - 例如实时资产跟踪 - 免费许可证不适用或者您可能不想重构从 V2 到 V3)。
第一:声明一个额外的图书馆以及您当前的声明:
第二:确定起点、航向和距离
第三:去那里
完成,您现在在伦敦镇。有关computeDistance、computeHeading 和computeArea 的详细信息:
http://www.svennerberg.com/2011/04/calculated-distances-and-areas-in-google-maps-api-3/
http://code.google.com/intl/en/apis/maps/documentation/javascript/geometry .html
very simple solution in geometry library (V3), if you do not have a problema with using the google maps api V3 (depending on the application - realtime asset tracking, for example - the free license is not applicable OR you might not want to refactor from V2 to V3).
1st: declare an extra library ALONG with your current declaration:
2nd: establish starting point, heading and distance
3rd: go there
done, you are now in London town. for more info regarding computeDistance, computeHeading and computeArea:
http://www.svennerberg.com/2011/04/calculating-distances-and-areas-in-google-maps-api-3/
http://code.google.com/intl/en/apis/maps/documentation/javascript/geometry.html