如何将接近的 Longitude/Latitude 点转换为 Java 中的可绘制 x/y 坐标?
How do I convert close Longitude/Latitude points to drawable x/y coordinates in Java?
我在将纬度和经度坐标转换为适合绘制到 JPanel 的 X/Y 坐标时遇到问题。我可以将它们转换为适当的 x/y 值,但是这些值都太相似了,而且差别不大,无法实际绘制我要绘制的地图。我正在使用带有 Line2D 的 JPanel,但是我看到了使用多边形的示例,但是当我这样做时,地图看起来根本不正确。
我转换的lat/long点都非常接近(都在大学校园内),所以我的x/y值也非常接近。我需要一种方法来转换它们,以便它们在 600x600 像素的 JPanel 中表示。这是我转换为 XY 的一些点及其值的示例:
GL 43.130480 -77.631559
i2 43.130425 -77.631532
i3 43.130335 -77.631760
--Convert to X/Y--
0 GILBERT-LONG [lat=579.9952509893145, long=502.4890740637273]
44 i2 [lat=579.9950131035996, long=502.4888664711529]
45 i3 [lat=579.997021932372, long=502.48852677421297]
这是我的转换代码,取自此处的另一个线程,其中 MAP_HEIGHT 和 MAP_WIDTH 均为 600:
public static void toXY()
{
for(Vertex x : vertices)
{
double xVal = (x.coordinate.latitude*MAP_HEIGHT/180) + (MAP_HEIGHT/2);
double latRad = x.coordinate.longitude*(Math.PI/180);
double mercatorN = Math.log(Math.tan((Math.PI/4)+(latRad/2)));
double yVal = (MAP_HEIGHT/2)-(MAP_WIDTH*mercatorN/(Math.PI*2));
//double yVal = (x.coordinate.longitude * MAP_WIDTH/360.0) + (MAP_WIDTH/2);
x.coordinate.longitude = xVal;
x.coordinate.latitude = yVal;
}
我还将 x 和 y 乘以一个比例因子,该比例因子是通过找到 X 和 Y 值的 min/max 并找到 width/heigh 与像这样的最大值和最小值:
double scaleX = (MAP_WIDTH-20) / (maxX - minX);
double scaleY = (MAP_HEIGHT-20) / (maxY-minY);
在最后一步,为了将xMin
和xMax
之间的xVal
值转换为0
和MAP_WIDTH-20
之间的值,你需要这样的东西:
double newX = (xVal - minX) * (MAP_WIDTH-20) / (maxX - minX);
double newY = (yVal - minY) * (MAP_HEIGHT-20) / (maxY - minY);
或(使用您定义的 scaleX
和 scaleY
):
double newX = (xVal - minX) * scaleX;
double newY = (yVal - minY) * scaleY;
我在将纬度和经度坐标转换为适合绘制到 JPanel 的 X/Y 坐标时遇到问题。我可以将它们转换为适当的 x/y 值,但是这些值都太相似了,而且差别不大,无法实际绘制我要绘制的地图。我正在使用带有 Line2D 的 JPanel,但是我看到了使用多边形的示例,但是当我这样做时,地图看起来根本不正确。
我转换的lat/long点都非常接近(都在大学校园内),所以我的x/y值也非常接近。我需要一种方法来转换它们,以便它们在 600x600 像素的 JPanel 中表示。这是我转换为 XY 的一些点及其值的示例:
GL 43.130480 -77.631559
i2 43.130425 -77.631532
i3 43.130335 -77.631760
--Convert to X/Y--
0 GILBERT-LONG [lat=579.9952509893145, long=502.4890740637273]
44 i2 [lat=579.9950131035996, long=502.4888664711529]
45 i3 [lat=579.997021932372, long=502.48852677421297]
这是我的转换代码,取自此处的另一个线程,其中 MAP_HEIGHT 和 MAP_WIDTH 均为 600:
public static void toXY()
{
for(Vertex x : vertices)
{
double xVal = (x.coordinate.latitude*MAP_HEIGHT/180) + (MAP_HEIGHT/2);
double latRad = x.coordinate.longitude*(Math.PI/180);
double mercatorN = Math.log(Math.tan((Math.PI/4)+(latRad/2)));
double yVal = (MAP_HEIGHT/2)-(MAP_WIDTH*mercatorN/(Math.PI*2));
//double yVal = (x.coordinate.longitude * MAP_WIDTH/360.0) + (MAP_WIDTH/2);
x.coordinate.longitude = xVal;
x.coordinate.latitude = yVal;
}
我还将 x 和 y 乘以一个比例因子,该比例因子是通过找到 X 和 Y 值的 min/max 并找到 width/heigh 与像这样的最大值和最小值:
double scaleX = (MAP_WIDTH-20) / (maxX - minX);
double scaleY = (MAP_HEIGHT-20) / (maxY-minY);
在最后一步,为了将xMin
和xMax
之间的xVal
值转换为0
和MAP_WIDTH-20
之间的值,你需要这样的东西:
double newX = (xVal - minX) * (MAP_WIDTH-20) / (maxX - minX);
double newY = (yVal - minY) * (MAP_HEIGHT-20) / (maxY - minY);
或(使用您定义的 scaleX
和 scaleY
):
double newX = (xVal - minX) * scaleX;
double newY = (yVal - minY) * scaleY;