我正面临一个问题,我需要转换并动态地将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坐标来制作体面的图形渲染,而不是使用随机点?
答案 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)