2016-02-02 1 views
0

Я пытаюсь отобразить некоторые маркеры на карте Великобритании, однако, поскольку их насчитывается более 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 ...

ответ

0

Если вам нужна помощь в разборе GeoJSON попробуйте использовать эту библиотеку: https://github.com/cocoahero/android-geojson

Поскольку у вас уже есть JSONObject в вашем цикл, вам просто нужно позвонить GeoJSON.parse на нем, чтобы получить объект, вы можете прочитать координаты. (В качестве альтернативы вы можете написать свой собственный синтаксический код - на основе вашего вопроса, хотя вместо этого вам может быть проще использовать библиотеку)

+0

Спасибо за ответ. Тем не менее, я не думаю, что проблема заключается в невозможности проанализировать GeoJSON, я пытаюсь понять, как сделать его пригодным для использования в классе MyItemReader. –

+0

'' 'double lat = object.getDouble (" lat ");' '' и '' 'double lng = object.getDouble (" lng ");' '' не будут работать для того, что вы пытаетесь тогда - нет JSON-свойств с именем «lat» или «lng» в JSON, который вы пытаетесь прочитать. Вы захотите вместо этого изменить его на getJSONObject («geometry»), а затем вызвать getJSONArray («координаты»), чтобы получить из него массив координат. Затем в массиве вы можете вызвать getDouble (0/1), чтобы извлечь значения lat/lng. –

+0

Еще раз спасибо за ответ. Я пробовал это так, как вы предлагали, но я не могу понять, как это сделать. Итак, вы говорите, что я должен изменить класс myitemreader, чтобы эти два действия вы упомянули перед выполнением функций double lat/double lng? Можете ли вы предоставить пример или указать мне какую-нибудь документацию/учебник, который может объяснить это более подробно? –

 Смежные вопросы

  • Нет связанных вопросов^_^