Initial version -- added millennium read funcionality

This commit is contained in:
Pablo
2026-03-09 22:05:28 +01:00
commit 77c2ded482
2770 changed files with 141927 additions and 0 deletions
@@ -0,0 +1,277 @@
package com.google.maps.android.data.geojson;
import android.util.Log;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.maps.android.data.Geometry;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/* JADX INFO: loaded from: classes2.dex */
public class GeoJsonParser {
private static final String BOUNDING_BOX = "bbox";
private static final String FEATURE = "Feature";
private static final String FEATURE_COLLECTION = "FeatureCollection";
private static final String FEATURE_COLLECTION_ARRAY = "features";
private static final String FEATURE_GEOMETRY = "geometry";
private static final String FEATURE_ID = "id";
private static final String GEOMETRY_COLLECTION = "GeometryCollection";
private static final String GEOMETRY_COLLECTION_ARRAY = "geometries";
private static final String GEOMETRY_COORDINATES_ARRAY = "coordinates";
private static final String LINESTRING = "LineString";
private static final String LOG_TAG = "GeoJsonParser";
private static final String MULTILINESTRING = "MultiLineString";
private static final String MULTIPOINT = "MultiPoint";
private static final String MULTIPOLYGON = "MultiPolygon";
private static final String POINT = "Point";
private static final String POLYGON = "Polygon";
private static final String PROPERTIES = "properties";
private final JSONObject mGeoJsonFile;
private final ArrayList<GeoJsonFeature> mGeoJsonFeatures = new ArrayList<>();
private LatLngBounds mBoundingBox = null;
private static class LatLngAlt {
public final Double altitude;
public final LatLng latLng;
LatLngAlt(LatLng latLng, Double d) {
this.latLng = latLng;
this.altitude = d;
}
}
public GeoJsonParser(JSONObject jSONObject) {
this.mGeoJsonFile = jSONObject;
parseGeoJson();
}
private static boolean isGeometry(String str) {
return str.matches("Point|MultiPoint|LineString|MultiLineString|Polygon|MultiPolygon|GeometryCollection");
}
private static GeoJsonFeature parseFeature(JSONObject jSONObject) {
HashMap<String, String> map = new HashMap<>();
try {
String string = jSONObject.has(FEATURE_ID) ? jSONObject.getString(FEATURE_ID) : null;
LatLngBounds boundingBox = jSONObject.has(BOUNDING_BOX) ? parseBoundingBox(jSONObject.getJSONArray(BOUNDING_BOX)) : null;
Geometry geometry = (!jSONObject.has(FEATURE_GEOMETRY) || jSONObject.isNull(FEATURE_GEOMETRY)) ? null : parseGeometry(jSONObject.getJSONObject(FEATURE_GEOMETRY));
if (jSONObject.has(PROPERTIES) && !jSONObject.isNull(PROPERTIES)) {
map = parseProperties(jSONObject.getJSONObject(PROPERTIES));
}
return new GeoJsonFeature(geometry, string, map, boundingBox);
} catch (JSONException unused) {
Log.w(LOG_TAG, "Feature could not be successfully parsed " + jSONObject.toString());
return null;
}
}
private static LatLngBounds parseBoundingBox(JSONArray jSONArray) throws JSONException {
return new LatLngBounds(new LatLng(jSONArray.getDouble(1), jSONArray.getDouble(0)), new LatLng(jSONArray.getDouble(3), jSONArray.getDouble(2)));
}
public static Geometry parseGeometry(JSONObject jSONObject) {
String string;
JSONArray jSONArray;
try {
string = jSONObject.getString("type");
} catch (JSONException unused) {
}
if (string.equals(GEOMETRY_COLLECTION)) {
jSONArray = jSONObject.getJSONArray(GEOMETRY_COLLECTION_ARRAY);
} else {
if (isGeometry(string)) {
jSONArray = jSONObject.getJSONArray(GEOMETRY_COORDINATES_ARRAY);
}
return null;
}
return createGeometry(string, jSONArray);
}
private static GeoJsonFeature parseGeometryToFeature(JSONObject jSONObject) {
Geometry geometry = parseGeometry(jSONObject);
if (geometry != null) {
return new GeoJsonFeature(geometry, null, new HashMap(), null);
}
Log.w(LOG_TAG, "Geometry could not be parsed");
return null;
}
private static HashMap<String, String> parseProperties(JSONObject jSONObject) throws JSONException {
HashMap<String, String> map = new HashMap<>();
Iterator<String> itKeys = jSONObject.keys();
while (itKeys.hasNext()) {
String next = itKeys.next();
map.put(next, jSONObject.isNull(next) ? null : jSONObject.getString(next));
}
return map;
}
private static Geometry createGeometry(String str, JSONArray jSONArray) throws JSONException {
str.hashCode();
switch (str) {
case "MultiPolygon":
return createMultiPolygon(jSONArray);
case "MultiPoint":
return createMultiPoint(jSONArray);
case "MultiLineString":
return createMultiLineString(jSONArray);
case "Point":
return createPoint(jSONArray);
case "Polygon":
return createPolygon(jSONArray);
case "LineString":
return createLineString(jSONArray);
case "GeometryCollection":
return createGeometryCollection(jSONArray);
default:
return null;
}
}
private static GeoJsonPoint createPoint(JSONArray jSONArray) throws JSONException {
LatLngAlt coordinate = parseCoordinate(jSONArray);
return new GeoJsonPoint(coordinate.latLng, coordinate.altitude);
}
private static GeoJsonMultiPoint createMultiPoint(JSONArray jSONArray) throws JSONException {
ArrayList arrayList = new ArrayList();
for (int i = 0; i < jSONArray.length(); i++) {
arrayList.add(createPoint(jSONArray.getJSONArray(i)));
}
return new GeoJsonMultiPoint(arrayList);
}
private static GeoJsonLineString createLineString(JSONArray jSONArray) throws JSONException {
ArrayList<LatLngAlt> coordinatesArray = parseCoordinatesArray(jSONArray);
ArrayList arrayList = new ArrayList();
ArrayList arrayList2 = new ArrayList();
for (LatLngAlt latLngAlt : coordinatesArray) {
arrayList.add(latLngAlt.latLng);
if (latLngAlt.altitude != null) {
arrayList2.add(latLngAlt.altitude);
}
}
return new GeoJsonLineString(arrayList, arrayList2);
}
private static GeoJsonMultiLineString createMultiLineString(JSONArray jSONArray) throws JSONException {
ArrayList arrayList = new ArrayList();
for (int i = 0; i < jSONArray.length(); i++) {
arrayList.add(createLineString(jSONArray.getJSONArray(i)));
}
return new GeoJsonMultiLineString(arrayList);
}
private static GeoJsonPolygon createPolygon(JSONArray jSONArray) throws JSONException {
return new GeoJsonPolygon(parseCoordinatesArrays(jSONArray));
}
private static GeoJsonMultiPolygon createMultiPolygon(JSONArray jSONArray) throws JSONException {
ArrayList arrayList = new ArrayList();
for (int i = 0; i < jSONArray.length(); i++) {
arrayList.add(createPolygon(jSONArray.getJSONArray(i)));
}
return new GeoJsonMultiPolygon(arrayList);
}
private static GeoJsonGeometryCollection createGeometryCollection(JSONArray jSONArray) throws JSONException {
ArrayList arrayList = new ArrayList();
for (int i = 0; i < jSONArray.length(); i++) {
Geometry geometry = parseGeometry(jSONArray.getJSONObject(i));
if (geometry != null) {
arrayList.add(geometry);
}
}
return new GeoJsonGeometryCollection(arrayList);
}
private static LatLngAlt parseCoordinate(JSONArray jSONArray) throws JSONException {
return new LatLngAlt(new LatLng(jSONArray.getDouble(1), jSONArray.getDouble(0)), jSONArray.length() < 3 ? null : Double.valueOf(jSONArray.getDouble(2)));
}
private static ArrayList<LatLngAlt> parseCoordinatesArray(JSONArray jSONArray) throws JSONException {
ArrayList<LatLngAlt> arrayList = new ArrayList<>();
for (int i = 0; i < jSONArray.length(); i++) {
arrayList.add(parseCoordinate(jSONArray.getJSONArray(i)));
}
return arrayList;
}
private static ArrayList<ArrayList<LatLng>> parseCoordinatesArrays(JSONArray jSONArray) throws JSONException {
ArrayList<ArrayList<LatLng>> arrayList = new ArrayList<>();
for (int i = 0; i < jSONArray.length(); i++) {
ArrayList<LatLngAlt> coordinatesArray = parseCoordinatesArray(jSONArray.getJSONArray(i));
ArrayList<LatLng> arrayList2 = new ArrayList<>();
Iterator<LatLngAlt> it = coordinatesArray.iterator();
while (it.hasNext()) {
arrayList2.add(it.next().latLng);
}
arrayList.add(arrayList2);
}
return arrayList;
}
private void parseGeoJson() {
try {
String string = this.mGeoJsonFile.getString("type");
if (string.equals(FEATURE)) {
GeoJsonFeature feature = parseFeature(this.mGeoJsonFile);
if (feature != null) {
this.mGeoJsonFeatures.add(feature);
}
} else if (string.equals(FEATURE_COLLECTION)) {
this.mGeoJsonFeatures.addAll(parseFeatureCollection(this.mGeoJsonFile));
} else if (isGeometry(string)) {
GeoJsonFeature geometryToFeature = parseGeometryToFeature(this.mGeoJsonFile);
if (geometryToFeature != null) {
this.mGeoJsonFeatures.add(geometryToFeature);
}
} else {
Log.w(LOG_TAG, "GeoJSON file could not be parsed.");
}
} catch (JSONException unused) {
Log.w(LOG_TAG, "GeoJSON file could not be parsed.");
}
}
private ArrayList<GeoJsonFeature> parseFeatureCollection(JSONObject jSONObject) {
ArrayList<GeoJsonFeature> arrayList = new ArrayList<>();
try {
JSONArray jSONArray = jSONObject.getJSONArray(FEATURE_COLLECTION_ARRAY);
if (jSONObject.has(BOUNDING_BOX)) {
this.mBoundingBox = parseBoundingBox(jSONObject.getJSONArray(BOUNDING_BOX));
}
for (int i = 0; i < jSONArray.length(); i++) {
try {
JSONObject jSONObject2 = jSONArray.getJSONObject(i);
if (jSONObject2.getString("type").equals(FEATURE)) {
GeoJsonFeature feature = parseFeature(jSONObject2);
if (feature == null) {
Log.w(LOG_TAG, "Index of Feature in Feature Collection that could not be created: " + i);
} else {
arrayList.add(feature);
}
}
} catch (JSONException unused) {
Log.w(LOG_TAG, "Index of Feature in Feature Collection that could not be created: " + i);
}
}
return arrayList;
} catch (JSONException unused2) {
Log.w(LOG_TAG, "Feature Collection could not be created.");
return arrayList;
}
}
public ArrayList<GeoJsonFeature> getFeatures() {
return this.mGeoJsonFeatures;
}
public LatLngBounds getBoundingBox() {
return this.mBoundingBox;
}
}