在JPanel上绘制近距离GPS坐标

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坐标,以便进行良好的图形渲染,而不是使用随机点?

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像素。

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


不,这种方法对我没有起作用,但当我尝试了@DarthCoder提供的下一个解决方案时,它对我有用。虽然这两种方法几乎相似,但有一些变化。 - Tanmoy Mondal

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)

谢谢亲爱的,好的解决方案。在尝试了不同的方法之后,这个对我起作用了... - Tanmoy Mondal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接