| New file |
| | |
| | | // @/utils/geoParseUtil.js |
| | | import _ from 'lodash'; // 若需要用到 lodash,需引入(当前解析逻辑暂未用到,可先注释) |
| | | |
| | | /** |
| | | * 单独的 WKT 解析函数(处理 POLYGON 和 LineString 类型) |
| | | * @param {string} wktStr - WKT 格式的地理数据字符串 |
| | | * @param {number} altitude - 高度值 |
| | | * @returns {Array} 转换后的坐标数组,格式:[{lng, lat, height}, ...] |
| | | */ |
| | | export const parseWktToPositions = (wktStr, altitude) => { |
| | | try { |
| | | // 步骤1:移除 WKT 开头的类型标识(如 POLYGON(...) → (...)) |
| | | const content = wktStr.replace(/^(POLYGON|LineString)\(/i, '').replace(/\)$/, ''); |
| | | // 步骤2:处理 POLYGON 的双层括号(如 ((x1 y1, x2 y2)) → x1 y1, x2 y2) |
| | | const coordStr = content.replace(/^\(\s*(.*?)\s*\)$/, '$1').trim(); |
| | | if (!coordStr) return []; |
| | | |
| | | // 步骤3:按逗号分割坐标对(如 "x1 y1, x2 y2" → ["x1 y1", "x2 y2"]) |
| | | const coordPairs = coordStr.split(',').map(pair => pair.trim()); |
| | | if (coordPairs.length < 2) { |
| | | console.warn('WKT 坐标点数量不足'); |
| | | return []; |
| | | } |
| | | |
| | | // 步骤4:转换为 {lng, lat, height} 格式(WKT 中坐标是 "lng lat" 顺序) |
| | | return coordPairs.map(pair => { |
| | | const [lng, lat] = pair.split(/\s+/).map(Number); // 按空格分割经纬度 |
| | | return { |
| | | lng: lng, |
| | | lat: lat, |
| | | height: Number(altitude) || 0, |
| | | }; |
| | | }); |
| | | } catch (error) { |
| | | console.error('解析 WKT 格式失败:', error); |
| | | return []; |
| | | } |
| | | }; |
| | | |
| | | /** |
| | | * 统一的地理数据解析函数(兼容 GeoJSON 和 WKT 格式) |
| | | * @param {string} geoDataStr - 地理数据字符串(GeoJSON 或 WKT 格式) |
| | | * @param {number} altitude - 高度值 |
| | | * @returns {Array} 转换后的坐标数组,格式:[{lng, lat, height}, ...] |
| | | */ |
| | | export const parseGeoDataToPositions = (geoDataStr, altitude) => { |
| | | try { |
| | | // 1. 先判断是否为 WKT 格式(以 POLYGON/LineString 开头,不含 { }) |
| | | if ( |
| | | (geoDataStr.startsWith('POLYGON') || geoDataStr.startsWith('LineString')) && |
| | | !geoDataStr.includes('{') |
| | | ) { |
| | | return parseWktToPositions(geoDataStr, altitude); |
| | | } |
| | | // 2. 否则按 GeoJSON 格式解析 |
| | | else { |
| | | const geoData = JSON.parse(geoDataStr); |
| | | let coordinates = []; |
| | | |
| | | if (geoData.type === 'Polygon') { |
| | | coordinates = geoData.coordinates[0] || []; |
| | | } else if (geoData.type === 'LineString') { |
| | | coordinates = geoData.coordinates || []; |
| | | } else { |
| | | console.warn(`不支持的 GeoJSON 类型:${geoData.type}`); |
| | | return []; |
| | | } |
| | | |
| | | // 转换为 {lng, lat, height} 格式 |
| | | return coordinates.map(([lng, lat]) => ({ |
| | | lng: Number(lng), |
| | | lat: Number(lat), |
| | | height: Number(altitude) || 0, |
| | | })); |
| | | } |
| | | } catch (error) { |
| | | console.error('解析 geo_data 失败:', error); |
| | | return []; |
| | | } |
| | | }; |