Как поставить несколько маркеров на MapBox в Android через GeoJson? - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь разместить около 40 маркеров на карте, разбросанных по большой территории. Я нашел код для этого, но он группирует соседние маркеры, но я хочу, чтобы он отображал все маркеры, как они есть, независимо от уровней масштабирования.

Это коды, которые я пробовал.

  1. Mapbox github : - Работает нормально, но создает кластеры из соседних маркеров.

  2. Этот код не работает для меня, так как Android не может разрешить методы featureCollection.getFeatures(), f.getGeometry(), mapView.addMarker, coordinates.getLatitude() и coordinates.getLongitude()

      public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
    
      private MapView mapView;
    
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
    
          Mapbox.getInstance(this, getString(R.string.mapbox_access_token));
    
          setContentView(R.layout.activity_main);
    
          mapView = findViewById(R.id.mapView);
    
          mapView.onCreate(savedInstanceState);
          mapView.getMapAsync(this);
    
      }
    
      @Override
      public void onMapReady(MapboxMap mapboxMap) {
          this.mapboxMap = mapboxMap;
    
          try{
              Uri uriMap = Uri.parse("https://dl.dropbox.com/s/9jln7v48lp3lb7e/data.geojson?dl=0");
              String geoJsonString = getStringFromFile(uriMap,MainActivity.this);
    
              GeoJsonSource source = new GeoJsonSource("geojson", geoJsonString);
              mapboxMap.addSource(source);
              mapboxMap.addLayer(new LineLayer("geojson", "geojson"));
    
              FeatureCollection featureCollection = FeatureCollection.fromJson(geoJsonString);
    
              List<Feature> features = featureCollection.getFeatures();
    
              for (Feature f : features) {
                  if (f.getGeometry() instanceof Point) {
                      Position coordinates = (Position)
                              f.getGeometry().getCoordinates();
                      mapView.addMarker(
                              new MarkerViewOptions().position(new
                                      LatLng(coordinates.getLatitude(),
                                      coordinates.getLongitude()))
                      );
                  }
              }
    
          }catch(Exception e){
              Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
          }
    
      }
    
      private static String convertStreamToString(InputStream is) throws Exception {
    
          BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    
          StringBuilder sb = new StringBuilder();
          String line = null;
          while ((line = reader.readLine()) != null) {
              sb.append(line).append("\n");
          }
          reader.close();
          return sb.toString();
      }
    
      public static String getStringFromFile(Uri fileUri, Context context) throws Exception {
          InputStream fin = context.getContentResolver().openInputStream(fileUri);
    
          String ret = convertStreamToString(fin);
    
          fin.close();
          return ret;
      }
    }
    

P.S было бы здорово, если бы я мог делать это без каких-либо библиотек.

1 Ответ

0 голосов
/ 09 сентября 2018

Вы не используете созданный вами линейный слой, он визуализирует geojson непосредственно при вызове source.setGeoJson(featureCollection).

Чтобы нарисовать маркеры непосредственно на карте, вам нужно вызвать метод addmarker для экземпляра карты, а не для экземпляра представления карты. В вашем случае mapboxMap.addMarker

Что касается неразрешенных методов, вы, вероятно, не импортируете правильные пакеты: import com.mapbox.geojson.Feature; import com.mapbox.geojson.FeatureCollection;

...