JMapViewer,获取OSM地图比例,Java

JMapViewer,获取OSM地图比例,Java,java,scale,jmapviewer,Java,Scale,Jmapviewer,在我的Java应用程序中,我使用的是JmapViewer;这张地图是在jPanel上绘制的。是否可以获得与当前缩放级别对应的地图比例?该地图基于著名的墨卡托投影: 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); f

在我的Java应用程序中,我使用的是JmapViewer;这张地图是在jPanel上绘制的。是否可以获得与当前缩放级别对应的地图比例?该地图基于著名的墨卡托投影:

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);
像素坐标以“米”为单位进行计算;公式缺少像素大小…

该方法返回当前缩放级别下每个像素的米数。它使用
TileSource::getDistance
,它“使用获取距离”。在
org.openstreetmap.gui.jmapviewer.Demo
中,您可以看到值如何随缩放而反向变化;10级和98.5米/像素如下所示。有关典型的实现,请参见
OsmMercator::getDistance


将其作为独立于Java、JMapViewer、JPanel等的算法问题重新发布。您有Lon/Lat坐标和墨卡托投影,并且您希望计算到宽度dx和高度dy的像素框上的投影。将缩放方面添加到问题中,即您将有一个缩放中心点和比例因子。其余的都无关紧要。以目前的形式,你很可能得不到合理的答案。