【问题标题】:android- how to show markers on map from JSON file offline?android-如何从 JSON 文件离线显示地图上的标记?
【发布时间】:2017-08-08 04:13:35
【问题描述】:

我想从 json 文件资产文件夹离线加载标记并将其显示在地图上。 以前我可以将标记显示为文本视图,但我不能在地图上显示它们。 应用显示地图但不显示标记。

我不知道为什么。

stations.json

 [
    {
        "name": "JAVANMARDAN1",
        "lat": 35.747394,
        "lang": 51.267577
    }
]

ma​​p.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"/>

地图活动

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private Marker marker;
    private GoogleMap mMap;

    public MapsActivity() throws JSONException {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        new AsyncTaskGetMareker().execute();


    }

    public String getJSONFromAssets() {
        String json = null;
        try {
            InputStream inputData = getAssets().open("stations.json");
            int size = inputData.available();
            byte[] buffer = new byte[size];
            inputData.read(buffer);
            inputData.close();
            json = new String(buffer, "UTF-8");
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
        return json;

    }


    private class AsyncTaskGetMareker extends AsyncTask
    <String , String, JSONArray>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected JSONArray doInBackground(String... strings) {
            return null;
        }

        protected void onPostExecute (JSONArray result){
            if (result !=null){
                for (int i =0; i <result.length(); i++){
                    JSONObject jsonObject= null;
                    try {
                        jsonObject= result.getJSONObject(i);
                        String name=jsonObject.getString("name");
                        String lat=jsonObject.getString("lat");
                        String lang=jsonObject.getString("lang");


                        drawMarker(new LatLng(Double.parseDouble(lat),
                                Double.parseDouble(lang)));

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }

        }

        private void drawMarker(LatLng point) {
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(point);
            GoogleMap googleMap = null;
            googleMap.addMarker(markerOptions);
        }




    }


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    }
}

【问题讨论】:

    标签: android json google-maps google-maps-api-3 google-maps-markers


    【解决方案1】:

    您的代码中存在多个问题:

    • 您没有从 AsyncTask 调用 getJSONFromAssets()
    • 您正在地图加载之前执行 AsyncTask
    • 在您的drawMarker() 方法中,您正在创建一个新的GoogleMap 引用并将其设置为null。这行不通。
    • 您的代码忽略了 name 字段,我假设您希望将其作为 InfoWindow 的 sn-p。

    这里是更新的代码,已修复上述所有问题:

    public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
        private Marker marker;
        private GoogleMap mMap;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.map);
            // Obtain the SupportMapFragment and get notified when the map is ready to be used.
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
            new AsyncTaskGetMareker().execute();
        }
    
        public String getJSONFromAssets() {
            String json = null;
            try {
                InputStream inputData = getAssets().open("stations.json");
                int size = inputData.available();
                byte[] buffer = new byte[size];
                inputData.read(buffer);
                inputData.close();
                json = new String(buffer, "UTF-8");
            } catch (IOException ex) {
                ex.printStackTrace();
                return null;
            }
            return json;
        }
    
        private class AsyncTaskGetMareker extends AsyncTask<String , String, JSONArray> {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }
    
            @Override
            protected JSONArray doInBackground(String... strings) {
                String stationsJsonString = getJSONFromAssets();
                try {
                    JSONArray stationsJsonArray = new JSONArray(stationsJsonString);
                    return stationsJsonArray;
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                //This will only happen if an exception is thrown above:
                return null;
            }
    
            protected void onPostExecute (JSONArray result){
                if (result !=null){
                    for (int i =0; i <result.length(); i++){
                        JSONObject jsonObject= null;
                        try {
                            jsonObject= result.getJSONObject(i);
                            String name=jsonObject.getString("name");
                            String lat=jsonObject.getString("lat");
                            String lang=jsonObject.getString("lang");
    
                            drawMarker(new LatLng(Double.parseDouble(lat),
                                    Double.parseDouble(lang)), name);
    
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
    
            }
    
            private void drawMarker(LatLng point, String name) {
                MarkerOptions markerOptions = new MarkerOptions();
                markerOptions.position(point);
                markerOptions.snippet(name);
                mMap.addMarker(markerOptions);
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 2019-01-20
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多