当前位置: 首页 > 知识库问答 >
问题:

使用OpenStreetMaps JMapViewer移动地图标记

赏开宇
2023-03-14

我正在使用Swing中的JMapViewer创建一个地图。我在地图上有几个表示汽车的MapMarkerDots。我试图更新这些标记的位置,以便它们看起来在地图上行驶,但它不太正常工作。我有一个“汽车”要遵循的坐标列表,但发生的情况是,位置被更新,但标记在完成之前不会重新绘制,这意味着标记是在初始位置和最终位置绘制的,而不是在两者之间的每一点绘制的。下面是我使用的代码。你知道为什么会发生这种情况吗?

public void drawRoute(String id){

    MapMarkerDot mmd;                                                       
    String evMarkerObject;          // ID and Marker position
    String[] items, locations;
    double lat, lon;

    for(int i = 0; i < route.length-1; i+=2){       // Iterate through the route

         List markers = zmap.getMapMarkerList();        // Get the markers that are currently on the map


        for(int j = 0; j < Daemon.evMarkers.size(); j++){  // Go through the list of recorded marker IDs and locations
            evMarkerObject = Arrays.toString(Daemon.evMarkers.get(j));      // Get marker id and location
            items = evMarkerObject.split(", ");                             // Split the ID and location
            if(items[0].substring(1).equals(id)){                           // If an ID match is found

                locations = items[1].split(" ");                            // Split location values by " "
                lat = Double.parseDouble(locations[2]);                     // Get latitude of marker
                lon = Double.parseDouble(locations[3]);                     // Get longitude of marker
                for(int k = 0; k < markers.size(); k++){                    // Go through list of markers currently on map
                    mmd = (MapMarkerDot) markers.get(k);                    // Get each marker in turn
                    if((mmd.getLat() == lat) && (mmd.getLon() == lon)){     // Check if recorded position matches marker position                               
                        zmap.removeMapMarker(mmd);                          // Remove marker from the map
                        break;                                              // Break from loop (appropriate marker found)
                    }
                }

                Daemon.evMarkers.remove(j);                                                 // Remove record of marker ID and position
                zaddMarker(Color.BLUE, route[i], route[i+1], 'e', items[0].substring(1));   // Add marker at new position
                    //zmap.repaint();
            }
        }
    }

调用函数(基于@Catalina的回答):

SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>(){

                                @Override
                                protected Void doInBackground() throws Exception {
                                    drawRoute(markerID);
                                    return null;
                                }
                            };

                            worker.execute();

这是在鼠标单击事件上调用的。

共有1个答案

谷梁子昂
2023-03-14

守护进程听起来像是一个后台线程,因此您需要使用SwingUtilities.invokelater对事件调度线程(EDT)进行任何更新。如果这种方法有效,swingworker可能是一种很好的方法,可以让守护进程在worker的进程方法中定期进行EDT更新。

 类似资料:
  • 这些是我找到的链接谷歌地图:移动标记和地图一起顺利与用户? 如何在Google Maps v2 android中平稳地移动当前位置标记

  • 我使用Google Maps Android SDK在地图上添加标记,这些标记的位置存储在我的应用程序的所有用户都可以使用的Firebase数据库中。每个标记的数据存储在唯一的Firebase记录中,每个记录包含纬度 添加了一个新标记。 更改现有标记(移动到新位置和/或“验证”) 删除现有标记 我实现了一个哈希图,如如何使用Firebase Google Maps API Android中的数据更

  • 用百度地图sdk实现简单的点击创建marker的功能。 在pc端实现了,并且无偏移(点击哪里就能哪里生成),但h5点击生成会有很大的偏移(无论是真机预览,还是f12的手机预览效果) 有大会知道怎么解决吗? pc 手机模拟(真机测过一样)

  • 问题内容: 我正在从事类似于UBER,Lyft或OLA的项目。使用可用的移动汽车在家里进行地图。我正在寻找某种图书馆,可以像UBER一样使汽车平稳行驶和转弯。现在,我可以使用以下代码将汽车平稳地从一个纬度移动到另一个纬度。但是棘手的部分是转弯,并确保汽车在转向时朝前。 平稳行驶的汽车代码: 问题答案: 我最近遇到了相同的用例。这是我的解决方案。 首先,我要感谢@VipiN分享了“ The Movi