Используйте только определенные объекты списка относительно их значения

Я использую библиотеку flutter_map, и у меня есть массив объектов, которые я назвал POI (точки интереса), которые отображаются на карте. Каждый poi имеет значение с именем type, которое может быть map_eglise, map_basilique и т. Д. Все они отображаются на моей карте, и это вызывает много лагов, когда отображается много poi.

Я хочу отображать пои только определенного типа относительно уровня масштабирования на карте. Я знаю, как получить уровень масштабирования (в моем mapController.zoom), но я не знаю, как фильтровать мой pois массив и объекты с уровнем масштабирования. Я написал функцию с именем getFiltersByZoom, которая, на мой взгляд, может быть полезна, но на данный момент я не нашел способа ее использовать.

Widget build(BuildContext context) {
    return Scaffold(
        extendBody: true,
        body: FlutterMap(
          options: MapOptions(
            center: LatLng(43.69653967432033, 7.27036144753221),
            zoom: 15.0,
            minZoom: 4.0,
            maxZoom: 18.0,
            interactiveFlags: InteractiveFlag.all & ~InteractiveFlag.rotate,
          ),
          mapController: mapController,
          layers: [
            TileLayerOptions(
                urlTemplate: 'https://{s}.basemaps.cartocdn.com/rastertiles/voyager_labels_under/{z}/{x}/{y}{r}.png',
                subdomains: ['a', 'b', 'c'],
            ),
            MarkerLayerOptions(
              markers: [
                for (var poi in pois)...[
                  Marker(
                    point: LatLng(double.parse(poi.latitude), double.parse(poi.longitude)),
                    builder: (context) => Image.asset('assets/markers/pin_${poi.type}.png'),
                  ),
                ]
              ]//markers
            ),
          ],
        ),
    );
List<String> getFiltersByZoom(zoom) {
  switch (zoom) {
    case 6:
    case 7:
    case 8:
      return ["map_basilique", "map_cathedrale"];
    case 9:
    case 10:
      return ["map_basilique", "map_cathedrale", "special_paroisse"];
    case 11:
      return ["map_basilique", "map_cathedrale", "special_paroisse", "map_eglise"];
    default:
      return ["detail_art", "map_basilique", "map_cathedrale", "map_chapelle", "map_eglise", "map_hotel", "map_monastere", "map_oratoire", "map_sanctuaire", "special_paroisse"];
  }
}

person Papaya    schedule 10.05.2021    source источник


Ответы (1)


Вам следует обновить параметры слоя маркера

MarkerLayerOptions(
              markers: [
                for (var poi in pois)...[
                  Marker(
                    point: LatLng(double.parse(poi.latitude), double.parse(poi.longitude)),
                    builder: (context) => Image.asset('assets/markers/pin_${poi.type}.png'),
                  ),
                ]
              ]
            ),

Нравится:

MarkerLayerOptions(markers: filteredMarkers(zoom.toInt(), pois)),

Вот функция, которую нужно реализовать:

List<Marker> filteredMarkers(int zoom, List<Poi> pois) {
List<Marker> markers = [];
List<String> filtered = getFiltersByZoom(zoom);

pois.forEach((poi) {
  if (filtered.contains(poi.type)) {
      markers.add(
        Marker(
          point: LatLng(double.parse(poi.latitude), double.parse(poi.longitude)),
          builder: (context) => Image.asset('assets/markers/pin_${poi.type}.png'),
        ),
      );
  }
});
return markers;
person Hugo Sohm    schedule 19.05.2021
comment
Работает как шарм! Спасибо тебе большое !! - person Papaya; 19.05.2021