前端vue3地图GIS开发

经验

Posted by XX on January 9, 2023
  1. 前端通过什么方式绘制地图
    1. 通过echarts的geo模式绘制地图
    2. 通过百度地图或者高德地图的jsAPI绘制地图
  2. 投影方式和坐标系
    1. 目前 web Gis 最常用的 投影方式墨卡托投影,常规的地图厂商和地图引擎,都默认使用的这类投影方式。
    2. 坐标系 目前国际上最通用的经纬度坐标系,来自于 “美国国家地理空间情报局” 出台的 WGS84。 但是,国内通用的地图厂商,通常不被允许直接使用 WGS84 进行地理信息服务。 国测局规定: 国内出版的各种地图系统,必须⾄少采⽤ GCJ-02 对地理位置进⾏⾸次加密的坐标系。 - ⾼德和Google在国内都是使⽤ GCJ-02 坐标系 - 百度使⽤的是在 GCJ-02 基础上再⼀次加密的 BD-09 坐标系。
    3. 目前,社区里也是有很多关于 GCJ-02 坐标系的坐标和 WGS84 坐标互相转换的算法,最广受认可的是这个:coordtransform
  3. geoJSON: web端通用地理信息数据格式
    {
      "type": "Feature",
      "geometry": {
     "type": "Point",
     "coordinates": [125.6, 10.1]
      },
      "properties": {
     "name": "Dinagat Islands"
      }
    }
    

    目前最新的 GeoJSON 格式支持以下类别的地理信息(Feature)描述:

  • 点: Point
  • 点组(多个点): MultiPoint
  • 线: LineString
  • 线组(多条线): MultiLineString
  • 多边形: Polygon
  • 多边形组(多个多边形): MultiPolygon

以及:

  • 包含一组上述Feature的集合:FeatureCollection

GeoJSON 格式官方网站:www.rfc-editor.org/rfc/rfc7946

feature的格式

如果我想在地图上点一个点: 就需要用到 Feature 类别的 GeoJSON 数据,通常长这样:

{
  "type": "Feature",
  "properties": {
    "id": 1,
    "name": "摸鱼的春哥"
  },
  "geometry": {
    "coordinates": [
      114.48328003261895,
      29.35629560547187
    ],
    "type": "Point"
  }
}

注意,以上格式,分为三部分:

  • type:类别,支持的值只有: Feature 和 FeatureCollection。
  • properties:属性,用来记录业务属性,如 id,name 等。
  • geometry:几何信息。用来表示图形信息,是点还是线还是多边形,它们的经纬度是多少。

而 FeatureCollection 则可以表达多个 Feature 的集合:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "coordinates": [
          114.48328003261895,
          29.35629560547187
        ],
        "type": "Point"
      }
    },
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "coordinates": [
          [
            [
              114.58791284766971,
              29.391982262865895
            ],
            [
              114.58791284766971,
              29.2928121036324
            ],
            [
              114.72107020435487,
              29.2928121036324
            ],
            [
              114.72107020435487,
              29.391982262865895
            ],
            [
              114.58791284766971,
              29.391982262865895
            ]
          ]
        ],
        "type": "Polygon"
      }
    }
  ]
}

turf.js:前端必备的地理工具

官网地址:turfjs.org/ 为什么我们会需要这样一个工具? 因为: 关于地理信息的几何计算,它是专业的。

场景:求几个重心(放文本或者定位)

假设场景:你有一个多边形 GeoJSON 数据,现在你想知道它的 几何重心 在哪里?

const polygon = {
  "type": "Feature",
  "properties": {},
  "geometry": {
    "coordinates": [
      [
        [-81, 41],
        [-88, 36],
        [-84, 31],
        [-80, 33],
        [-77, 39],
        [-81, 41]
      ]
    ],
    "type": "Polygon"
  }
}
var centroid = turf.centroid(polygon);

场景:求面积

const polygon = {
  "type": "Feature",
  "properties": {},
  "geometry": {
    "coordinates": [
      [
        [-81, 41],
        [-88, 36],
        [-84, 31],
        [-80, 33],
        [-77, 39],
        [-81, 41]
      ]
    ],
    "type": "Polygon"
  }
}
const area = turf.area(polygon);// 一键计算出面积