将 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 每分钟刷新一次