乐趣区

关于javascript:写给小白的地理信息的表示法GeoJSON

简介

GeoJSON 是一种应用 JSON 来编码各种天文数据结构的格局,是一种轻量级的数据交换格局,能够用来示意几何对象、属性数据、空间参考零碎等信息

由两种对象组成:Geometry(几何对象)和 Feature(空间行状)

  • 几何对象用来形容天文空间中的点、线、面等几何形态
  • 空间行状用来形容一个有界的实体,包含几何对象和其余属性信息

几何对象类型有:

  • 点:Point
  • 多点:MultiPoint
  • 线:LineString
  • 多线:MultiLineString
  • 面:Polygon
  • 多面:MultiPolygon
  • 几何汇合:GeometryCollection

空间行状类型有:

  • 空间行状:Feature
  • 空间形态汇合:FeatureCollection

举例

几何对象和空间行状能够互相嵌套

const GeoJSON = {
  type: "FeatureCollection",
  features: [
    {
      type: "Feature",
      geometry: {type: "Point", coordinates: [121.4737, 31.2304] },
      properties: {id: 1},
    },
    {
      type: "Feature",
      geometry: {type: "Point", coordinates: [121.4837, 31.2504] },
      properties: {id: 2},
    },
  ],
};

空间行状

FeatureCollection

FeatureCollectionFeature 对象的汇合,用来示意一组 Feature 对象

typefeatures 两个属性组成:

  • type 属性的值为 FeatureCollection
  • features 属性的值为 Feature 对象的数组
const FeatureCollectionJSON = {
  type: "FeatureCollection",
  features: [feature],
};

Feature

Feature 对象用来示意几何对象的属性信息

typegeometryproperties 三个属性组成:

  • type 属性的值为 Feature
  • geometry 属性的值为 Geometry 几何对象
  • properties 属性的值为属性对象(可选)
const FeatureJSON = {
  type: "Feature",
  geometry: {type: "Point", coordinates: [121.4737, 31.2304] },
  properties: {id: 1},
};

几何对象

Point

Point 用来示意一个点

typecoordinates 两个属性组成:

  • type 属性的值为 Point
  • coordinates 属性的值为一个数组,数组的第一个元素为经度,第二个元素为纬度
const PointJSON = {
  type: "Point",
  coordinates: [121.4737, 31.2304],
};

MultiPoint

MultiPoint 用来示意多个点

typecoordinates 两个属性组成:

  • type 属性的值为 MultiPoint
  • coordinates 属性的值为一个数组,数组的每个元素都是一个点的坐标
const MultiPointJSON = {
  type: "MultiPoint",
  coordinates: [[121.4737, 31.2304],
    [121.4837, 31.2504],
  ],
};

LineString

LineString 用来示意一条线

typecoordinates 两个属性组成:

  • type 属性的值为 LineString
  • coordinates 属性的值为一个数组,数组的每个元素都是一个点的坐标
const LineStringJSON = {
  type: "LineString",
  coordinates: [[121.4737, 31.2304],
    [121.4837, 31.2504],
  ],
};

MultiLineString

MultiLineString 用来示意多条线

typecoordinates 两个属性组成:

  • type 属性的值为 MultiLineString
  • coordinates 属性的值为一个数组,数组的每个元素都是一个线的坐标数组
const MultiLineStringJSON = {
  type: "MultiLineString",
  coordinates: [
    [[121.4737, 31.2304],
      [121.4837, 31.2504],
    ],
    [[121.4727, 31.2314],
      [121.4827, 31.2514],
    ],
  ],
};

Polygon

Polygon 用来示意一个面

typecoordinates 两个属性组成:

  • type 属性的值为 Polygon
  • coordinates 属性的值为一个数组,数组的第一个元素为外环的坐标数组,前面的元素为内环的坐标数组

polygon 的坐标数组的第一个元素和最初一个元素是雷同的,示意闭合

const PolygonJSON = {
  type: "Polygon",
  coordinates: [
    [[121.4737, 31.2304],
      [121.4837, 31.2504],
      [121.4937, 31.2304],
      [121.4737, 31.2304],
    ],
    [[121.4717, 31.2314],
      [121.4827, 31.2524],
      [121.4937, 31.2334],
      [121.4757, 31.2344],
    ],
  ],
};

MultiPolygon

MultiPolygon 用来示意多个面

typecoordinates 两个属性组成:

  • type 属性的值为 MultiPolygon
  • coordinates 属性的值为一个数组,数组的每个元素都是一个面的坐标数组
const MultiPolygonJSON = {
  type: "MultiPolygon",
  coordinates: [
    [
      [[121.4737, 31.2304],
        [121.4837, 31.2504],
        [121.4937, 31.2304],
        [121.4737, 31.2304],
      ],
      [[121.4737, 31.2304],
        [121.4837, 31.2504],
        [121.4937, 31.2304],
        [121.4737, 31.2304],
      ],
    ],
    [
      [[121.4737, 31.2304],
        [121.4837, 31.2504],
        [121.4937, 31.2304],
        [121.4737, 31.2304],
      ],
      [[121.4737, 31.2304],
        [121.4837, 31.2504],
        [121.4937, 31.2304],
        [121.4737, 31.2304],
      ],
    ],
  ],
};

GeometryCollection

GeometryCollection 用来示意几何对象的汇合

typegeometries 两个属性组成:

  • type 属性的值为 GeometryCollection
  • geometries 属性的值为几何对象的数组
const GeometryCollectionJSON = {
  type: "GeometryCollection",
  geometries: [{ type: "Point", coordinates: [121.4737, 31.2304] },
    {
      type: "LineString",
      coordinates: [[121.4737, 31.2304],
        [121.4837, 31.2504],
      ],
    },
  ],
};

可选属性

这些属性都是 GeoJSON 的扩大属性,不是 GeoJSON 标准的一部分

  • id 属性,用来形容 FeatureCollection 的惟一标识
  • bbox 属性,用来形容 FeatureCollection 的边界框

    • 四至坐标,个别用来做数据裁剪
    • 这是一组左上角和右下角的坐标,示例:[minLon, minLat, maxLon, maxLat]
  • properties 属性,用来形容 FeatureCollection 的属性
  • crs 属性,用来形容坐标参考系

其余

coordinate

coordinate 是一个数组,示意一个点的坐标,数组的长度示意坐标的维度,个别是 2 维或 3

  • 2 维:[lon, lat]
  • 3 维:[lon, lat, height]

coordinate 的第一个元素示意经度,第二个元素示意纬度,第三个元素示意高度

坐标程序是 [lon, lat],这个是举荐程序,可由 crs 属性指定

coordinates 是多维数组:

  • 点:[lon, lat]
  • 线:[[lon, lat], [lon, lat]]
  • 面:[[[lon, lat], [lon, lat]]]
  • 多面:[[[[lon, lat], [lon, lat]]]]

坐标参考系

最常应用的坐标系是 EPSG:4326EPSG:3857

  • EPSG:4326WGS84(CGCS2000,大地)坐标系,是 GeoJSON 标准的默认坐标系
  • EPSG:3857Web Mercator(墨卡托)坐标系,是 OpenLayers 的默认坐标系

它们的区别:

  • EPSG:4326 是经纬度坐标系,EPSG:3857 是投影坐标系
  • EPSG:4326 的坐标范畴是 [-180, -90, 180, 90]EPSG:3857 的坐标范畴是 [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]
  • EPSG:4326 的坐标单位是度,EPSG:3857 的坐标单位是米
  • EPSG:4326 的坐标原点是 [0, 0]EPSG:3857 的坐标原点是 [-20037508.342789244, -20037508.342789244]
  • EPSG:4326 的坐标轴方向是 [x, y]EPSG:3857 的坐标轴方向是 [x, -y]

在 ts 中应用

为了在 ts 应用 GeoJSON 可能有类型束缚,我整顿整顿了一些 GeoJSONts 类型定义和创立 GeoJSON 的办法:

  • geojson.d.ts
  • geojson.helper.ts

举例:

  1. 示意一个点和多个点的 GeoJSON 汇合:

    应用 geojson.d.ts

    type PointType = FeatureCollection<Point | MultiPoint, GeoJsonProperties<T>>;
    
    const point2Geojson: PointType<{id: string; name?: string}> = {
      type: "FeatureCollection",
      features: [
        {
          type: "Feature",
          geometry: {
            type: "Point",
            coordinates: [120.4737, 31.2304],
          },
          properties: {id: "12", name: "uccs"},
        },
        {
          type: "Feature",
          geometry: {
            type: "MultiPoint",
            coordinates: [[121.4737, 31.2304],
              [111.4737, 31.2204],
            ],
          },
          properties: {id: "1"},
        },
      ],
    };
  2. 创立一个几何对象

    应用 geojson.helper.ts

    const pointGeometry = point<{id: string}>([120.4737, 31.2304], {id: "1",});
    const featureGeoJSON = feature<Point>(pointGeometry);

参考

  • GeoJSON
  • GeoJSON 格局
  • GeoJSON 格局标准
  • EPSG 4326 vs EPSG 3857 (投影,数据集,坐标系)
  • turf.js
退出移动版