質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1801閲覧

osmdroidで現在地情報を描画する方法

takes.it.easy

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/08/19 11:03

編集2021/08/26 04:02

前提・実現したいこと

 外付けの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 }

更新

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Serialの受信がうまくいってないのが問題でした

投稿2021/09/14 06:32

takes.it.easy

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問