UNPKG

leaflet-coord-converter-xiaoai

Version:

一个 Leaflet 坐标转换插件,支持GPS84、GCJ02、BD09坐标系之间的转换,提供简单易用的 API 和完整的 TypeScript 类型定义。

238 lines (200 loc) 8.23 kB
// 导入 Leaflet import * as L from "leaflet"; // 通过引入类型定义文件来扩展 Leaflet 的类型 /// <reference path="../src/CoordConverter.d.ts" /> /** * TypeScript 类型测试示例 * 这个文件主要用于验证类型定义是否正确 */ class TypeScriptDemo { private map: L.Map; constructor() { // 初始化地图 this.map = L.map("map").setView([39.915, 116.404], 13); // 测试关键功能:扩展的 TileLayer 选项,支持 coordType 属性 // 这是你提到的关键用法: const tileLayerOptions: L.TileLayerOptions = { attribution: "Leaflet高德离线地图", coordType: "gcj02", // 现在这里应该没有错误了 tms: true, }; L.tileLayer("tiles/{z}/{x}/{y}.png", tileLayerOptions).addTo(this.map); // 或者直接使用内联形式(你提到的用法): L.tileLayer("tiles/{z}/{x}/{y}.png", { attribution: "Leaflet高德离线地图", coordType: "gcj02", // 这行很重要 - 现在应该支持 coordType tms: true, }).addTo(this.map); } /** * 测试坐标转换器实例 */ testCoordConverter(): void { // 使用类型安全的方式测试坐标转换器 // 注意:运行时可能需要实际的实现 try { // 如果 L.coordConverter 在类型定义中存在,这里不应该有编译错误 const converter = (L as any).coordConverter; if (converter) { const originalCoord = { lng: 116.404, lat: 39.915 }; // 测试各种转换方法 const gcj02Result = converter.gps84ToGcj02( originalCoord.lng, originalCoord.lat ); console.log("Original GPS84:", originalCoord); console.log("Converted to GCJ02:", gcj02Result); // 在地图上显示标记 this.addMarkersToMap(originalCoord, gcj02Result); } else { console.warn( "L.coordConverter 实例在运行时不存在(仅测试类型定义)" ); } } catch (error) { console.log("运行时错误(这在类型测试中是正常的):", error); } } /** * 测试不同类型的图层选项 - 这是核心测试 */ testLayerOptions(): void { console.log("=== 测试图层选项类型定义 ==="); // 1. 测试 TileLayer 选项类型定义 const tileLayerOptions: L.TileLayerOptions = { attribution: "高德地图", coordType: "gcj02", // 关键测试:这应该通过类型检查 maxZoom: 18, tms: true, }; const baiduOptions: L.TileLayerOptions = { attribution: "百度地图", coordType: "bd09", // 关键测试:这应该通过类型检查 maxZoom: 18, tms: true, }; const gpsOptions: L.TileLayerOptions = { attribution: "GPS地图", coordType: "gps84", // 关键测试:这应该通过类型检查 maxZoom: 18, }; console.log("✓ TileLayer options (类型检查通过):", { tileLayerOptions, baiduOptions, gpsOptions, }); // 2. 测试 GridLayer 选项类型定义 const gridLayerOptions: L.GridLayerOptions = { coordType: "bd09", // 关键测试:这应该通过类型检查 tileSize: 256, }; console.log("✓ GridLayer options (类型检查通过):", gridLayerOptions); // 3. 测试实际图层创建 try { const _gaodeLayer = L.tileLayer( "https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}", { attribution: "高德地图", coordType: "gcj02", // 关键测试点 maxZoom: 18, } ); console.log("✓ 成功创建带有 coordType 的图层"); } catch (error) { console.log( "创建图层时的运行时错误(类型检查可能仍然成功):", error ); } } /** * 测试类型安全性和错误检查 */ testTypeSafety(): void { console.log("=== 类型安全性测试 ==="); // 这些应该通过类型检查 const validCoordTypes: ("gps84" | "gcj02" | "bd09")[] = [ "gps84", "gcj02", "bd09", ]; console.log("✓ 有效的坐标类型:", validCoordTypes); // 测试坐标点接口 const coord: { lng: number; lat: number } = { lng: 116.404, lat: 39.915, }; console.log("✓ 坐标点类型检查通过:", coord); // 测试图层选项的类型安全 const safeTileOptions: L.TileLayerOptions = { coordType: "gcj02", // 只允许指定的字符串字面量类型 attribution: "测试地图", }; console.log("✓ 图层选项类型检查通过:", safeTileOptions); // 注释掉的代码 - 这些应该产生 TypeScript 编译错误: /* const invalidOptions: L.TileLayerOptions = { coordType: "invalid", // 这应该产生编译错误 attribution: "测试" }; const invalidCoord: { lng: string; lat: number } = { lng: "invalid", lat: 39.915 }; // 错误类型 */ console.log("✓ 类型安全性测试完成"); } /** * 在地图上添加标记 */ private addMarkersToMap( gps84: { lng: number; lat: number }, gcj02: { lng: number; lat: number } ): void { try { // GPS84标记 const _gps84Marker = L.marker([gps84.lat, gps84.lng]) .addTo(this.map) .bindPopup( `GPS84: ${gps84.lng.toFixed(6)}, ${gps84.lat.toFixed(6)}` ); // GCJ02标记 const _gcj02Marker = L.marker([gcj02.lat, gcj02.lng]) .addTo(this.map) .bindPopup( `GCJ02: ${gcj02.lng.toFixed(6)}, ${gcj02.lat.toFixed(6)}` ); console.log("✓ 标记已添加到地图"); } catch (error) { console.log("添加标记时的错误:", error); } } /** * 运行所有测试 */ runAllTests(): void { console.log("🚀 开始 TypeScript 类型检查测试..."); console.log("主要测试目标:验证 TileLayer 的 coordType 属性类型定义"); this.testLayerOptions(); // 这是最重要的测试 this.testTypeSafety(); this.testCoordConverter(); console.log("✅ 所有测试完成!"); console.log("如果上面没有 TypeScript 编译错误,说明类型定义正确工作!"); console.log("特别是 L.tileLayer 的 coordType 属性应该可以正常使用。"); } } // 导出类以供其他文件使用 export { TypeScriptDemo }; // 如果在浏览器环境中直接运行 if (typeof window !== "undefined") { // 等待DOM加载完成 document.addEventListener("DOMContentLoaded", () => { const demo = new TypeScriptDemo(); demo.runAllTests(); // 将demo实例暴露到全局作用域以便调试 (window as any).coordDemo = demo; console.log("📋 TypeScript Demo 已加载"); console.log("🔍 请检查控制台是否有 TypeScript 编译错误"); console.log("✨ 如果没有错误,说明你的用法是正确的:"); console.log( ' L.tileLayer("tiles/{z}/{x}/{y}.png", { coordType: "gcj02", ... })' ); }); }