将 JSON 数据添加到 Android Studio 地图

Posted

技术标签:

【中文标题】将 JSON 数据添加到 Android Studio 地图【英文标题】:Add JSON data to Android Studio map 【发布时间】:2018-02-12 13:17:09 【问题描述】:

我有一个 JSON 文件,其中包含有关一个城市的数据以及所有道路的名称和编号。我正在使用搜索引擎为该城市开发地图。如何在 android Studio 应用中添加这个文件并实现两个位置之间的搜索?

 
   "type": "FeatureCollection",
   "crs": 
      "type": "name",
      "properties": 
         "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
      
   ,
   "features": [
      
         "type": "Feature",
         "properties": 
            "Name": "yes",
            "description": "",
            "timestamp": null,
            "begin": null,
            "end": null,
            "altitudeMode": null,
            "tessellate": -1,
            "extrude": 0,
            "visibility": -1,
            "drawOrder": null,
            "icon": null,
            "description_1": null,
            "Number": "10",
            "RoadNameCo": "03_10234",
            "RoadNameAL": "Person Nmae"
         ,
         "geometry": 
            "type": "Point",
            "coordinates": [
               260.853835,
               426.601668,
               0
            ]
         
     
  

【问题讨论】:

你可以把它放在assests文件夹中,然后使用Gson,获取这些数据。 【参考方案1】:

首先,您必须将文件放在资产或原始文件夹中。

getResources().getIdentifier("FILENAME_WITHOUT_EXTENSION", “原始”,getPackageName());

然后使用上面的行,您可以从原始文件夹中获取数据。 之后,您就可以从 JSON 中获取所有位置点。

为此,您可以使用此异步任务将该 JSON 解析为点

private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> 

    // Parsing the data in non-ui thread
    @Override
    protected List<List<HashMap<String,
            String>>> doInBackground(String... jsonData) 
        JSONObject jObject;
        List<List<HashMap<String, String>>> routes = null;
        try 
            jObject = new JSONObject(jsonData[0]);
            DataParser parser = new DataParser();
            // Starts parsing data
            routes = parser.parse(jObject);
         catch (Exception e) 
            e.printStackTrace();
        
        return routes;
    

    // Executes in UI thread, after the parsing process
    @Override
    protected void onPostExecute(List<List<HashMap<String, String>>> result) 
        ArrayList<LatLng> points;
        PolylineOptions lineOptions = null;

        // Traversing through all the routes
        for (int i = 0; i < result.size(); i++) 
            points = new ArrayList<>();
            lineOptions = new PolylineOptions();

            // Fetching i-th route
            List<HashMap<String, String>> path = result.get(i);

            // Fetching all the points in i-th route
            for (int j = 0; j < path.size(); j++) 
                HashMap<String, String> point = path.get(j);

                double lat = Double.parseDouble(point.get("lat"));
                double lng = Double.parseDouble(point.get("lng"));
                LatLng position = new LatLng(lat, lng);

                points.add(position);
            

            // Adding all the points in the route to LineOptions
            lineOptions.addAll(points);
            lineOptions.width(10);
            lineOptions.color(Color.RED);
        

        // Drawing polyline in the Google Map for the i-th route
        if (lineOptions != null) 
            mMap.addPolyline(lineOptions);
        
    

这是数据解析器类

公共类 DataParser

/**
 * Receives a JSONObject and returns a list of lists containing latitude and longitude
 */
public List<List<HashMap<String, String>>> parse(JSONObject jObject) 

    List<List<HashMap<String, String>>> routes = new ArrayList<>();
    JSONArray jRoutes;
    JSONArray jLegs;
    JSONArray jSteps;

    try 

        jRoutes = jObject.getJSONArray("routes");
        /** Traversing all routes */
        for (int i = 0; i < jRoutes.length(); i++) 
            jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs");
            List path = new ArrayList<>();
            /** Traversing all legs */
            for (int j = 0; j < jLegs.length(); j++) 
                jSteps = ((JSONObject) jLegs.get(j)).getJSONArray("steps");
                /** Traversing all steps */
                for (int k = 0; k < jSteps.length(); k++) 
                    String polyline = "";
                    polyline = (String) ((JSONObject) ((JSONObject) jSteps.get(k)).get("polyline")).get("points");
                    List<LatLng> list = decodePoly(polyline);
                    /** Traversing all points */
                    for (int l = 0; l < list.size(); l++) 
                        HashMap<String, String> hm = new HashMap<>();
                        hm.put("lat", Double.toString((list.get(l)).latitude));
                        hm.put("lng", Double.toString((list.get(l)).longitude));
                        path.add(hm);
                    
                
                routes.add(path);
            
        

     catch (JSONException e) 
        e.printStackTrace();
     catch (Exception e) 
        e.getMessage();
    


    return routes;



/**
 * Method to decode polyline points
 * Courtesy : http://jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java
 */
private List<LatLng> decodePoly(String encoded) 

    List<LatLng> poly = new ArrayList<>();
    int index = 0, len = encoded.length();
    int lat = 0, lng = 0;

    while (index < len) 
        int b, shift = 0, result = 0;
        do 
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
         while (b >= 0x20);
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lat += dlat;

        shift = 0;
        result = 0;
        do 
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
         while (b >= 0x20);
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lng += dlng;

        LatLng p = new LatLng((((double) lat / 1E5)),
                (((double) lng / 1E5)));
        poly.add(p);
    

    return poly;

【讨论】:

你有完整教程的链接吗? developers.google.com/maps/documentation/directions/… 但它会从其 api 而不是从原始文件中获取方向。但是您可以对文件数据使用相同的过程。因为你的 JSON 应该是相同的格式,如果你想从原始文件切换到谷歌地图 api,这可以帮助你进一步

以上是关于将 JSON 数据添加到 Android Studio 地图的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何使用json中提供的多个联系人数据在java中的android中添加新的电话联系人

Android:如何让我检索到的(来自 mysql)JSON 解析数据添加到 ListView 每分钟刷新一次

Android 将 Activity 添加到带有 Intent 的对话框

子查询添加到 PL/SQL 中的现有查询

将json对象发送到android中的webservice

每次在android中解析json更好吗