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

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

ただいまの
回答率

87.34%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,683
退会済みユーザー

退会済みユーザー

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

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


Androidのコードは、
MapsActivity.java

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private GoogleMap mMap;
    String url = "http://ambient.naist.jp/hoge/fuga/map_data.php";

    String title="";
    String address="";
    String lat = "";
    String lng = "";

    private List<Refuge> mRefugeList = new ArrayList<Refuge>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mRefugeList.clear();
        parseJSON();
        addMaker();

        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng latLng) {
                calcDistance(latLng);
                sortRefugeList();
                updateMaker();
                addLine(latLng);
            }
        });
    }

    private void addLine(LatLng point){
        CircleOptions circleOptions = new CircleOptions()
                .center(point)
                //.fillColor(Color.LTGRAY)
                .radius(3);
        mMap.addCircle(circleOptions);
        for (Refuge refuge : mRefugeList) {
            if (refuge != null) {
                if (refuge.isNear()) {
                    PolylineOptions polyOptions = new PolylineOptions();
                    polyOptions.add(point);
                    polyOptions.add(new LatLng(refuge.getLat(), refuge.getLng()));
                    polyOptions.color(Color.GRAY);
                    polyOptions.width(3);
                    polyOptions.geodesic(true); 
                    mMap.addPolyline(polyOptions);
                }
            }
        }
    }

    private void updateMaker() {
        int i = 0;
        mMap.clear();
        for (Refuge refuge : mRefugeList) {
            if (refuge != null) {
                MarkerOptions options = new MarkerOptions();
                options.position(new LatLng(refuge.getLat(), refuge.getLng()));
                options.title(refuge.getName() + " " + refuge.getDistance() + "m");
                options.snippet(refuge.getAddress());
                BitmapDescriptor icon;
                if (i > 2) {
                    icon = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA);
                    refuge.setNear(false);
                } else {
                    icon = BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED);
                    refuge.setNear(true);
                }
                options.icon(icon);
                Marker marker = mMap.addMarker(options);
                if (i == 0) {
                    marker.showInfoWindow();
                }
                i++;
            }
        }
    }
    private void sortRefugeList(){
        Collections.sort(mRefugeList, new Comparator<Refuge>() {
            @Override
            public int compare(Refuge lhs, Refuge rhs) {
                return lhs.getDistance() - rhs.getDistance();
            }
        });
    }
    private void calcDistance(LatLng point){
        // タッチした場所と避難所の距離を求める
        double startLat = point.latitude;
        double startLng = point.longitude;
        // 結果を格納するための配列
        float[] results = new float[3];
        for (Refuge refuge : mRefugeList) {
            if (refuge != null) {
                Location.distanceBetween(startLat, startLng, refuge.getLat(), refuge.getLng(), results);
                refuge.setDistance(results[0]);
            }
        }


    }

    private void parseJSON(){
        //受け取るjsonの最初が配列[]の場合JSONObjectをJSONArrayに変更する
        JsonArrayRequest jsArrReuest = new JsonArrayRequest(
                Request.Method.POST,
                url,
                null,
                new Response.Listener<JSONArray>(){
                    @Override
                    public void onResponse(JSONArray response){
                        try{
                            title = response.getJSONObject(0).getString("title");
                            address = response.getJSONObject(0).getString("address");
                            lat = response.getJSONObject(0).getString("lat");
                            lng = response.getJSONObject(0).getString("lng");
                            newRefuge(title, address,Double.valueOf(lat), Double.valueOf(lng));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener(){
                    @Override
                    public void onErrorResponse(VolleyError error){
                        Log.d(TAG, error.toString());
                    }
                }
        );
        MySingleton.getInstance(this).addToRequestQueue(jsArrReuest);
    }

    private void newRefuge(String title,String address,double lat,double lon) {
        Refuge refuge;
        refuge = new Refuge(title,address,lat,lon);
        mRefugeList.add(refuge);
    }

    private void addMaker() {
        for (Refuge refuge : mRefugeList) {
            if (refuge != null) {
                MarkerOptions options = new MarkerOptions();
                options.position(new LatLng(refuge.getLat(),refuge.getLng()));
                options.title(refuge.getName());
                options.snippet(refuge.getAddress());
                mMap.addMarker(options);
            }
        }
    }
}


Refuge.java

public class Refuge {
    private String name;
    private String address;
    private double latitude;
    private double longitude;
    private boolean near;
    private int distance;

    public Refuge(String name,String address,double latitude,double longitude){
        this.name = name;
        this.address = address;
        this.latitude = latitude;
        this.longitude = longitude;
        this.near = false;
        this.distance = 0;
    }
    public String getName() {
        return name;
    }
    public String getAddress() {
        return address;
    }
    public double getLat() {
        return latitude;
    }
    public double getLng() {
        return longitude;
    }
    public boolean isNear() {
        return near;
    }
    public int getDistance() {
        return distance;
    }
    public void setNear(boolean near) {
        this.near = near;
    }
    public void setDistance(float distance) {
        this.distance = (int)distance;
    }
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/18 13: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
    となり、更新されませんでした。

    キャンセル

  • 2016/10/18 14:03

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

    キャンセル

  • 2016/10/18 14:16

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

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る