transformUtils.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import gcoord from "gcoord";
  2. // 示例 WKT 数据,可以是 POLYGON 或 MULTIPOLYGON
  3. let wktData = "MULTIPOLYGON(((106.67591743605254 38.21012898330025,106.67588081160454 38.21003303839916,106.6755667227518 38.21006159193115,106.67551318487904 38.20994380861134,106.67578087424232 38.20991525507935,106.67573447475257 38.209776056610394,106.67594862624321 38.20973322631232,106.6759771797752 38.20983673286605,106.67621495734579 38.20981715370431,106.6761636759473 38.20962317624071,106.67538440246796 38.209765943901175,106.67538440246796 38.20984050880776,106.67519166939297 38.20987258822527,106.6752925390611 38.2102444053304,106.67591743605254 38.21012898330025)))";
  4. // 从 WKT 字符串解析出坐标数组
  5. function wktToCoordinates(wkt) {
  6. if (wkt.startsWith("POLYGON")) {
  7. // 处理 POLYGON 格式
  8. return [wkt.match(/\(([^()]+)\)/)[1].trim().split(',').map(point => {
  9. return point.trim().split(' ').map(Number);
  10. })];
  11. } else if (wkt.startsWith("MULTIPOLYGON")) {
  12. // 处理 MULTIPOLYGON 格式
  13. let polygons = wkt.match(/\(\(\(([^()]+)\)\)\)/g);
  14. return polygons.map(polygon => {
  15. return polygon.match(/\(([^()]+)\)/)[1].trim().split(',').map(point => {
  16. return point.trim().split(' ').map(Number);
  17. });
  18. });
  19. } else {
  20. throw new Error("Unsupported WKT type");
  21. }
  22. }
  23. // 将坐标数组转换为火星坐标系(GCJ-02)
  24. function convertToGCJ02(coordinates) {
  25. return coordinates.map(polygon => {
  26. return polygon.map(coord => {
  27. return gcoord.transform(
  28. coord, // 源坐标
  29. gcoord.WGS84, // 源坐标系
  30. gcoord.GCJ02 // 目标坐标系(火星坐标系)
  31. );
  32. });
  33. });
  34. }
  35. // 将火星坐标系的坐标转换回 WKT 格式字符串
  36. function coordinatesToWKT(coordinates, isMultiPolygon) {
  37. if (isMultiPolygon) {
  38. // MULTIPOLYGON 格式
  39. let polygons = coordinates.map(polygon => {
  40. let coordString = polygon.map(coord => coord.join(' ')).join(', ');
  41. return `((${coordString}))`;
  42. });
  43. return `MULTIPOLYGON (${polygons.join(', ')})`;
  44. } else {
  45. // POLYGON 格式
  46. let coordString = coordinates[0].map(coord => coord.join(' ')).join(', ');
  47. return `POLYGON ((${coordString}))`;
  48. }
  49. }
  50. // 输入wkt 为84,返回wkt为火星坐标(高德)
  51. export function transform(wktData) {
  52. if (!wktData) return []
  53. wktData = wktData.replace("SRID=4490;", '')
  54. // 判断 WKT 数据是 POLYGON 还是 MULTIPOLYGON
  55. let isMultiPolygon = wktData.startsWith("MULTIPOLYGON");
  56. // WGS84 转 火星坐标
  57. let coordinates = wktToCoordinates(wktData);
  58. let gcj02Coordinates = convertToGCJ02(coordinates);
  59. let gcj02Wkt = coordinatesToWKT(gcj02Coordinates, isMultiPolygon);
  60. return gcj02Wkt;
  61. }