2016-04-20 88 views
2

我无法将经度和纬度坐标转换为适合绘制到JPanel的X/Y坐标。我可以将它们转换为适当的x/y值,但是这些值都非常相似,并且没有足够的差异来绘制我试图绘制的地图。我正在使用带有Line2D的JPanel,但是我见过使用多边形的示例,但是当我做到这一点时,地图看起来并不正确。如何将关闭的经度/纬度点转换为Java中可绘制的x/y坐标?

我转换的经纬度都非常接近(都在大学校园内),所以我的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] 

这里是我的转换代码,从另一个线程在这里拍摄,其中地图高度地图宽度均为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的:

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

你能上传你所看到的图片吗?这将有助于诊断问题。 :) –

回答

0

在最后的步骤中,为了变换xVal值,它是xMinxMax之间成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; 
+1

这工作完美!谢谢! – jackknife

相关问题