Android:使用Web服务的坐标不断更新地图

时间:2012-04-29 04:32:05

标签: android android-service

您好我正在编写一个使用网络服务器坐标的应用程序。我知道如何从webservice中检索坐标,但是一旦我得到它们,我怎么能在地图上不断显示它们。类似于位置监听器,当位置管理器的位置发生变化时,会更新地图上的点。我想不断更新从webservice收到的积分。 这是用服务完成的吗?如果是这样的话?

        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);  
    }  

更新:从webservice获取坐标的代码......

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");

}

更新TIMER:

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

2 个答案:

答案 0 :(得分:2)

您可以做的是使用timer填充地图。基本上,您可以使用一种方法与服务器联系,获取坐标并将其添加到arraylist中。现在可以从计时器内部调用此方法(可以每隔几秒运行一次,具体取决于您的需要)。此外,在此计时器类中,您可以重新填充地图。一些代码:

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

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

答案 1 :(得分: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);

在创建标记

中尝试此代码