JMapViewer,获取OSM地图比例,Java
JMapViewer, get the OSM map scale, Java
在我的 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);
计算像素坐标"in meters";公式缺少像素大小...
JMapViewer
method getMeterPerPixel()
returns the number of meters per pixel at the current zoom level. It uses TileSource::getDistance
, which "Gets the distance using the spherical law of cosines。”在 org.openstreetmap.gui.jmapviewer.Demo
中,您可以看到值如何与缩放成反比;级别 10 和 98.5 meters/pixel 如下所示。参见 OsmMercator::getDistance
一个典型的实现。
在我的 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);
计算像素坐标"in meters";公式缺少像素大小...
JMapViewer
method getMeterPerPixel()
returns the number of meters per pixel at the current zoom level. It uses TileSource::getDistance
, which "Gets the distance using the spherical law of cosines。”在 org.openstreetmap.gui.jmapviewer.Demo
中,您可以看到值如何与缩放成反比;级别 10 和 98.5 meters/pixel 如下所示。参见 OsmMercator::getDistance
一个典型的实现。