vector_map_tiles 3.1.4
vector_map_tiles: ^3.1.4 copied to clipboard
A plugin for `flutter_map` that enables the use of vector tiles.
example/lib/main.dart
import 'package:flutter/material.dart' hide Theme;
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:vector_map_tiles/vector_map_tiles.dart';
import 'package:vector_tile_renderer/vector_tile_renderer.dart';
// ignore: uri_does_not_exist
import 'api_key.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'vector_map_tiles Example',
theme: ThemeData.light(),
home: const MyHomePage(title: 'vector_map_tiles Example'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final MapController _controller = MapController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SafeArea(
child: Column(children: [
Flexible(
child: FlutterMap(
mapController: _controller,
options: MapOptions(
center: LatLng(49.246292, -123.116226),
zoom: 10,
maxZoom: 22,
interactiveFlags: InteractiveFlag.drag |
InteractiveFlag.flingAnimation |
InteractiveFlag.pinchMove |
InteractiveFlag.pinchZoom |
InteractiveFlag.doubleTapZoom),
children: [
// normally you would see TileLayer which provides raster tiles
// instead this vector tile layer replaces the standard tile layer
VectorTileLayer(
theme: _mapTheme(),
backgroundTheme: _backgroundTheme(),
// tileOffset: TileOffset.mapbox, enable with mapbox
tileProviders: TileProviders(
// Name must match name under "sources" in theme
{'openmaptiles': _cachingTileProvider(_urlTemplate())}),
)
],
)),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [_statusText()])
])));
}
VectorTileProvider _cachingTileProvider(String urlTemplate) {
return MemoryCacheVectorTileProvider(
delegate: NetworkVectorTileProvider(
urlTemplate: urlTemplate,
// this is the maximum zoom of the provider, not the
// maximum of the map. vector tiles are rendered
// to larger sizes to support higher zoom levels
maximumZoom: 14),
maxSizeBytes: 1024 * 1024 * 2);
}
Theme _mapTheme() {
// maps are rendered using themes
// to provide a dark theme do something like this:
// if (MediaQuery.of(context).platformBrightness == Brightness.dark) return myDarkTheme();
return ProvidedThemes.lightTheme();
// return ThemeReader(logger: const Logger.console())
// .read(myCustomStyle());
}
_backgroundTheme() {
return _mapTheme()
.copyWith(types: {ThemeLayerType.background, ThemeLayerType.fill});
}
String _urlTemplate() {
// IMPORTANT: See readme about matching tile provider with theme
// Stadia Maps source https://docs.stadiamaps.com/vector/
// ignore: undefined_identifier
return 'https://tiles.stadiamaps.com/data/openmaptiles/{z}/{x}/{y}.pbf?api_key=$stadiaMapsApiKey';
// Maptiler source
// return 'https://api.maptiler.com/tiles/v3/{z}/{x}/{y}.pbf?key=$maptilerApiKey';
// Mapbox source https://docs.mapbox.com/api/maps/vector-tiles/#example-request-retrieve-vector-tiles
// return 'https://api.mapbox.com/v4/mapbox.mapbox-streets-v8/{z}/{x}/{y}.mvt?access_token=$mapboxApiKey',
}
Widget _statusText() => Padding(
padding: const EdgeInsets.only(top: 8, bottom: 8),
child: StreamBuilder(
stream: _controller.mapEventStream,
builder: (context, snapshot) {
return Text(
'Zoom: ${_controller.zoom.toStringAsFixed(2)} Center: ${_controller.center.latitude.toStringAsFixed(4)},${_controller.center.longitude.toStringAsFixed(4)}');
}));
}