聊一聊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. 类型为"Feature"的GeoJSON对象是要素对象。
- 2. 要素对象必须有一个名字为"geometry"的成员,这个几何成员的值是上面定义的几何对象或者JSON的null值。
- 3. 要素对象必须有一个名字为“properties"的成员,这个属性成员的值是一个对象(任何JSON对象或者JSON的null值)。“properties"成员的内容是保存要素对象的其他属性信息,例如该要素对象的name信息等
- 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. 阿里云的DataV datav[2]
- 2. 天地图 天地图[3]
世界地图
获取任意区域的数据,除了在github搜索各种开源外,比较普遍的方式是使用openstreetmap[4],openstreetmap号称地图界的维基百科,由世界各地的用户所维护。
openstreetmap有多种获取地图的方式,笔者使用overpass API,可以本地安装,也可以在线使用overpass-turbo[5];有兴趣的同学可以稍微了解下overpass API,overpass QL语法。
实战:获取笔者所在小区的GeoJSON数据为例
1、在openstreetmap获取小区id
使用overpass-turbo获取GeoJSON数据
根据路径id,构建overpass QL查询语句。
(
way(id:573232163);
>;
);
out skel qt;
使用geojson.io验证GeoJSON数据
引用链接
[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