Нужен сектор, основанный на азимуте, геопозиции, расстоянии и угле
У меня проблема. Я пытаюсь написатьДЖАВА код был в данподшипник, (широта, долгота), скорость Мне нужно получить все точки, которые образуют сектор (как на диаграмме (x1, y1), (x2, y2) и список точек, которые образуютдуга в направлении, которое дается подшипником (у меня очень ограниченные знания о подшипнике).
Первое, что я хочу сделать, - это создать сектор, основанный на направлении с жестко заданным расстоянием и углом. (т.е. фиксированные значения говорятd
= 5km
а такжеangle
= 60 deg
.)
Следующий шаг основан на скорости, я хочу расстояниеd
а такжеangle
рассчитываться какd
= func(speed)
а такжеangle
= func(speed)
но это будет позже.
Так как направление дано в градусах, я не знаю, как рассчитать направление. О чем я думал, если смог преобразовать подшипник в единичный вектор в том же направлении. тогда я думаю, что мы можем нарисовать сектор.
Поправь меня, если я ошибаюсь в своей теории / объяснении. Пожалуйста, мне нужна помощь, ребята .....
Больше деталей:Я работаю над небольшим проектом, который отслеживался через карты Google на телефоне.(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 search (он предоставляет некоторые функции (), такие как поиск по соседству и поиск по полигонам), чтобы получить все интересные места на моем пути, пока я отслеживаю
В конечном счете, пока я за рулем, я хочу показать пользователю, какие 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
код
Я вычислил расстояние между прочим(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;
}