前提・実現したいこと
外付けのRTK-GPSから現在の位置情報をシリアル通信で受信し,osmdroidの地図上に点または線で描画するアプリを作っています。
位置情報の受信、受信したデータをTextViewに表示可能な型に変換することは実現できています。
シリアル通信にはFTDI社の『usb-serial-for-android』というライブラリを使用しており,地図系の機能は『osmdroid』を使用しています。
現在は
①RTK-GPSからシリアル通信で位置情報データを受信する。
②受信したデータ(String型)からdouble型の緯度・経度を取得する。
③取得した緯度・経度からGeoPointを作成し,マーカーへセットし地図上に描画する。このときGeoPointのリストにも格納する。
という手順で地図上に現在地のマーカーを表示しようとしています。現在は受信した緯度・経度をマーカーにセットしすべて描画するようになっています。
ゆくゆくは現在地のマーカーを更新しながら,移動した軌跡を線で描画したいと考えています。
発生している問題・エラーメッセージ
発生している問題は,描画を開始するとたちまちアプリの動作が重くなり,フリーズすることです。
GPSからは1秒間に10個のデータが送られてくるため,受信したデータをすべて地図上に描画しようとするとマーカーの数が膨大になりフリーズしてしまうのではないかと考えられます。
そこで10個飛ばしでマーカーを描画するようにしたのですが,それでも描画を開始してすぐにアプリの動作が重くなってフリーズしてしまいます。
次にデータ数が100個を超えたら古いデータから削除するようにしたところ,描画を開始してもフリーズせずに動作しました.しかしこの方法ではすべての軌跡を描画することができないと思われます。できれば移動した軌跡をすべて描画したいと考えています。
質問したい事項は以下の通りです。
①上記の方法・方針で移動軌跡を描画することは可能か
②Androidではこのような移動軌跡を描画することは不可能なのか
③osmdroidに移動軌跡を描画する機能があるか
よろしくお願い致します。
該当のソースコード
Java
1public class MapGeneratorMainActivity extends Activity { 2 3 private static final double MAP_ZOOM = 15.0; 4 private static final double MAP_ZOOM2 = 17.0; 5 6 static MapView mapGeneratorMainMap = null; 7 8 public static List<Marker> currentMarkers = new ArrayList<>(); 9 ArrayList<GeoPoint> currentPoints = new ArrayList<>(); 10 ArrayList<GeoPoint> currentPoints2hz = new ArrayList<>(); 11 ArrayList<Polyline> currentTrajectory = new ArrayList<>(); 12 public static int receiveCount = 0; 13 public static GeoPoint currentP2hz; 14 15 public MapGeneratorMainActivity() { 16 } 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 22 org.osmdroid.config.Configuration.getInstance().load(getApplicationContext(), 23 PreferenceManager.getDefaultSharedPreferences(getApplicationContext())); 24 25 setContentView(R.layout.map_generator_main_activity); 26 MapView mapGeneratorMainMap = findViewById(R.id.MapGaneratorMainMap); 27 28 mapGeneratorMainMap.setMultiTouchControls(true); 29 IMapController mapController = mapGeneratorMainMap.getController(); 30 mapController.setZoom(MAP_ZOOM); 31 GeoPoint centerPoint = new GeoPoint(aveLat, aveLon); 32 mapController.setCenter(centerPoint); 33 34 mapGeneratorMainMap.setTilesScaledToDpi(true); 35 36 final MapTileProviderBasic tileProvider = new MapTileProviderBasic(getApplicationContext()); 37 38 ITileSource tileSource = new XYTileSource("GSI", 14, 24, 256, ".jpg", new String[]{TILE_SEVER}); 39 40 tileProvider.setTileSource(tileSource); 41 final TilesOverlay tilesOverlay = new TilesOverlay(tileProvider, this.getApplicationContext()); 42 tilesOverlay.setLoadingBackgroundColor(Color.TRANSPARENT); 43 mapGeneratorMainMap.getOverlays().add(tilesOverlay); 44 mapGeneratorMainMap.invalidate(); 45 46 FloatingActionButton myLocationButton = findViewById(R.id.myLocationButton); 47 myLocationButton.setOnClickListener(new View.OnClickListener() { 48 @Override 49 public void onClick(View v) { 50 Intent intentService = new Intent(getApplication(), gpsService.class); //位置情報受信サービス 51 intentService.putExtra("REQUEST_CODE", 1); 52 startForegroundService(intentService); 53 } 54 }); 55 56 //Receiver 57 UpdateReceiver receiver = new UpdateReceiver(); 58 IntentFilter filter = new IntentFilter(); 59 filter.addAction("DO_ACTION"); 60 registerReceiver(receiver, filter); 61 } 62 63 protected class UpdateReceiver extends BroadcastReceiver{ 64 @Override 65 public void onReceive(Context context, Intent intent) { 66 67 String currentLat = null; 68 String currentLon = null; 69 70 MapView mapGeneratorMainMap = findViewById(R.id.MapGaneratorMainMap); 71 mapGeneratorMainMap.setMultiTouchControls(true); 72 IMapController mapController = mapGeneratorMainMap.getController(); 73 mapController.setZoom(MAP_ZOOM2); 74 75 Bundle extras = intent.getExtras(); 76 String msg = extras.getString("message"); //String型の位置情報 77 TextView currentLocatonTextView = findViewById(R.id.CurrentLocation); 78 currentLocatonTextView.setText(msg); 79 String[] currentLocaton = msg.split(",", -1); 80 currentLat = currentLocaton[0]; 81 currentLon = currentLocaton[1]; 82 double Lat = Double.parseDouble(currentLat); 83 double Lon = Double.parseDouble(currentLon); 84 GeoPoint currentP = new GeoPoint(Lat, Lon); 85 if(receiveCount == 0){ 86 currentP2hz = new GeoPoint(Lat, Lon); 87 currentPoints.add(currentP); 88 currentPoints2hz.add(currentP2hz); 89 currentPtMarker = new Marker(mapGeneratorMainMap); 90 Drawable currentMarkerIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.current_point_marker, null); 91 currentPtMarker.setIcon(currentMarkerIcon); 92 currentPtMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER); 93 currentPtMarker.setPosition(currentP); 94 currentMarkers.add(currentPtMarker); 95 mapGeneratorMainMap.getOverlayManager().add(currentPtMarker); 96 mapGeneratorMainMap.invalidate(); 97 } 98 else if(receiveCount == 100) { 99 currentPoints.add(currentP); 100 currentP2hz = new GeoPoint(Lat, Lon); 101 currentPoints2hz.add(currentP2hz); 102 receiveCount = 0; 103 currentPtMarker = new Marker(mapGeneratorMainMap); 104 Drawable currentMarkerIcon = ResourcesCompat.getDrawable(getResources(), R.drawable.current_point_marker, null); 105 currentPtMarker.setIcon(currentMarkerIcon); 106 currentPtMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER); 107 currentPtMarker.setPosition(currentP); 108 currentMarkers.add(currentPtMarker); 109 mapGeneratorMainMap.getOverlayManager().add(currentPtMarker); 110 mapGeneratorMainMap.invalidate(); 111 112 } 113 if(currentMarkers.size() >= 100){ 114 currentMarkers.get(0).remove(mapGeneratorMainMap); 115 currentMarkers.remove(0); 116 } 117 receiveCount += 1; 118 } 119 }
更新
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。