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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

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

Android

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

Android Studio

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

Q&A

解決済

1回答

3423閲覧

androidでサーバーから受け取ったGPS情報(json)を用いて地図にマーカーを表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/10/17 17:59

Androidでサーバー内のGPS情報をjsonで受け取り、地図にマーカーで表示するアプリを作成しています。
しかし、地図上にマーカーを表示できずに困っております。
GPS情報が書かれているjsonは、

json

1[{"id":"1","title":"野々市小学校","address":"野々市市本町5-3-1","lat":"36.5319906800","lng":"136.6092836000"}]

Androidのコードは、
MapsActivity.java

java

1public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 2 private GoogleMap mMap; 3 String url = "http://ambient.naist.jp/hoge/fuga/map_data.php"; 4 5 String title=""; 6 String address=""; 7 String lat = ""; 8 String lng = ""; 9 10 private List<Refuge> mRefugeList = new ArrayList<Refuge>(); 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_maps); 16 SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 17 .findFragmentById(R.id.map); 18 mapFragment.getMapAsync(this); 19 } 20 21 @Override 22 protected void onResume() { 23 super.onResume(); 24 } 25 26 @Override 27 public void onMapReady(GoogleMap googleMap) { 28 mMap = googleMap; 29 mRefugeList.clear(); 30 parseJSON(); 31 addMaker(); 32 33 mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 34 @Override 35 public void onMapClick(LatLng latLng) { 36 calcDistance(latLng); 37 sortRefugeList(); 38 updateMaker(); 39 addLine(latLng); 40 } 41 }); 42 } 43 44 private void addLine(LatLng point){ 45 CircleOptions circleOptions = new CircleOptions() 46 .center(point) 47 //.fillColor(Color.LTGRAY) 48 .radius(3); 49 mMap.addCircle(circleOptions); 50 for (Refuge refuge : mRefugeList) { 51 if (refuge != null) { 52 if (refuge.isNear()) { 53 PolylineOptions polyOptions = new PolylineOptions(); 54 polyOptions.add(point); 55 polyOptions.add(new LatLng(refuge.getLat(), refuge.getLng())); 56 polyOptions.color(Color.GRAY); 57 polyOptions.width(3); 58 polyOptions.geodesic(true); 59 mMap.addPolyline(polyOptions); 60 } 61 } 62 } 63 } 64 65 private void updateMaker() { 66 int i = 0; 67 mMap.clear(); 68 for (Refuge refuge : mRefugeList) { 69 if (refuge != null) { 70 MarkerOptions options = new MarkerOptions(); 71 options.position(new LatLng(refuge.getLat(), refuge.getLng())); 72 options.title(refuge.getName() + " " + refuge.getDistance() + "m"); 73 options.snippet(refuge.getAddress()); 74 BitmapDescriptor icon; 75 if (i > 2) { 76 icon = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA); 77 refuge.setNear(false); 78 } else { 79 icon = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED); 80 refuge.setNear(true); 81 } 82 options.icon(icon); 83 Marker marker = mMap.addMarker(options); 84 if (i == 0) { 85 marker.showInfoWindow(); 86 } 87 i++; 88 } 89 } 90 } 91 private void sortRefugeList(){ 92 Collections.sort(mRefugeList, new Comparator<Refuge>() { 93 @Override 94 public int compare(Refuge lhs, Refuge rhs) { 95 return lhs.getDistance() - rhs.getDistance(); 96 } 97 }); 98 } 99 private void calcDistance(LatLng point){ 100 // タッチした場所と避難所の距離を求める 101 double startLat = point.latitude; 102 double startLng = point.longitude; 103 // 結果を格納するための配列 104 float[] results = new float[3]; 105 for (Refuge refuge : mRefugeList) { 106 if (refuge != null) { 107 Location.distanceBetween(startLat, startLng, refuge.getLat(), refuge.getLng(), results); 108 refuge.setDistance(results[0]); 109 } 110 } 111 112 113 } 114 115 private void parseJSON(){ 116 //受け取るjsonの最初が配列[]の場合JSONObjectをJSONArrayに変更する 117 JsonArrayRequest jsArrReuest = new JsonArrayRequest( 118 Request.Method.POST, 119 url, 120 null, 121 new Response.Listener<JSONArray>(){ 122 @Override 123 public void onResponse(JSONArray response){ 124 try{ 125 title = response.getJSONObject(0).getString("title"); 126 address = response.getJSONObject(0).getString("address"); 127 lat = response.getJSONObject(0).getString("lat"); 128 lng = response.getJSONObject(0).getString("lng"); 129 newRefuge(title, address,Double.valueOf(lat), Double.valueOf(lng)); 130 } catch (JSONException e) { 131 e.printStackTrace(); 132 } 133 } 134 }, 135 new Response.ErrorListener(){ 136 @Override 137 public void onErrorResponse(VolleyError error){ 138 Log.d(TAG, error.toString()); 139 } 140 } 141 ); 142 MySingleton.getInstance(this).addToRequestQueue(jsArrReuest); 143 } 144 145 private void newRefuge(String title,String address,double lat,double lon) { 146 Refuge refuge; 147 refuge = new Refuge(title,address,lat,lon); 148 mRefugeList.add(refuge); 149 } 150 151 private void addMaker() { 152 for (Refuge refuge : mRefugeList) { 153 if (refuge != null) { 154 MarkerOptions options = new MarkerOptions(); 155 options.position(new LatLng(refuge.getLat(),refuge.getLng())); 156 options.title(refuge.getName()); 157 options.snippet(refuge.getAddress()); 158 mMap.addMarker(options); 159 } 160 } 161 } 162}

Refuge.java

java

1public class Refuge { 2 private String name; 3 private String address; 4 private double latitude; 5 private double longitude; 6 private boolean near; 7 private int distance; 8 9 public Refuge(String name,String address,double latitude,double longitude){ 10 this.name = name; 11 this.address = address; 12 this.latitude = latitude; 13 this.longitude = longitude; 14 this.near = false; 15 this.distance = 0; 16 } 17 public String getName() { 18 return name; 19 } 20 public String getAddress() { 21 return address; 22 } 23 public double getLat() { 24 return latitude; 25 } 26 public double getLng() { 27 return longitude; 28 } 29 public boolean isNear() { 30 return near; 31 } 32 public int getDistance() { 33 return distance; 34 } 35 public void setNear(boolean near) { 36 this.near = near; 37 } 38 public void setDistance(float distance) { 39 this.distance = (int)distance; 40 } 41}

Log.dでサーバーからのjson取得は確認できています。
しかし、mRefugeListが何も取得できていない状態になっています。
何か良い方法があれば教えていただけないでしょうか。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

JsonArrayRequest#onResponseでログ出力してこのメソッドが呼ばれているかを確認してください。
また、JsonArrayRequest#onErrorResponseのログは出ていませんか?

投稿2016/10/17 22:39

yona

総合スコア18155

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

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

退会済みユーザー

退会済みユーザー

2016/10/18 02:26

回答ありがとうございます。 JsonArrayRequest#onResponseでログ出力した結果は、 10-18 11:00:50.616 29595-29595/com.example.naoki_ni.map_pin D/title:: 野々市小学校 10-18 11:00:50.616 29595-29595/com.example.naoki_ni.map_pin D/address:: 野々市市本町5-3-1 10-18 11:00:50.616 29595-29595/com.example.naoki_ni.map_pin D/lat:: 36.53199068 10-18 11:00:50.616 29595-29595/com.example.naoki_ni.map_pin D/lng:: 136.6092836 と出力され、JsonArrayRequest#onErrorResponseのログは出ていませんでした。 JsonArrayRequest#onResponseのtry内で呼び出したメソッド(newRefuge())は、JsonArrayRequest#onResponseの外では更新されないのでしょうか。 勉強不足で申し訳ないですが、宜しくお願いします。
yona

2016/10/18 02:40

更新されないなんてことはないので、原因を切り分けて行きましょう。 ・サーバーからデータのダウンロード ・JSONからデータ取得 上記はできているようですね。 次はmRefugeListを調べましょう。 newRefugeの先頭と末尾でList#sizeをログ出力してください。
退会済みユーザー

退会済みユーザー

2016/10/18 03:10

newRefugeの先頭と末尾でList#sizeをログ出力した結果は、 先頭 10-18 12:06:06.295 16394-16394/com.example.naoki_ni.map_pin D/mRefugeList1:: 0 末尾 10-18 12:06:06.295 16394-16394/com.example.naoki_ni.map_pin D/mRefugeList2:: 1 sonArrayRequest#onResponseのtry内では、mRefugeListが更新されているようです。 しかし、parseJSON()の後にList#sizeをログ出力すると、 10-18 12:08:43.124 19478-19478/com.example.naoki_ni.map_pin D/mRefugeList4:: 0 となり、mRefugeListが更新されていないようです。
yona

2016/10/18 04:34

onMapReadyの中でmRefugeListをクリアしてますね。 追加した後にマップの準備が整いリストをクリアしている可能性があります。 これを削除するとどうなりますか?
退会済みユーザー

退会済みユーザー

2016/10/18 04:57

onMapReady内のmRefugeList.clear();をコメントアウトをし、parseJSON();の後で、 Log.d("mRefugeList", String.valueOf(mRefugeList.size())); を行いましたが、 10-18 13:53:42.260 10605-10605/com.example.naoki_ni.map_pin D/mRefugeList: 0 となり、更新されませんでした。
yona

2016/10/18 05:03

そこに入れても無駄ですね。 原因がわかりました。 非同期処理による処理順があなたの想定と異なっていますね。 addMakerをparseJsonの末尾で呼んでください。
退会済みユーザー

退会済みユーザー

2016/10/18 05:16

addMakerをparseJsonの末尾に呼ぶと、マーカーが表示され解決することができました。 丁寧に教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問