Skip to content

基于KMP的编写的地图展示功能,Canvas绘制瓦片地图,可编译成PC、Android平台的版本

Notifications You must be signed in to change notification settings

doncc/ComposeMap

Repository files navigation

截图

  • 航线规划:

  • 离线地图:

项目结构

ComposeMap/
├── build.gradle.kts
├── gradle.properties
├── settings.gradle.kts
├── commonMain/
│   └── kotlin/
│       └── org/doncc/composemap/
│           ├── data/
│           │   ├── MapSource.kt             // 地图源枚举
│           │   ├── GeoPosition.kt           // 地理坐标
│           │   ├── TileCoordinate.kt        // 瓦片坐标
│           │   ├── Waypoint.kt              // 航点数据类
│           │   └── KmlUtils.kt              // KML 导出工具类
│           ├── model/
│           │   ├── MapState.kt              // 地图核心状态
│           │   ├── MapViewModel.kt          // ViewModel
│           │   └── TileManager.kt           // 瓦片管理(加载、缓存)
│           ├── ui/
│           │   ├── MapView.kt               // 地图绘制核心 Composable
│           │   ├── MapControls.kt           // UI 控件(按钮、信息显示、设置对话框等)
│           │   └── theme/
│           │       └── AppTheme.kt          // (可选)应用主题
│           └── utils/
│               ├── CoordinateUtils.kt       // 坐标转换工具
│               └── Platform.kt              // 平台差异化接口 (expect/actual)
├── desktopMain/
│   └── kotlin/
│       └── org/doncc/composemap/
│           ├── Main.kt                    // Desktop 应用入口
│           ├── utils/
│           │   └── Platform.actual.kt     // Desktop 平台具体实现
│           └── resources/                 // 资源文件夹
│               └── config.properties      // 配置文件
├── androidMain/
│   └── kotlin/
│       └── org/doncc/composemap/
│           └── utils/
│               └── Platform.actual.kt     // Android 平台预留实现
└── gradle/
└── wrapper/
└── ...

功能说明

  1. 增加自定义航线功能(仅限json格式定义说明)
  2. 根据自定义航线,可导出xml、json格式数据
  3. 根据自定义航线,可导入航线,并在地图上显示航点和航线
  4. 可切换高德、百度、天地图、OpenStreetMap地图源,具备离线地图功能
  5. 具备测量距离功能
  6. 利用Canvas绘制,可摆脱平台束缚,可优雅的在PC平台上展示地图

特殊说明

  1. 航线:在关键部位,用特殊占位符去表示,比如航点编号${WAYPOINT_ID}、航点名称${WAYPOINT_NAME}、点位坐标${POINT_LAT}、${POINT_LON}
  2. 天地图需更换自己的key,更换位置在 ComposeMap\composeApp\src\desktopMain\resources\config.properties
  3. 瓦片地图缓存地址:C:\Users{YOUR_DIR}\AppData\Roaming\ComposeMap

如何运行

  1. 确保你安装了 JDK 11 或更高版本。
  2. 将以上所有代码按目录结构保存到你的项目中。
  3. 在项目根目录打开终端或使用 IntelliJ IDEA 的 Gradle 工具。
  4. 运行 Desktop 应用:
    • 终端:./gradlew :run (Linux/macOS) 或 gradlew.bat :run (Windows)
    • IntelliJ IDEA: 找到 desktopMain/kotlin/org/doncc/composemap/Main.kt 文件,点击 main 函数旁边的绿色运行按钮。

注意事项和待办事项

  1. 坐标系转换: 目前的代码主要基于 Web Mercator。切换到百度地图时,需要实现 BD-09 到 WGS-84 (或 GCJ-02) 的转换逻辑,并应用到 CoordinateUtils 和 MapSource.getTileUrl 中。高德和天地图通常使用 GCJ-02,如果从 WGS-84 (如 GPS 坐标) 输入/输出,也需要转换。
  2. 天地图 Key: 使用天地图需要申请 Key,并替换 ComposeMap\composeApp\src\desktopMain\resources\config.properties 中的 YOUR_TIANDITU_KEY。
  3. 文件对话框样式: AWT FileDialog 在不同系统上外观可能比较旧。如果需要更现代的外观,可以考虑使用 Swing JFileChooser (如备选方案所示) 或寻找 Compose 平台特定的文件选择器库。
  4. 错误处理和用户反馈: 代码中有很多 println 用于调试。实际应用中应替换为更友好的用户反馈,例如 Snackbar、Dialog 或状态提示。网络错误、文件读写错误等应健壮处理。
  5. 内存缓存策略: MapState 中的 tileCache 是一个简单的 MutableStateMap。对于大量瓦片,建议实现 LRU (Least Recently Used) 策略来限制内存使用。
  6. 性能优化: 对于非常复杂的航线或大量瓦片,可能需要进一步优化绘制和计算逻辑。例如,只重绘变化的区域,优化 KML 解析等。
  7. Android 实现: androidMain 中的 Platform.actual.kt 提供了预留方法,你需要使用 Android SDK、Context、ActivityResultLauncher 等来实现文件系统访问、图像解码和文件选择器。
  8. KML 解析: KML 解析器 (KmlUtils.parseKmlContent) 目前非常基础,仅支持 和 中的 。对于更复杂的 KML 文件,可能需要使用更完善的 XML 解析库。

About

基于KMP的编写的地图展示功能,Canvas绘制瓦片地图,可编译成PC、Android平台的版本

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published