【问题标题】:Drawing close range GPS coordinates on a JPanel在 JPanel 上绘制近距离 GPS 坐标
【发布时间】:2013-05-03 17:11:45
【问题描述】:

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

【问题讨论】:

    标签: java swing graphics gps jpanel


    【解决方案1】:

    对于一个方程,我可以做些什么,它会给我 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。

    【讨论】:

    • 太棒了!这正是我所需要的。
    • Nooo,这种方法对我不起作用,但是当我尝试@DarthCoder 给出的下一个解决方案时,这对我有用。虽然这两种方法几乎相似但有一些变化
    【解决方案2】:

    解决这个问题的理想方法是找到 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)
    

    【讨论】:

    • 谢谢亲爱的,很好的解决方案。在这里和那里尝试不同的东西后,这个对我有用......
    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多