Добрый день!
Пытаюсь реализовать трёхмерную программу навигации на Java
Возникла сложность с преобразованием географических координат (широта и долгота) в экранные.
Сейчас реализовал алгоритм этого преобразования, как описано в книге “Имитационное моделирование экономических процессов” Емельянов А.А, Там есть глава “Отображение геоинформации в функциональном окне имитационной модели”
В итоге написал следующий код
public class GeoTransform {
double lonmax, lonmin, latmax, latmin;
double l1, l2, xmax, ymax,theta;
//В конструктор передается максимум по x и у для экрана минимальная и максимальная широта и долгота
public GeoTransform(double xmax, double ymax, double lonmax, double lonmin, double latmax, double latmin)
{
this.latmax=latmax;
this.latmin=latmin;
this.lonmax=lonmax;
this.lonmin=lonmin;
this.xmax=xmax;
this.ymax=ymax;
l1=xmax/Math.sin(0.5*Math.abs(lonmax-lonmin));
l2=(l1-2*ymax)/Math.cos(0.5*Math.abs(lonmax-lonmin));
theta=Math.abs(lonmax-lonmin);
}
//Получить радиус земли на заданной широте
static public double GetGeoRadiusMeters(double Lat)
{
double z1=6378245.0;
double z2=6356863.019;
double R=(z1*z2)/Math.sqrt(Math.pow(z1, 2)*Math.pow(Math.cos(Lat), 2)+Math.pow(z2, 2)*Math.pow(Math.sin(Lat), 2));
return R;
}
//Вычисляет x на экране
public double FindScreenX(double lat, double lon)
{
double l=CalculateL(lat);
//My code is here
double x=l*(Math.sin(-0.5*theta+(lon-lonmin)));
return x;
}
//Вычисляет у на экране
public double FindScreenY(double lat, double lon)
{
double l=CalculateL(lat);
double y=ymax-(l1-l*Math.cos(-0.5*theta+(lon-lonmin)));
return y;
}
private double CalculateL(double lat)
{
double l = l1-(l1-l2)*(lat-latmin)/(latmax-latmin);
return l;
}
public double GetDirection(double lat1, double lon1, double lat2,double lon2){
double x=(Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(lon2-lon1));
double y=Math.sin(lon2-lon1)*Math.cos(lat2);
double br=360-Math.toDegrees(Math.atan2(y, x));
if(br>360)
{
br=br-360;
}
return br;
}
static void GetRect(double lat1, double lon1, double radius, NODE vl, NODE nr)
{
double r=GetGeoRadiusMeters(lat1);
double gamma=radius*360/(2*Math.PI*r);
vl.setLatitude(gamma+lat1);
vl.setLongitude(lon1-gamma);
nr.setLatitude(lat1-gamma);
nr.setLongitude(gamma+lon1);
}
int IsInRect( NODE point, NODE vl, NODE nr)
{
if(point.getLatitude()<vl.getLatitude()&&point.getLatitude()>nr.getLatitude()&&point.getLongitude()>vl.getLongitude() &&point.getLongitude()<nr.getLongitude())
{
return 1;
}
else
{
return 0;
}
}
}
В результате перпендикулярные линии не перпендикулярны при отображении:
http://fotki.yandex.ru/users/atour07/view/530477/?page=0
Подскажите где в JOSM можно найти модуль преобразования из широты и долготы в экранные координаты?
Или киньте ссылку может кто сталкивался с подобной задачей.
Никак не могу найти.
Спасибо.