我有个问题。我正在尝试编写一个JAVA代码,在给定的方位 (lat,lon) 中, 我需要获取形成扇区的所有点的速度(如图 (x1,y1) 、 (x2,y2) 和点列表中)它在轴承给出的方向上形成一个弧线(我对轴承的了解非常有限)。
我的第一件事是根据具有硬编码距离和角度的方向来实现扇区。(即固定值说d
=5km
和angle
= 60 deg
。)
下一步基于我想要距离的速度d
,并angle
像d
=func(speed)
和 angle
=一样计算,func(speed)
但这将在稍后进行。
由于方位是根据度数给出的,我不知道如何计算方向。我在想什么如果我能够将方位转换为同一方向的单位矢量。那么我认为我们可以绘制该部门。
如果我的理论/解释有误,请纠正我。请我需要帮助的人......
更多细节:
我正在做一个小项目,同时通过手机上的谷歌地图进行跟踪(lat,lon) - current position of user
, bearing - in the direction in which I am headed
并且speed - what speed i am travelling
。
距离和角度与速度的关系:
如果我以更快的速度行驶,则d
应该更多并且angle
应该更少(弧线会更窄)
如果我以较低的速度行驶,那么d
应该更小并且`角度应该更大(弧线会更宽)
如果我是静止的,速度是0
,然后我会围绕我的电流画一个圆圈,然后在我周围(lat,lon)
找到我的 POI。
一旦我得到这个扇区,我将使用 Elastic 搜索(它提供一些 func(),如附近搜索和多边形搜索)在我跟踪时获取沿途的所有兴趣点
最终,当我开车时,我想向用户展示他一路走来的 POI 是什么。(我们不知道用户的目的地)
更新
public class Test {
// N is the number of points on the arc
// e.g. const int N = 15;
private static final int N = 10;
public static void main(String[] args){
final double deg2Rad = Math.PI / 180.0; //degree to Radian
final double Rad2deg = 180.0 / Math.PI; //Radian to degree
double bearing = 90; //direction
double angle = 60; //sector angle
double R = 6371.0; //Radius of earth
double lat = 12.926428 * deg2Rad;
double lon = 77.677705 * deg2Rad;
double d = 5;
Geopoint[] array = new Geopoint[N];
double A = bearing - angle * 0.5; // starting angle / bearing
double dA = angle / (double)(N - 1); // angle step between adjacent points
/* convert lat, lon to cartesian here! */
double x = R * Math.cos(lat) * Math.cos(lon);
System.out.println(x);
double y = R * Math.cos(lat) * Math.sin(lon);
System.out.println(y);
double z = R * Math.sin(lat);
System.out.println(z);
for (int i = 0; i < N; i++, A += dA)
{
double c = Math.cos(A * deg2Rad),
s = Math.sin(A * deg2Rad);
System.out.println( "C : " + c);
System.out.println( "S : " + s);
double x1 = (x + d * c) ;
double y1 = (y + d * s) ;
//Convert back to Geopoint
lat = Math.asin(z / R) * Rad2deg;
lon = Math.atan2(y1, x1) * Rad2deg;
array[i] = new Geopoint(lon , lat );
}
// return array
for ( int i = 0; i < array.length; i++ )
System.out.println("points," + i + "," + array[i]);
}
}
对于上面的代码,我得到低于输出
输出
points,0,{ "lon":130.56759538189806, "lat":20.62976857973366, "geoadress":"null" }
points,1,{ "lon":130.56753333442796, "lat":20.62976857973366, "geoadress":"null" }
points,2,{ "lon":130.56747144031073, "lat":20.62976857973366, "geoadress":"null" }
points,3,{ "lon":130.56740969980146, "lat":20.62976857973366, "geoadress":"null" }
points,4,{ "lon":130.5673481131545, "lat":20.62976857973366, "geoadress":"null" }
points,5,{ "lon":130.5672866806237, "lat":20.62976857973366, "geoadress":"null" }
points,6,{ "lon":130.5672254024622, "lat":20.62976857973366, "geoadress":"null" }
points,7,{ "lon":130.5671642789225, "lat":20.62976857973366, "geoadress":"null" }
points,8,{ "lon":130.5671033102564, "lat":20.62976857973366, "geoadress":"null" }
points,9,{ "lon":130.56704249671517, "lat":20.62976857973366, "geoadress":"null" }
但是这个输出是错误的。我不知道我哪里出错了。
输出
更改为弧度后,这是我的结果lat
。lon
points,0,12.926428,77.677705
points,1,12.926428,77.6917252889466
points,2,12.926428,77.68652371253442
points,3,12.926428,77.68120259629767
points,4,12.926428,77.67583406750569
points,5,12.926428,77.67049090073982
points,6,12.926428,77.6652455243131
points,7,12.926428,77.6601690315512
points,8,12.926428,77.65533021080672
points,9,12.926428,77.65079460778875
points,10,12.926428,77.64662363329005
因为我是lat = Math.asin(z / R) * Rad2deg;
从笛卡尔转换过来的,所以我得到了所有相同的结果。我不知道如何解决这个问题。
结果
基于iant
代码
结果_1#
我已经计算了(lat,lon)
到弧上每个点的距离。它应该导致相同的距离。iant
检查结果距离略有变化。
type,id,lat,lon
points,1,12.926428,77.677705
Distance in mtrs : 0.0
points,2,12.92657150782396,77.67778916970093
Distance in mtrs : 9.971162660481445
points,3,12.926578367173896,77.67778862221844
Distance in mtrs : 9.971162660481445
points,4,12.926585180719618,77.67778804926368
Distance in mtrs : 9.971162660481445
points,5,12.926591946385617,77.67778745101116
Distance in mtrs : 9.97070966260917
points,6,12.92659866211097,77.67778682764309
Distance in mtrs : 9.971162660481445
points,7,12.926605325849975,77.6777861793494
Distance in mtrs : 9.971162660481445
points,8,12.926611935572756,77.67778550632754
Distance in mtrs : 9.97070966260917
points,9,12.926618489265902,77.67778480878253
Distance in mtrs : 9.97070966260917
points,10,12.92662498493306,77.67778408692685
Distance in mtrs : 9.971162660481445
points,11,12.926631420595564,77.67778334098041
Distance in mtrs : 9.97070966260917
points,12,12.926637794293018,77.67778257117044
Distance in mtrs : 9.97070966260917
points,13,12.926644104083913,77.67778177773138
Distance in mtrs : 9.97070966260917
points,14,12.9266503480462,77.67778096090498
Distance in mtrs : 9.97070966260917
points,15,12.926656524277885,77.67778012094006
Distance in mtrs : 9.970256644154967
points,16,12.926662630897608,77.67777925809244
Distance in mtrs : 9.970256644154967
points,17,12.926668666045215,77.67777837262499
Distance in mtrs : 9.97070966260917
points,18,12.926674627882324,77.67777746480742
Distance in mtrs : 9.97070966260917
points,19,12.92668051459289,77.67777653491626
Distance in mtrs : 9.970256644154967
points,20,12.926686324383741,77.6777755832348
Distance in mtrs : 9.970256644154967
points,21,12.926692055485155,77.67777461005294
Distance in mtrs : 9.970256644154967
points,22,12.926428,77.677705
Distance in mtrs : 0.0
距离计算
public static double distanceOf(Geopoint a, Geopoint b) {
if (a.isValid() && b.isValid()) {
double distFactor = Math.acos(Math.sin(Math.toRadians(a.getLat())) * Math.sin(Math.toRadians(b.getLat()))
+ Math.cos(Math.toRadians(a.getLat())) * Math.cos(Math.toRadians(b.getLat()))
* Math.cos(Math.toRadians(b.getLon()) - Math.toRadians(a.getLon())));
return 6378.388 * distFactor;
}
return -1;
}