1

我想在地圖上繪製一個文本文件中的一組點(API v2)並繪製一條直線。每個點都是<Lat, Lng>,文本文件中總共有7253個這樣的點。代碼如下:在Google Maps API v2上繪製路線

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_map_my_route_mock); 

     //Step 0. Get google map instance. 
     map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 

     if(map == null) { 
      Toast.makeText(getApplicationContext(), "Map is not available.", Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(getApplicationContext(), "Map is available.", Toast.LENGTH_LONG).show(); 
     } 

     //Step 0.a. Load a type of map. 
     map.setMapType(GoogleMap.MAP_TYPE_TERRAIN); 

     //Step 0.b. Load your current location on the map. 
     map.setMyLocationEnabled(true); 
     if(po == null) { 
      po = new PolylineOptions(); 
     } 
     //Toast.makeText(getApplicationContext(), "Location lat = " + loc.getLatitude() + " and longitude = " + loc.getLongitude(), Toast.LENGTH_LONG).show(); 

     //Step 1. Set GPS to service provider. 
     locMgr = (LocationManager) getSystemService(LOCATION_SERVICE); 
     mocLocProvider = locMgr.GPS_PROVIDER; 
     locMgr.addTestProvider(mocLocProvider, false, false, true, false, true, false, false, 0, 5); 
     locMgr.setTestProviderEnabled(mocLocProvider, true); 
     //locMgr.requestLocationUpdates(mocLocProvider, 0, 0, locLstnr); 

     //Step 2. Open file for reading from. 
     try { 
      is = getAssets().open("locationLogs.txt"); 
      br = new BufferedReader(new InputStreamReader(is)); 
      String line = null; 
      try { 
       line = br.readLine(); 
       while(line != null) { 
       //while((line = br.readLine()) != null) { 
        //there is still a line in the file. parse for gps coordinates etc. 
        Location l = new Location(LocationManager.GPS_PROVIDER); 
        String[] details = line.split(","); //the array will contain date, time, lat, long, speed, altitude and accuracy. 
        l.setTime(System.currentTimeMillis()); 
        l.setLatitude(Double.parseDouble(details[2])); 
        l.setLongitude(Double.parseDouble(details[3])); 
        l.setSpeed((float) Double.parseDouble(details[4])); 
        l.setAltitude(Double.parseDouble(details[5])); 
        l.setAccuracy((float) Double.parseDouble(details[6])); 
        //Toast.makeText(getApplicationContext(), l.getLatitude() + "," + l.getLongitude() + "," + l.getSpeed() + "," + l.getAltitude() + "," + l.getAccuracy() + "\n", Toast.LENGTH_SHORT).show(); 
        locMgr.setTestProviderLocation(mocLocProvider, l); 
        po.add(new LatLng(l.getLatitude(), l.getLongitude())); 
        Log.v(this.toString(), "Number of po objects = " + po.getPoints().size()); 
        //pl = map.addPolyline(po); 
        //Log.v(this.toString(), "number of polyline objects added = " + pl.getPoints().size()); 
        line = br.readLine(); 
       } 
      } catch(FileNotFoundException e) { 
       Log.v(this.toString(), "File not found."); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      Log.v(this.toString(), "Cannot open file for reading from."); 
     } 
} 

閱讀1300點後,應用程序與OutOfMemory異常崩潰。儘管在Google Maps API v2中有大量線程處理內存泄漏,但使用MAT進行更仔細的分析顯示:pl = map.addPolyline(po)是罪魁禍首,佔用了大部分內存。事實證明這是事實,因爲在該行被註釋掉之後,上述代碼的內存佔用量非常小,大約爲8MB,讀取大約7k點。

我的問題:
1.使用Polylines對象在地圖上繪製的方式有什麼問題嗎?每次更新一次?
2.如果是這樣,如何繪製一條線,使其不佔用太多內存?用Canvas之類的東西或者只在一定數量的點(比如說10個左右)之後劃一條線?
3.某些在其應用程序中使用過Maps API v2的開發人員可能會了解如何正確執行此操作?

回答

1

呼叫pl = map.addPolyline(po);循環後創建一條折線,而不是嘗試創建7000多條多段線,每一條比以前的「多一點」。

+0

如果我正在做一個'LocationListener',我會在哪裏添加這一行? 'onLocationChanged'後? – Sriram

相關問題