Я пытаюсь отобразить некоторые маркеры на карте Великобритании, однако, поскольку их насчитывается более 10 000, я пытаюсь использовать утилиту кластеризации маркеров, чтобы она выглядела менее упакованной. Я не уверен, как заставить утилиту кластеризации использовать координаты из файла GeoJSON. В руководстве Google только показано, как добавить свои собственные маркеры, а не как их получить из GeoJSON. Ниже то, что я пытался до сих пор:Google maps Marker Clustering с большим (10 000+) GeoJSON?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.slideupmap);
...
mClusterManager = new ClusterManager<MyItem>(this, getMap());
getMap().setOnCameraChangeListener(mClusterManager);
getMap().setOnMarkerClickListener(mClusterManager);
try {
readItems();
} catch (JSONException e) {
Toast.makeText(this, "Problem reading list of markers.", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
private void readItems() throws JSONException, IOException {
InputStream inputStream = getResources().openRawResource(R.raw.ukgeojson4102015);
List<MyItem> items = new MyItemReader().read(inputStream);
mClusterManager.addItems(items);
}
Таким образом, я всегда получаю «Ошибка при чтении списка маркеров» тоста.
Ниже MyItem Класс:
public class MyItem implements ClusterItem {
private final LatLng mPosition;
public MyItem(double lat, double lng) {
mPosition = new LatLng(lat, lng);
}
@Override
public LatLng getPosition() {
return mPosition;
}
}
откуда я застрял что положить в классе MyItemReader. Google один (ниже) для JSON-файла с 'ю' и значения 'LNG':
public class MyItemReader {
private static final String REGEX_INPUT_BOUNDARY_BEGINNING = "\\A";
public List<MyItem> read(InputStream inputStream) throws JSONException {
List<MyItem> items = new ArrayList<MyItem>();
String json = new Scanner(inputStream).useDelimiter(REGEX_INPUT_BOUNDARY_BEGINNING).next();
JSONArray array = new JSONArray(json);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
double lat = object.getDouble("lat");
double lng = object.getDouble("lng");
items.add(new MyItem(lat, lng));
}
return items;
}
}
В противоположность этому, данные GeoJSON находится в следующем формате:
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-5.12763, 51.95974],
"is_accurate": true
},
"properties": {
" id": 30088,
"inscription": "Some inscription"
}
}
лат и LNG значения здесь приведены под «координатами». Я предполагаю, что мне нужно сказать MyItemReader, чтобы прочитать эти координаты, но я не уверен, как это сделать.
Кто-нибудь знает, что я должен там положить? Это мой первый раз, работая с данными GeoJSON ...
Спасибо за ответ. Тем не менее, я не думаю, что проблема заключается в невозможности проанализировать GeoJSON, я пытаюсь понять, как сделать его пригодным для использования в классе MyItemReader. –
'' 'double lat = object.getDouble (" lat ");' '' и '' 'double lng = object.getDouble (" lng ");' '' не будут работать для того, что вы пытаетесь тогда - нет JSON-свойств с именем «lat» или «lng» в JSON, который вы пытаетесь прочитать. Вы захотите вместо этого изменить его на getJSONObject («geometry»), а затем вызвать getJSONArray («координаты»), чтобы получить из него массив координат. Затем в массиве вы можете вызвать getDouble (0/1), чтобы извлечь значения lat/lng. –
Еще раз спасибо за ответ. Я пробовал это так, как вы предлагали, но я не могу понять, как это сделать. Итак, вы говорите, что я должен изменить класс myitemreader, чтобы эти два действия вы упомянули перед выполнением функций double lat/double lng? Можете ли вы предоставить пример или указать мне какую-нибудь документацию/учебник, который может объяснить это более подробно? –