PathGoogleMapActivity.java
public class PathGoogleMapActivity extends FragmentActivity {
private static final LatLng LOWER_MANHATTAN = new LatLng(40.722543,
-73.998585);
private static final LatLng BROOKLYN_BRIDGE = new LatLng(40.7057, -73.9964);
private static final LatLng WALL_STREET = new LatLng(40.7064, -74.0094);
GoogleMap googleMap;
final String TAG = "PathGoogleMapActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_path_google_map);
SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
googleMap = fm.getMap();
MarkerOptions options = new MarkerOptions();
options.position(LOWER_MANHATTAN);
options.position(BROOKLYN_BRIDGE);
options.position(WALL_STREET);
googleMap.addMarker(options);
String url = getMapsApiDirectionsUrl();
ReadTask downloadTask = new ReadTask();
downloadTask.execute(url);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(BROOKLYN_BRIDGE,
13));
addMarkers();
}
private String getMapsApiDirectionsUrl() {
String waypoints = "waypoints=optimize:true|"
+ LOWER_MANHATTAN.latitude + "," + LOWER_MANHATTAN.longitude
+ "|" + "|" + BROOKLYN_BRIDGE.latitude + ","
+ BROOKLYN_BRIDGE.longitude + "|" + WALL_STREET.latitude + ","
+ WALL_STREET.longitude;
String sensor = "sensor=false";
String params = waypoints + "&" + sensor;
String output = "json";
String url = "https://maps.googleapis.com/maps/api/directions/"
+ output + "?" + params;
return url;
}
private void addMarkers() {
if (googleMap != null) {
googleMap.addMarker(new MarkerOptions().position(BROOKLYN_BRIDGE)
.title("First Point"));
googleMap.addMarker(new MarkerOptions().position(LOWER_MANHATTAN)
.title("Second Point"));
googleMap.addMarker(new MarkerOptions().position(WALL_STREET)
.title("Third Point"));
}
}
private class ReadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... url) {
String data = "";
try {
HttpConnection http = new HttpConnection();
data = http.readUrl(url[0]);
} catch (Exception e) {
Log.d("Background Task", e.toString());
}
return data;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
new ParserTask().execute(result);
}
}
private class ParserTask extends
AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
@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]);
PathJSONParser parser = new PathJSONParser();
routes = parser.parse(jObject);
} catch (Exception e) {
e.printStackTrace();
}
return routes;
}
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> routes) {
ArrayList<LatLng> points = null;
PolylineOptions polyLineOptions = null;
// traversing through routes
for (int i = 0; i < routes.size(); i++) {
points = new ArrayList<LatLng>();
polyLineOptions = new PolylineOptions();
List<HashMap<String, String>> path = routes.get(i);
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);
}
polyLineOptions.addAll(points);
polyLineOptions.width(2);
polyLineOptions.color(Color.BLUE);
}
googleMap.addPolyline(polyLineOptions);
}
}
}
Httpconnection.java
public class HttpConnection {
public String readUrl(String mapsApiDirectionsUrl) throws IOException {
String data = "";
InputStream iStream = null;
HttpURLConnection urlConnection = null;
try {
URL url = new URL(mapsApiDirectionsUrl);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
iStream = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(
iStream));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
br.close();
} catch (Exception e) {
Log.d("Exception while reading url", e.toString());
} finally {
iStream.close();
urlConnection.disconnect();
}
return data;
}
}
PathJsonparser.java
public class PathJSONParser {
public List<List<HashMap<String, String>>> parse(JSONObject jObject) {
List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,
String>>>();
JSONArray jRoutes = null;
JSONArray jLegs = null;
JSONArray jSteps = null;
try {
jRoutes = jObject.getJSONArray("routes");
/** Traversing all routes */
for (int i = 0; i < jRoutes.length(); i++) {
jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs");
List<HashMap<String, String>> path = new ArrayList<HashMap<String,
String>>();
/** 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<String, String>();
hm.put("lat",
Double.toString(((LatLng) list.get(l)).latitude));
hm.put("lng",
Double.toString(((LatLng) list.get(l)).longitude));
path.add(hm);
}
}
routes.add(path);
}
}
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
}
return routes;
}
/**
* Method Courtesy :
* 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<LatLng>();
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;
}
}
JSON (Объектная нотация JavaScript) является легким форматом обмена данными. Для людей легко читать и записать. Для машин легко проанализировать и генерировать. Это основано на подмножестве Языка программирования JavaScript, Стандартный ECMA-262 3-й Выпуск - декабрь 1999. JSON является текстовым форматом, который абсолютно независим от языка, но использует конвенции, которые знакомы программистам C-языковой-семьи, включая C, C++, C#, Java, JavaScript, Perl, Python и многих других. Эти свойства делают JSON идеальным языком обмена данными.
Касательно: json.org
Объект является незаказанным набором пар имя/значение. Объект начинается {(левая фигурная скобка) и заканчивается} (правая фигурная скобка). Каждое имя сопровождается: (двоеточие) и пары имя/значение разделяются, (запятая).
(источник: json.org)
Массив является заказанным набором значений. Массив начинается [(левая скобка) и заканчивается] (правая скобка). Значения разделяются, (запятая).
(источник: json.org)
Значение может быть строкой в двойных кавычках, или числом, или TRUE или FALSE или пустым указателем, или объектом или массивом. Эти структуры могут быть вложены.
(источник: json.org)
Строка является набором нуля или большего количества символов Unicode, перенесенных в двойные кавычки, с помощью Escape обратной косой черты. Символ представлен как односимвольная строка. Строка очень похожа на C или строку Java.
(источник: json.org)
Число очень похоже на C или число Java, за исключением того, что восьмеричные и шестнадцатеричные форматы не используются.
(источник: json.org)
Вот пример:
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [{
"onclick": "CreateNewDoc()"
}, {
"value": "Open",
"onclick": "OpenDoc()"
}, {
"value": "Close",
"onclick": "CloseDoc()"
}]
}
}
}
И в XML то же самое было бы:
<menu id="file" value="File">
<popup>
<menuitem value="New" onclick="CreateNewDoc()" />
<menuitem value="Open" onclick="OpenDoc()" />
<menuitem value="Close" onclick="CloseDoc()" />
</popup>
</menu>
Касательно: json.org
Надеюсь, что Вы теперь понимаете то, что является JSON.
Из Википедии: JSON (объектная нотация JavaScript)
Формат JSON часто используется для передачи структурированных данных по сетевому соединению в процессе, названном сериализацией. Его главное приложение находится в программировании веб-приложения Ajax, где оно служит альтернативой использованию формата XML.
Всесторонняя версия, кажется, хорошо покрыта, возможно, Вы ищете версию закорачивать-и-упрощать?
JSON является в основном просто способом передать массив от одного языка до другого.
Это использовало много для Ajax (среди других вещей), потому что с Ajax у Вас обычно есть язык серверной стороны (PHP и т.д.) передающий ряд результатов на клиентский язык (JavaScript). Ваши вызовы JavaScript Ваша страница PHP с некоторыми параметрами; Ваша страница PHP создает массив и echos, это кодирует его к формату JSON; Ваш JavaScript ловит JSON и декодирует его назад к массиву для обработки.
Существует больше к нему, чем тот, очевидно (и по этой причине я ожидаю шквал исполосованного слезой downvotes :)), но это - все, что необходимо разбудить и работающий с ним.
Это - Объектная нотация JavaScript. Можно использовать его для передачи данных обратно и вперед. Это часто рекомендуется, так как там не так много служебное, как тот, который Вы получаете с XML. Поэтому это стало более популярным, чем XML с Ajax.
Смотрите на это: http://en.wikipedia.org/wiki/JSON
Вот отличное решение. (Честно говоря, я сам себя удивил.) В CSS есть так называемые счетчики , где вы можете установить, например, автоматические номера глав для каждого заголовка. Небольшая модификация дает вам следующее: Вам нужно будет самостоятельно разобрать отступы и т. Д.
ol {counter-reset: list; } ол> ли {стиль списка: нет; } ol> li: before {content: counter (list, lower-alpha) ")"; счетчик-инкремент: список; }
тип пользовательского стиля списка (v1): - Number 1
- Number 2
- Number 3
< li> Номер 4 - Номер 5
- Номер 6
Работает во всех современных браузерах и IE9 + (и, возможно, IE8, но может содержать ошибки).
Обновление: Я добавил дочерний селектор, чтобы вложенные списки не выбирали родительский стиль. Трейдер также отмечает, что выравнивание элементов списка также нарушено. В статье на 456bereastreet есть хорошее решение, которое включает в себя абсолютное позиционирование счетчика.
ol {counter-reset: list; } ол> ли {стиль списка: нет; положение: относительное; } ol> li: до {счетчик-инкремент: список; content: counter (список, нижняя альфа) ")"; позиция: абсолютная; слева: -1,4em; }
Тип пользовательского стиля списка (v2): - Номер 1
- Номер 2
- Номер 3
< li> Number 4 - Number 5
- Number 6
Вот jsFiddle , показывающий результат, включая вложенные списки.
Эти ДАННЫЕ слишком сложны для понимания и имеют произвольный характер, поэтому у нас есть 2 варианта представления произвольных структур данных в формате JSON или XML ] формат. Но недостаток в XML, он синтаксически более сложен и больше по размеру файла, чем JSON. Так что лучше использовать JSON