查看原文:【数据seminar】GeoJSON 格式入门 —— 大数据处理地理信息的基础(内含中国省级数据)
目录
GeoJSON 的基础:JSON 格式
GeoJSON
GeoJSON 的区别
举个例子
获取地图信息
DataV
Geojson 是常见的一种地理信息的文件格式,基于JavaScript 对象表示法的地理空间信息数据交换格式。对于没有任何编程和基础的人来说,看到一串串的代码,就足够把人吓跑了。本文旨在通过浅显的语言,向大家介绍这种数据格式。相信大家在仔细阅读本文后,就能够自如的应付这种格式的文件。
GeoJSON 的基础:JSON 格式
JSON 格式是常见的用于数据传输的文件格式。语言描述容易显得太过复杂,我们举一个简单的例子(一看就会的那种):
一份JSON格式文件是这样的1:
可以看到,这份文件有“两层”内容,标示出来如下:
这么看,大概有些人已经猜到了,其实这个数据列成表格就是这样的:
这就是JSON 格式文件所实现的功能。可以简单的理解为将“一个表格的数据,用文字表述”2。
顺着这个思路,我们再仔细看看,这个文件的结构:首先,所有的内容都被包围在一个 「 {} 」 中,最大的{} 包裹了 「“people”:[{…},{…}]」的内容,所以 people 对于这组数据来说,是最大的一个变量(暂且这么称呼)。里面包含了两个变量(即"firstName”和"lastName")为一组的两组数据(即 “王 小明” 和“ 陈 小红”)。其中两组并列的数据用「,」(注意,是英文输入法下的「,」)隔开;一个变量下含有多个元素的用[]括住。这就是 JSON 格式的基础了。
对于 JSON 格式来说,people、firstName、lastName 这些其实并不叫变量,而是叫做 “Object”(对象),而其中“王”“小明”这样的数据,被称为 “Value”(值)。总的来讲,JSON 就是每一个 「变量」 都有对应的 「数值」 或者「 数值组合」 的数据格式,其本质就是一段字符串。
GeoJSON
GeoJSON 的区别
GeoJSON 出现的目的就是为了表示地理空间信息。其实 GeoJSON 是JSON的一个子集。基本的语法结构上,两者其实是一样的,都是一个 Object 对应一个 Value 。但是不同点在于,GeoJSON 通过特定的 Object 来确定特定类型、特点功能的 Value。这其实很好理解,因为这些字符,是要排布在地图上的,而非在excel上。所以,需要有一些“变量”来储存位置信息,还有一些变量来储存我们要用的数据信息,所以要区分这些不同“功能”的变量,就需要约定一定的格式,来储存这些信息。这就是GeoJSON 和 JSON 的区别。
举个例子
为了理解 GeoJSON ,我们来看一个实例:
这是一份记录北京市信息的GeoJSON文件。首先,我们能够看到,最外层是三个对象:“type”、“properties”、“geometry”。
“type” 确定的是其下对象的类型。 “type” 定义了这一整代码的类型为“Feature”, 表示为“特征对象”。“特征对象”必须包含 “properties”和“geometry”两个类型的成员,两者之间并没有顺序的差异。
“properties”里包含的各种「变量」和「值」。例如案例中:“adcode”,表示邮编,北京为110000;“na me”,表示名称,北京市;“center”为地理中心,经纬度坐标需用[]包裹住,这样才是完整的一组数据。其他信息也是类似的,这里不再赘述。如果我们需要添加变量信息,也同样在这个对象内添加值,遵照:“变量名称”:数值 或者 “名称” 的格式
“geometry”则是表示几何信息。几何信息有多种类型,所以需要在“geometry”里的“type”来标注这些信息的种类,具体的主要有以下几种:
-
Point 即点图。相当于在地图上画一个点。只能包含一个点也就是一组经纬度的数据。
-
Multipoint 即多点图,用于地图打点,可以包含多个点的集合。
-
LineString 即线。相当于在地图上画一条线。即包含起点到终点两组经纬度。
-
MultiLineString 同理,多条线。
-
Polygon 多边形。在地图上用一个多边形围住一个范围。
-
MultiPolygon 多组多边形。
-
GeometryCollection 几何集合。(相当于多层嵌套)
例子中是用了 MultiPolygon ,多组多边形组合,可以是一个也可以是多个。下面,我们将上例中省略的部分单独展开:
geometry 下面 包含“type”和“coordinates”,type上面已经说明了,是关于数据类型的,而“coordinates”则是依据数据类型,存储地理信息的。上例中这么一长串的经纬度其实是一组首尾相接的地理信息,最终会组合成一个封闭的区间,而这个区间就是北京市所在的范围。
.......
通过GeoDa3软件,最终显示的结果如下:
当然,这样框定的范围是否精准,一定程度上取决于经纬度信息的准确程度,因为用多少条边描绘这个地理信息,直接决定了这张地图的准确程度。许多边缘较为细碎的地区划分,可能会需要成百上千个点来确定。
上述例子是一个区域(省级单位)的信息,那么如果是多个省份,每个省份有多组变量怎么办呢4?
可以用“FeatureCollection”来框住其他的 “feature”,每一个 “feature” 里包裹一个省份的数据,这样就能实现用 GeoJSON 储存一个空间序列的数据了。
crs 添加坐标参考系
除此之外,GeoJSON格式文件还又一些可选对象可以用来添加其他信息。这些并不必须的,简单了解一下,有助于以后的深入学习。例如,可以记录坐标参考系统对象(Coordinate Reference System Objects):crs;
crs 对象,必须包含“type”和“properties”。“type” 可以选择 “name” 或者是 “link”,如下:
或者:
编码信息可以参考:
http://sis.apache.org/tables/CoordinateReferenceSystems.html
bbox 设置边界
除了crx外,其实还可以设置边界框对象:bbox。
边界框对象必须是2的倍数的数组。例如:
“bbox” 是东、西经 180度,南、北纬90度的范围。需要注意的是,bbox应当在「最高层级」就声明。
当然,crs 和 bbox 在使用许多软件时,可以不声明。许多软件都会提供放大缩小地图平面的功能。
更多具体内容可参考:http://geojson.org/geojson-spec.html#link-objects
获取地图信息
讲了那么多,我们要如何获取地图信息呢?
这里小编给大家推荐一个网站:
DataV
网址:http://datav.aliyun.com/static/tools/atlas/#&lat=33.54139466898275&lng=104.32617187499999&zoom=4
网站的地图数据来自阿里云,支持到处最低县级层面的数据。
我们也整理了中国省级数据,供大家下载⏬:
https://www.jianguoyun.com/p/Dct5nfIQ7KmDBhiGiV4
-
当然,网上下载的文件可能并不那么“清晰”,你可以搜索在线的json编辑器,将其格式化(就是按照规范换行)。本文提供一个简单的链接:http://tool.oschina.net/codeformat/json
-
这种说法是不够准确的,但对于上手使用GeoJSON 来说,影响不大。
-
https://geodacenter.github.io/index-cn.html
-
JSON格式是不支持注释的,下文注释主要是为了方便大家理解。