0

您好,我正在编写一个使用来自网络服务器的坐标的应用程序。我知道如何从网络服务中检索坐标,但是一旦我得到它们,我怎么能不断地在地图上显示它们。有点像位置监听器在位置管理器的位置更改时更新地图上的点。我想不断更新我从网络服务收到的积分。这是通过服务完成的吗?如果有怎么办?

        public class GeoUpdateHandler implements LocationListener {  

        @Override  
        public void onLocationChanged(Location location) {  
            ...
                GeoPoint point = new GeoPoint(lat, lng);  
            createMarker();  
            mapController.animateTo(point); // mapController.setCenter(point);  
        }  

更新: Createmarker 的代码

private void createMarker() {  
        GeoPoint p = mapView.getMapCenter();  
        OverlayItem overlayitem = new OverlayItem(p, "", "");  
        itemizedoverlay.addOverlay(overlayitem);  
        mapView.getOverlays().add(itemizedoverlay);  
    }  

更新:从 web 服务获取坐标的代码...

HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(".../android/serverFile.php");
        JSONObject json = new JSONObject();
        try {
            JSONArray postjson=new JSONArray();
            postjson.put(json);
            // Execute HTTP Post Request
            System.out.print(json);
            HttpResponse response = httpclient.execute(httppost);
            // for JSON:
            if(response != null)
            {
                InputStream is = response.getEntity().getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();
                String line = null;
                try {
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                String jsonStr = sb.toString();
                JSONObject jsonObj = new JSONObject(jsonStr);
                String longitudecord = jsonObj.getString("lon");
                String latitudecord = jsonObj.getString("lat");

}

用定时器更新:

public void startService(){
    timer.scheduleAtFixedRate(new TimerTask(){
        @Override
        public void run() {
                 //Call the method that contacts the server and  
                 //adds the coordinates to a list. Get those values from the list.  
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://www.kre8tiveinspired.com/android/serverFile.php");
            JSONObject json = new JSONObject();

            try {
                // JSON data:
                JSONArray postjson=new JSONArray();
                postjson.put(json);
                // Execute HTTP Post Request
                System.out.print(json);
                HttpResponse response = httpclient.execute(httppost);
                // for JSON:
                if(response != null)
                {
                    InputStream is = response.getEntity().getContent();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                    StringBuilder sb = new StringBuilder();
                    String line = null;
                    try {
                        while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            is.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    String jsonStr = sb.toString();
                    JSONObject jsonObj = new JSONObject(jsonStr);
                    // grabbing the menu object 
                    String longitudecord = jsonObj.getString("lon");
                    String latitudecord = jsonObj.getString("lat");
                    latcord = latitudecord;
                    loncord = longitudecord;
                }

            }catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
            } catch (IOException e) {
                // TODO Auto-generated catch block
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                 Handler handler = new Handler();
                 handler.post(new Runnable(){  
                       public void run(){

                        double aDouble = Double.parseDouble(loncord);
                    double bDouble = Double.parseDouble(latcord);

                    int lat = (int) (aDouble * 1E6);  
                        int lng = (int) (bDouble * 1E6);  
                        GeoPoint point = new GeoPoint(lat, lng);  
                        createMarker();  
                        mapController.animateTo(point); // mapController.setCenter(point);
                            //add the overlays to the map
                            // and call invalidate for the mapview.
                             mapView.invalidate();

                       }
                 });
            }

    }, 0, 1000); // Here im calling the timer every 10 seconds
4

2 回答 2

2

那么你可以做的是使用 atimer来填充地图。基本上,您可以使用一种方法来联系服务器,获取坐标并将它们添加到数组列表中。现在可以从计时器内部调用此方法(可以每隔几秒运行一次,具体取决于您的需要)。此外,在这个计时器类中,您可以重新填充地图。为此的一些代码:

timer=new Timer();  // Refresh map via timer task.
    timer.scheduleAtFixedRate(new TimerTask(){
        @Override
        public void run() {
                 //Call the method that contacts the server and  
                 //adds the coordinates to a list. Get those values from the list.  
                 Handler handler = new Handler();
                 handler.post(new Runnable(){  
                       public void run(){
                            //add the overlays to the map
                            // and call invalidate for the mapview.
                       }
                 });
            }

    }, 0, 10000); // Here im calling the timer every 10 seconds

如果您想查看使用此想法的示例项目,请前往此处,并查看内部的计时器onResume()。它使用另一个名为FetchParse的类来联系服务器并获取更新的坐标列表。

于 2012-04-29T05:12:47.213 回答
0
GeoPoint p = mapView.getProjection().fromPixels((int) event.getX(),(int) event.getY());
Drawable srcdrawable = getApplicationContext().getResources().getDrawable(R.drawable.pin_blue);
CustomItemizedOverlay srcitemizedOverlay = new CustomItemizedOverlay(srcdrawable, getApplicationContext());
OverlayItem srcoverlayitem = new OverlayItem(p, "Hello!", "This is your Location.");
srcitemizedOverlay.addOverlay(srcoverlayitem);
mapView.getOverlays().clear();
mapView.getOverlays().add(srcitemizedOverlay);

在创建标记中尝试此代码

于 2012-04-29T05:01:52.547 回答