如何在Java中将关闭的经度/纬度点转换为可绘制的x / y坐标?

时间:2016-04-20 23:10:03

标签: java dictionary jpanel coordinates

我无法将纬度和经度坐标转换为适合绘制到JPanel的X / Y坐标。我可以将它们转换为正确的x / y值,但是这些值都非常相似,并且差别不足以实际绘制我想要绘制的地图。我正在使用带有Line2D的JPanel,但是我看过使用Polygon的示例,但是当我这样做时,地图看起来并不正确。

我转换的纬度/长点都非常接近(都位于大学校园内),因此我的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乘以一个scaleFactor,它是通过找到X和Y值的最小值/最大值并找到宽度/高度与最大值和最小值的比率来计算的,如下所示:

double scaleX = (MAP_WIDTH-20) / (maxX - minX);
double scaleY = (MAP_HEIGHT-20) / (maxY-minY); 

1 个答案:

答案 0 :(得分:0)

在最后一步中,为了将xValxMin之间的xMax值转换为0MAP_WIDTH-20之间的值,需要这样的东西:

double newX = (xVal - minX) * (MAP_WIDTH-20) / (maxX - minX);
double newY = (yVal - minY) * (MAP_HEIGHT-20) / (maxY - minY);

或(使用您定义的scaleXscaleY):

double newX = (xVal - minX) * scaleX;
double newY = (yVal - minY) * scaleY;