importGeoJson method
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);
}
}