2016-09-08 2 views
3

В моем приложении Java я использую JmapViewer; карта нарисована на jPanel. Можно ли получить масштаб карты, соответствующий текущему уровню масштабирования? Карта основана на известной проекции Меркатора:JMapViewer, получить масштаб карты OSM, Java

X = R * lon * cos(lat1); 
Y = R * log(tan(lat/2 + 45)), lat1 = 0; 

проекция является конформным, так что локальная линейная шкала не зависит от направления. Моя идея использует две точки, разделяющие ту же параллель:

Point p1 = new Point(0,0); 
Point p2 = new Point(100,0); 

final double dlon = getPosition(p2).getLon() - getPosition(p1).getLon(); 
final double scale = 6380000 * abs(dlon) * PI/180/100; //scale = (R * dlon)/||p1-p2|| 

улучшение: начальная точка p1 может быть центром зрения.

Point p1 = new Point(jPanel1.width()/2,jPanel1.height()/2); 
Point p2 = new Point(jPanel1.width()/2 + 100, jPanel1.height()/2); 

Координаты пикселей оцениваются «в метрах»; в формуле отсутствует размер пикселя ...

+0

перепечатывать его как алгоритм вопроса не зависит от Java, JMapViewer, JPanel и т.д. У вас есть Lon/Lat координаты и проекции Меркатора, и вы хотите, чтобы вычислить проекцию на пиксельном поле шириной и высотой йх йу. Добавьте к вопросу о масштабировании, то есть у вас будет центральная точка масштабирования и масштабный коэффициент. Остальное не имеет значения. В текущей форме вы, скорее всего, не получите разумного ответа. –

ответ

3

Метод JMapViewergetMeterPerPixel() возвращает количество метров на пиксель при текущем уровне масштабирования. Он использует TileSource::getDistance, который «Получает расстояние, используя spherical law of cosines». В org.openstreetmap.gui.jmapviewer.Demo вы можете видеть, как значение изменяется обратно пропорционально масштабированию; уровень 10 и 98,5 м/пиксель показаны ниже. См. OsmMercator::getDistance для типичной реализации.

map image

+1

@ trashgod: Большое спасибо за ваш полезный ответ ... – justik

Смежные вопросы