3

我面临一个类的问题,我需要将 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 坐标,它有足够的变化来进行像样的图形渲染,而不是使用随机点?

4

2 回答 2

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。

于 2013-05-03T17:30:37.720 回答
1

解决此问题的理想方法是找到 min-longitude 和 min-latitude 、 max-longitude 和 max-latitude 并将它们映射到 [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)
于 2013-05-03T17:56:58.533 回答