在JPanel上绘制近距离GPS坐标

时间:2013-05-03 17:11:46

标签: java swing graphics gps jpanel

我正面临一个问题,我需要转换并动态地将GPS坐标绘制到JPanel中。我将这个本地库数据放在我解析的文件中。结构是ID,县,图书馆名称,纬度,经度。

R1,Ramsey,Maplewood,45.0327,-93.0262
R2,Ramsey,Mounds View,45.1059,-93.2104
R3,Ramsey,New Brighton,45.06604,-93.19125
R4,Ramsey,North St. Paul,45.0105,-92.9968
R5,Ramsey,Roseville,45.0072,-93.1558
R6,Ramsey,Shoreview,45.0805,-93.1345
R7,Ramsey,White Bear Lake,45.0831,-93.0092

如您所见,这些地点非常接近(170平方英里的7个地点,相距最大距离:15.5英里)。我的代码目前可以从硬编码坐标而不是GPS数据中正确地绘制和链接节点。我已经找到了将GPS纬度和长度转换为XY坐标的算法,但是一旦计算发生,所有对象都会打印在彼此之上,因为计算导致相同的XY,因为它非常接近。该过程需要是动态的,因为我预计要使用的测试文件将使用42个位置。我能为一个方程式做些什么来为我提供足够多样的XY坐标来制作体面的图形渲染,而不是使用随机点?

2 个答案:

答案 0 :(得分:3)

  

对于能够为我提供足够多样的XY坐标而不是使用随机点的方程,我能做些什么呢?

找到边界框。换句话说,找到列表中最小的x和最小的y坐标。找到列表中最大的x和最大y坐标。这两点定义了边界框。

现在,将这些位置x,y坐标转换为绘制x,y坐标。您的最小位置x,y坐标变为绘图坐标0,0。您的最大位置x,y坐标变为绘图坐标宽度,高度。

为了防止缩放使图像失真,我们必须先计算x坐标和y坐标的缩放系数。

scaling factor x = drawing width / (location maximum x - location minimum x)
scaling factor y = drawing height / (location maximum y - location minimum y)

然后我们使用两个缩放因子中较小的一个。

scaling factor = Math.min(scaling factor x, scaling factor y)

将位置坐标转换为绘图坐标的公式为:

drawing x = location x * scaling factor
drawing y = location y * scaling factor

位置和缩放系数是双倍的,因此您不会丢弃任何精度。您必须将绘图x和绘制y转换为整数,以便绘制它们。

绘制x从西向东增加。位置x可能从西向东增加。

绘制y从北向南增加。如果位置y从南向北增加,那么在进行转换时必须考虑到这一点。

drawing y = drawing height - drawing y

您可能希望在绘图区域添加边距,以便在绘图区域的边缘上不绘制任何位置。

假设你想要一个10像素的边距。这将使实际绘图区域的宽度增大20像素,高度增加20像素。

然后在绘制位置之前,将10像素添加到图形x和图形y中。

答案 1 :(得分:1)

理想的方法是找到最小经度和最小纬度,最大经度和最大纬度,并将它们映射到[0,0]和[JPanels.width,Jpanels.Height]。

这张地图可以完成

Point map(cure_location){
   int X = (curr_location.longitude-min_longitude)*(scalelog);
   int Y = (curr_location.latitude-min_latitude)*(scalelon);
   return new Point(X,Y);
}

和scalelog和scalelon是

scalelog = (JPanels.width)/(max_longitude-min_longitude)
scalelat = (JPanels.height)/(max_latitude-min_latitude)