我面临一个类的问题,我需要将 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,Sview,45.0805,-93.1345
R7,Ramsey,White Bear Lake,45.0831,-93.0092
如您所见,这些位置非常接近(170 平方英里中有 7 个位置,最大距离:15.5 英里)。我的代码当前可以从硬编码的坐标而不是 GPS 数据中正确绘制和链接节点。我已经找到了将 GPS lat 和 long 转换为 XY 坐标的算法,但是一旦进行了计算,所有对象就会彼此重叠,因为计算会导致相同的 XY 坐标,因为它是如此接近,所以我可以使用 42 个动态图形
我能为一个方程做什么,它会给我 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 从南到北增加,那么在进行转换时必须考虑到这一点。
drawing y = drawing height - drawing y
您可能希望向绘图区域添加边距,以便不会在绘图区域的边缘上绘制任何位置。
假设您想要 10 个像素的边距。这将使实际绘图区域的宽度大 20 个像素,高度大 20 个像素。
然后,在绘制位置之前,向图形 x 和图形 y 添加 10 个像素。
解决这个问题的理想方法是找到最小经度和最小纬度,最大经度和最大纬度,并将它们映射到 [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)
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(61条)