Flutter地图编辑插件polaris_map_editor的使用

Flutter地图编辑插件polaris_map_editor的使用

PolarisMapEditor 是一个用于创建带有天文学特色的地图编辑器的 Flutter 库。用户可以通过它在地图上交互式地绘制区域。该库的灵感来源于北极星(Polaris),即北天极附近的恒星,为用户提供了一个可靠的参照点。

示例

开始使用

首先,在您的 Dart 代码中导入该库:

import 'package:polaris_map_editor/polaris_map_editor.dart';

如何使用

PolarisMapEditor 小部件

以下是一个简单的示例,展示了如何使用 PolarisMapEditor 小部件来创建一个地图编辑器:

import 'dart:io';

import 'package:example/config.dart';
import 'package:flutter/material.dart';
import 'package:polaris_map_editor/polaris_map_editor.dart';
import 'package:polaris_map_editor/polaris_map_editor_dependencies.dart';

void main() {
  runApp(const Example());
}

/// 一个展示如何使用 PolarisMapEditor 小部件的例子。
class Example extends StatelessWidget {
  const Example({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Polaris Map Editor',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      debugShowCheckedModeBanner: false,
      home: const Editor(),
    );
  }
}

class Editor extends StatefulWidget {
  const Editor({super.key});

  @override
  State<Editor> createState() => _EditorState();
}

class _EditorState extends State<Editor> {
  /// 一个用于控制地图的 flutter map 控制器。
  final mapController = MapController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Polaris Map Editor'),
      ),
      body: PolarisMapEditor(
        mapController: mapController,
        options: PolarisOptions.defaultOptions(
          color: Colors.deepPurple,
          googlePlaceApiKey: Platform.isMacOS || Platform.isIOS
              ? Config.googlePlaceIosKey
              : Config.googlePlaceAndroidKey,
        ),
        onAreaChanged: print,
        child: FlutterMap(
          mapController: mapController,
          options: MapOptions(
            interactionOptions: InteractionOptions(
              cursorKeyboardRotationOptions: CursorKeyboardRotationOptions.disabled(), // 防止快捷键
            ),
          ),
          children: [
            TileLayer(
              urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
              userAgentPackageName: 'com.cosmos-in-code.polaris_map_editor',
            ),
            const PolarisLayer(), // Polaris 小部件,包括 AreaLayer、LinesLayer 和 PointsLayer
          ],
        ),
      ),
    );
  }
}

PolarisOptions

PolarisOptions 类负责自定义 Polaris 地图编辑器。它可以与 Flutter Map 完美集成,并提供多种定制选项。

factory PolarisOptions.defaultOptions({
  Color color = Colors.blue,
  String? googlePlaceApiKey,
}) {
  return PolarisOptions(
    menu: const MenuOptions(
      enabled: true,
    ),
    area: AreaOptions(
      color: color.withOpacity(0.3),
      isFilled: true,
    ),
    line: LineOptions(
      color: color,
      strokeWidth: 3,
    ),
    draggedLine: LineOptions(
      color: color,
      strokeWidth: 3,
      isDotted: true,
    ),
    point: PointOptions(
      icon: Icon(
        Icons.circle,
        color: color,
        size: 14,
      ),
      lastPointIcon: Stack(
        fit: StackFit.expand,
        children: [
          Icon(
            Icons.circle,
            color: color,
            size: 10,
          ),
          Icon(
            Icons.circle_outlined,
            color: color,
            size: 19,
          ),
        ],
      ),
    ),
    place: googlePlaceApiKey != null
        ? PlaceOptions.googleMapService(apiKey: googlePlaceApiKey)
        : null,
    mouse: const MouseOptions(),
    shortcut: const ShortcutOptions(
      undo: [
        [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyZ],
        [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyZ],
      ],
      redo: [
        [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyY],
        [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyY],
        [
          LogicalKeyboardKey.controlLeft,
          LogicalKeyboardKey.shiftLeft,
          LogicalKeyboardKey.keyZ
        ],
        [
          LogicalKeyboardKey.metaLeft,
          LogicalKeyboardKey.shiftLeft,
          LogicalKeyboardKey.keyZ
        ],
      ],
      search: [
        [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyF],
        [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyF],
      ],
      zoomIn: [
        [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.add],
        [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.equal],
        [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.add],
        [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.equal],
        [
          LogicalKeyboardKey.controlLeft,
          LogicalKeyboardKey.shiftLeft,
          LogicalKeyboardKey.add
        ],
        [
          LogicalKeyboardKey.metaLeft,
          LogicalKeyboardKey.shiftLeft,
          LogicalKeyboardKey.add
        ],
      ],
      zoomOut: [
        [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.minus],
        [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.minus],
      ],
      fitCameraToArea: [
        [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyH],
        [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyH],
      ],
      deletePoint: [
        [LogicalKeyboardKey.controlLeft],
      ],
    ),
  );
}

更多关于Flutter地图编辑插件polaris_map_editor的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图编辑插件polaris_map_editor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter中的polaris_map_editor插件进行地图编辑的代码示例。这个插件允许用户在地图上添加、编辑和删除标记点。

首先,确保你的Flutter项目中已经添加了polaris_map_editor依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  polaris_map_editor: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用PolarisMapEditor组件。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:polaris_map_editor/polaris_map_editor.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Map Editor Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MapEditorScreen(),
    );
  }
}

class MapEditorScreen extends StatefulWidget {
  @override
  _MapEditorScreenState createState() => _MapEditorScreenState();
}

class _MapEditorScreenState extends State<MapEditorScreen> {
  final _mapController = MapController();
  List<Marker> _markers = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Map Editor Demo'),
      ),
      body: PolarisMapEditor(
        mapController: _mapController,
        initialCameraPosition: CameraPosition(
          target: LatLng(0.0, 0.0),
          zoom: 2.0,
        ),
        markers: _markers,
        onMarkerAdded: (Marker marker) {
          setState(() {
            _markers.add(marker);
          });
        },
        onMarkerRemoved: (Marker marker) {
          setState(() {
            _markers.remove(marker);
          });
        },
        onMarkerDragged: (Marker marker) {
          setState(() {
            // 在这里更新marker的位置,如果需要的话
          });
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 添加一个初始标记点
          setState(() {
            _markers.add(Marker(
              id: MarkerId('initial'),
              position: LatLng(0.0, 0.0),
              infoWindow: InfoWindow(title: 'Initial Marker'),
              draggable: true,
            ));
          });
        },
        tooltip: 'Add Marker',
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 创建了一个Flutter应用MyApp是应用的入口,它包含一个MaterialApp,其主页是MapEditorScreen

  2. 定义了地图编辑屏幕MapEditorScreen是一个有状态的组件,它管理地图控制器(_mapController)和标记点列表(_markers)。

  3. 使用PolarisMapEditor组件:我们传递了地图控制器、初始相机位置、标记点列表以及标记点添加、删除和拖动的回调。

  4. 添加浮动操作按钮:点击按钮时,会在地图上添加一个初始标记点。

请注意,polaris_map_editor插件的具体API和用法可能会随着版本的更新而变化,因此建议查阅最新的官方文档以获取最准确的信息。如果插件提供了更多功能,如多边形编辑、路径绘制等,你可以参考文档中的示例代码进行进一步的扩展。

回到顶部