importGeoJson method

Future<void> importGeoJson(
  1. String sourceId,
  2. Map<String, dynamic> geoJson, {
  3. bool autoRender = true,
  4. Map<String, dynamic>? options,
})

Imports GeoJSON and optionally renders it automatically.

If autoRender is true (default), it creates appropriate layers for the data. If format is 'imdf', it converts IMDF back to internal format before rendering.

Implementation

Future<void> importGeoJson(
  String sourceId,
  Map<String, dynamic> geoJson, {
  bool autoRender = true,
  Map<String, dynamic>? options,
}) async {
  final format = options?['format'] ?? 'standard';
  final Map<String, dynamic> internalGeoJson;
  if (format == 'imdf') {
    internalGeoJson = await IMDFConverter.fromIMDF(geoJson);
  } else {
    internalGeoJson = geoJson;
  }
  await addGeoJson(sourceId, internalGeoJson);

  if (autoRender && internalGeoJson['features'] != null) {
    _sourceLayers[sourceId] = []; // Initialize layer tracking for this source

    // 1. Fill Layer
    final fillLayerId = '$sourceId-fill';
    final fillFilter = ['!', ['has', 'height']]; // Only fill if no height
    _layerBaseFilters[fillLayerId] = fillFilter;
    await addPolygonLayer(
      sourceId,
      layerId: fillLayerId,
      fillColor: ['coalesce', ['get', 'user_fillColor'], '#4264fb'],
      fillOpacity: ['coalesce', ['get', 'user_fillOpacity'], 0.5],
      outlineColor: ['coalesce', ['get', 'user_strokeColor'], '#000000'],
      filter: fillFilter,
    );
    _sourceLayers[sourceId]!.add(fillLayerId);

    // 2. Extrusion Layer (3D)
    final extrusionLayerId = '$sourceId-extrusion';
    final extrusionFilter = ['has', 'height']; // Only extrude if height exists
    _layerBaseFilters[extrusionLayerId] = extrusionFilter;
    await addIndoorExtrusionLayer(
      sourceId,
      layerId: extrusionLayerId,
      fillColor: ['coalesce', ['get', 'user_fillColor'], '#4f46e5'],
      filter: extrusionFilter,
    );
    _sourceLayers[sourceId]!.add(extrusionLayerId);

    // 3. Line Layer
    final lineLayerId = '$sourceId-line';
    final lineFilter = ['any', ['==', ['geometry-type'], 'LineString'], ['==', ['geometry-type'], 'MultiLineString']];
    _layerBaseFilters[lineLayerId] = lineFilter;
    await addPolylineLayer(
      sourceId,
      layerId: lineLayerId,
      lineColor: ['coalesce', ['get', 'user_lineColor'], '#4264fb'],
      lineWidth: ['coalesce', ['get', 'user_lineWidth'], 2.0],
      lineOpacity: ['coalesce', ['get', 'user_lineOpacity'], 1.0],
      filter: lineFilter,
    );
    _sourceLayers[sourceId]!.add(lineLayerId);

    // 4. Symbol Layer
    final symbolLayerId = '$sourceId-symbol';
    // Only show symbols (text/icons) for POIs (anchor) and Stores (unit)
    final symbolFilter = ['any',
      ['==', ['get', 'user_feature_type'], 'anchor'],
      ['==', ['get', 'user_feature_type'], 'unit']
    ];
    _layerBaseFilters[symbolLayerId] = symbolFilter;
    await addSymbolLayer(
      sourceId,
      layerId: symbolLayerId,
      iconImage: ['coalesce', ['get', 'user_icon'], 'marker-15'],
      textField: ['coalesce', ['get', 'user_name'], ''],
      textColor: ['coalesce', ['get', 'user_color'], '#000000'],
      filter: symbolFilter,
    );
    _sourceLayers[sourceId]!.add(symbolLayerId);
  }
}