聊一聊GeoJSON

180 阅读5分钟

聊一聊GeoJSON

前言

笔者最近的项目中,需要将地图数据进行可视化,而地图数据一般都是用GeoJSON格式进行存储的,那么GeoJSON是什么?GeoJSON又是如和获取的呢?

GeoJSON是什么?

GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法(JavaScript Object Notation, 简称JSON)的地理空间信息数据交换格式。GeoJSON对象可以表示几何、特征或者特征集合。

在线测试

可以通过网站geojson.io[1]来测试、预览GeoJSON对象。

GeoJSON格式

GeoJSON总是由一个单独的对象组成。这个对象(指的是下面的GeoJSON对象)表示几何、特征或者特征集合。

  • GeoJSON对象可能有任何数目成员(名/值对)。
  • GeoJSON对象必须有一个名字为"type"的成员。这个成员的值是由GeoJSON对象的类型所确定的字符串。
  • type成员的值必须是下面之一:"Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "GeometryCollection", "Feature", 或者 "FeatureCollection"。这些值分别对应:点、多点、线、多线、面、多面、几何集合、特征、特征集合。

基础点position

position是基本的几何结构。position由数字数组表示(可以理解为经纬度)。必须至少两个元素,可以有更多元素。元素的顺序必须遵从x,y,z顺序(投影坐标参考系统中坐标的东向、北向、高程或者地理坐标参考系统中的坐标经度、纬度、高程)。

Point

Point对象表示一个点。必须包含type:Point成员和coordinates成员。coordinates是一个position。

{
  "type": "Point",
  "coordinates": [100,30]
}

MultiPoint

MultiPoint对象表示多个点。必须包含type:MultiPoint成员和coordinates成员。coordinates是由多个position组成的数组。

{
  "type": "MultiPoint",
  "coordinates": [[100,30], [101,31]]
}

LineString

LineString对象表示一条线。必须包含type:LineString成员和coordinates成员。coordinates是一个由多个position组成的数组。

{
  "type": "LineString",
  "coordinates": [[100,30], [101,31]]
}

MultiLineString

MultiLineString对象表示多条线。必须包含type:MultiLineString成员和coordinates成员。coordinates是一个由多个LineString组成的数组。

{
  "type": "MultiLineString",
  "coordinates": [
    [[100,30], [100,31]],
    [[101,31], [102,31]]
  ]
}

Polygon

Polygon对象表示一个面。必须包含type:Polygon成员和coordinates成员。"coordinates"成员必须是一个线性环坐标数组的数组。对拥有多个环的的面来说,第一个环必须是外部环,其他的必须是内部环或者孔,而且内部环和外部环的走向是相反的。一般外部环是逆时针方向,内部环是顺时针方向。

环的首尾点必须相同,表示闭合。

只有外部环

{
  "type": "Polygon",
  "coordinates": [
    [[100,31],[100,30],[101,30],[101,31],[100,31]]
  ]
}

转存失败,建议直接上传图片文件

两个环(即中间有孔洞)

{
  "type": "Polygon",
  "coordinates": [
    [[100,31],[100,30],[101,30],[101,31],[100,31]],
    [[100.2,30.8],[100.2,30.2],[100.8,30.2],[100.8,30.8],[100.2,30.8]]
  ]
}

转存失败,建议直接上传图片文件

Multipolygon

MultiPolygon对象表示多个面。必须包含type:MultiPolygon成员和coordinates成员。coordinates是一个由多个Polygon组成的数组。

{
  "type": "MultiPolygon",
  "coordinates": [
    [[[100,31],[100,30],[101,30],[101,31],[100,31]]],
    [[[100.2,30.8],[100.2,30.2],[100.8,30.2],[100.8,30.8],[100.2,30.8]]]
  ]
}

GeometryCollection

GeometryCollection对象表示一个几何集合。必须包含type:GeometryCollection成员和geometries成员。geometries是一个由多个几何对象组成的数组。

{
  "type": "GeometryCollection",
  "geometries": [
    {
      "type": "Point",
      "coordinates": [100,30]
    },
    {
      "type": "LineString",
      "coordinates": [[100,30], [101,31]]
    }
  ]
}

转存失败,建议直接上传图片文件

Feature

  1. 1. 类型为"Feature"的GeoJSON对象是要素对象。
  2. 2. 要素对象必须有一个名字为"geometry"的成员,这个几何成员的值是上面定义的几何对象或者JSON的null值。
  3. 3. 要素对象必须有一个名字为“properties"的成员,这个属性成员的值是一个对象(任何JSON对象或者JSON的null值)。“properties"成员的内容是保存要素对象的其他属性信息,例如该要素对象的name信息等
  4. 4. 如果要素是常用的标识符,那么这个标识符应当包含名字为“id”的对象成员。
{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [100,30]
  },
  "properties": {
    "name": "这是一个神奇的点"
  }
}

FeatureCollection

FeatureCollection对象表示一个要素集合。必须包含type:FeatureCollection成员和features成员。features是一个由多个Feature组成的数组。

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [100,30]
      },
      "properties": {"name": "这是一个神奇的点"}
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "LineString",
        "coordinates": [[100,30], [101,31]]
      },
      "properties": {"name": "这是一条神奇的线"}
    }
  ]
}

网上获取的GeoJSON数据,基本都是以FeatureCollection为单位的。

GeoJSON的获取

国内地图

  1. 1. 阿里云的DataV datav[2]
  2. 2. 天地图 天地图[3]

世界地图

获取任意区域的数据,除了在github搜索各种开源外,比较普遍的方式是使用openstreetmap[4],openstreetmap号称地图界的维基百科,由世界各地的用户所维护。

openstreetmap有多种获取地图的方式,笔者使用overpass API,可以本地安装,也可以在线使用overpass-turbo[5];有兴趣的同学可以稍微了解下overpass API,overpass QL语法。

实战:获取笔者所在小区的GeoJSON数据为例

1、在openstreetmap获取小区id

11.jpg

12.jpg

使用overpass-turbo获取GeoJSON数据

根据路径id,构建overpass QL查询语句。

(
  way(id:573232163);
  >;
);
out skel qt;

13.jpg

14.jpg

使用geojson.io验证GeoJSON数据

15.jpg

引用链接

[1] geojson.io: geojson.io
[2] datav: datav.aliyun.com/portal/scho…
[3] 天地图: cloudcenter.tianditu.gov.cn/administrat…
[4] openstreetmap: www.openstreetmap.org
[5] overpass-turbo: overpass-turbo.eu