最近做的项目需要详细了解geojson,因此查了一些资料,现在整理一份标准格式的记录,要理解本文需要首先了解json的基本知识,这里不过多展开,可以去参考w3school上的教程,简言之,json是通过键值对表示数据对象的一种格式,可以很好地表达数据,其全称为JavaScript Object Notation(JavaScript Object Notation),正如这个名称,JavaScript和json联系紧密,但是json可以应用的范围很广,不止于前端,它比XML数据更轻量、更容易解析(某种角度上说xml可以更自由地封装更多的数据)。很多编程语言都有对应的json解析库,例如Python的json库,C#的Newtonsoft.Json,Java的org.json。geojson是用json的语法表达和存储地理数据,可以说是json的子集。

例如下面就是一个点数据:

{

"type": "FeatureCollection",

"features": [

{"type":"Feature",

"properties":{},

"geometry":{

"type":"Point",

"coordinates":[105.380859375,31.57853542647338]

}

}

]

}

例子图片

(注:以下geojson的效果截图都来自geojson.io在线生成)

geojson将所有的地理要素分为Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon、GeometryCollection。首先是将这些要素封装到单个的geometry里,然后作为一个个的Feature(也就是要素);要素放到一个要素集合里,从树状结构来理解FeatureCollection就是根节点,表示为:

{

"type": "FeatureCollection",

"features": []

}

所有地理要素放在features的列表里。

点要素Point

点要素是最简单的,类型type对应Point,然后坐标是一个1维的数组,里面有两个元素(如果是立体的坐标就是三维x,y,z),分别为经度和纬度。properties里面可以封装各种属性,例如名称、标识颜色等等。

{"type":"Feature",

"properties":{},

"geometry":{

"type":"Point",

"coordinates":[105.380859375,31.57853542647338]

}

}

多点要素MultiPoint

{"type":"Feature",

"properties":{},

"geometry":{

"type":"MultiPoint",

"coordinates":[[105.380859375,31.57853542647338],

[105.580859375,31.52853542647338]

]

}

}

其核心坐标:

105.380859375,31.57853542647338

105.580859375,31.52853542647338

线要素LineString

线要素就是指线段,记录的是线的端点坐标,可视化时会按照记录顺序联结。对于曲线(如贝塞尔曲线)目前还没有很好的表达,但是在地理数据中,曲线一般会用LineString去拟合,现实地理世界中也没有标准的曲线地理要素。

线要素的坐标coordinates里的二维数组和多点要素基本一样,区别就在type上了。

{"type":"Feature",

"properties":{},

"geometry":{

"type":"LineString",

"coordinates":[[105.6005859375,30.65681556429287],

[107.95166015624999,31.98944183792288],

[109.3798828125,30.031055426540206],

[107.7978515625,29.935895213372444]]

}

}

对应的Kml表达:

108.65753173828125,34.1873818599505 108.72413635253905,34.25154099726973 108.77151489257812,34.16977214177208 108.88481140136719,34.229970811273084

MultiLineString

也是一个三维数组(和多边形一样);

{"type":"Feature",

"properties":{},

"geometry":{

"type":"MultiLineString",

"coordinates":

[

[

[105.6005859375,30.65681556429287],

[107.95166015624999,31.98944183792288],

[109.3798828125,30.031055426540206],

[107.7978515625,29.935895213372444]

],

[

[109.3798828125,30.031055426540206],

[107.1978515625,31.235895213372444]

]

]

}

}

多边形Polygon

注:单个多边形是一个3维数组,可以包含多个二维数组,这种情况和MultiPolygon效果很像。

{"type":"Feature",

"properties":{},

"geometry":{

"type":"Polygon",

"coordinates":[

[

[106.10595703125,33.33970700424026],

[106.32568359375,32.41706632846282],

[108.03955078125,32.2313896627376],

[108.25927734375,33.15594830078649],

[106.10595703125,33.33970700424026]

]

]

}

}

多多边形MultiPolygon

type 1 两个不会相交的多边形

{

"type": "Feature",

"properties": {},

"geometry": {

"type": "MultiPolygon",

"coordinates":

[

[

[

[109.2041015625,30.088107753367257],

[115.02685546875,30.088107753367257],

[115.02685546875,32.7872745269555],

[109.2041015625,32.7872745269555],

[109.2041015625,30.088107753367257]

]

],

[

[

[112.9833984375,26.82407078047018],

[116.69677734375,26.82407078047018],

[116.69677734375,29.036960648558267],

[112.9833984375,29.036960648558267],

[112.9833984375,26.82407078047018]

]

]

]

}

}

两个不相交的多边形

type 2 两个镶套的多边形

小的在前面,范围大的在后面,用上4个中括号,但效果不是有洞的

{

"type": "Feature",

"properties": {},

"geometry": {

"type": "MultiPolygon",

"coordinates":

[

[

[

[101.6455078125,27.68352808378776],

[114.78515624999999,27.68352808378776],

[114.78515624999999,35.209721645221386],

[101.6455078125,35.209721645221386],

[101.6455078125,27.68352808378776]

]

],

[

[

[104.2822265625,30.107117887092357],

[108.896484375,30.107117887092357],

[108.896484375,33.76088200086917],

[104.2822265625,33.76088200086917],

[104.2822265625,30.107117887092357]

]

]

]

}

}

两个镶套的多边形

type 3 有孔洞的多边形

{

"type": "Feature",

"properties": {},

"geometry": {

"type": "MultiPolygon",

"coordinates":

[

[

[

[101.6455078125,27.68352808378776],

[114.78515624999999,27.68352808378776],

[114.78515624999999,35.209721645221386],

[101.6455078125,35.209721645221386],

[101.6455078125,27.68352808378776]

],

[

[104.2822265625,30.107117887092357],

[108.896484375,30.107117887092357],

[108.896484375,33.76088200086917],

[104.2822265625,33.76088200086917],

[104.2822265625,30.107117887092357]

]

]

]

}

}

有孔洞的多边形

可以仔细去品味type2和type3的区别。它们对应的kml表达区别是比较大的。

GeometryCollection

GeometryCollection是多种基本地理要素的集合,就是里面可以包含点、线、面要素。

{

"type": "GeometryCollection",

"geometries": [

{

"type": "Point",

"coordinates": [108.62, 31.02819]

}, {

"type": "LineString",

"coordinates": [[108.896484375,30.1071178870],

[108.2184375,30.91717870],

[109.5184375,31.2175780]]

}]

}

GeometryCollection不需要放在FeatureCollection里:

{

"type": "FeatureCollection",

"features": []

}

geojson里面还有其他标签表达其他的属性,如外包矩形等,其中特别重要的是坐标系统,一般里面的坐标默认为WGS84,当然也可以是其他坐标系统的坐标,但是要标识。这部分内容之后再补充了。

更具体的内容可以参考rfc7946。

欢迎关注本人公众号,有更多有趣内容和资料:

lyns-sailing.png

java geojson_GEOJSON标准格式学习相关推荐

  1. JAVA序列化标准格式(XML、JSON)

    (一) 序列化:将java对象转换为字节序列的过程叫做序列化 反序列化:将字节对象转换为java对象的过程叫做反序列化 通常情况下,序列化有两种用途: 1) 把对象的字节序列永久的保存在硬盘中 2) ...

  2. Java学习笔记2.1.1 Java基本语法 - Java代码基本格式

    文章目录 零.本讲学习目标 一.Java基本语法格式 (一)简单说明 (二)案例演示 二.Java语句分类 (一)结构定义语句 1.简单说明 2.案例演示 (二)功能执行语句 1.简单说明 2.案例演 ...

  3. Python学习记录——英文名修改成标准格式

    Python学习记录--英文名修改成标准格式 功能需求 把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字.输入:['adam', 'LISA', 'barT'],输出:['Adam', ...

  4. java中日期格式大小写标准写法

    java中日期格式大小写标准写法: yyyy-MM-dd HH:mm:ss (年-月-日 时:分:秒)

  5. java 标准格式String转Map

    //标准格式的Map格式,如果json传中有'[',']','{','}'用URLEncoder进行加密解密处理 //{aaa=avlaue, json={ "data": { & ...

  6. java培训分享:学习Java需要什么软件

    在参加java培训过程中学习java技术,需要用到很多辅助工具,这些辅助工具是具有多功能性和实用性的,从代码构建到bug压缩.学习这些工具可以帮助您提高代码的质量,并成为一个更高效的Java开发人员. ...

  7. Java22-day13【Lambda表达式(标准格式、练习、注意事项)、接口组成更新(默认-静态-私有方法)、方法引用(构造器)】

    视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...

  8. JAVA教材(推荐新手学习)

    内容很全面的一本JAVA教材,从J2SE到J2EE,由浅入深地讲解,非常适合新手入门 目录 第一章:Java开始 1 学习目标 1 Java历史 2 Java技术概述 3 Java技术的优点 3 Ja ...

  9. 根据需求,完成如下代码(按照标准格式写),并在测试类中进行测试?

    标准格式包含: 私有属性   无参构造  有参构造  setter 和getter 需求中的方法     需求一:         员工类Employee             属性:姓名name, ...

最新文章

  1. 如何禁用<textarea>的调整大小抓取器? [重复]
  2. 阿里云物流+Flask整合
  3. Master HA源码解析
  4. Python修饰符--函数修饰符 “@”
  5. HEVC码率控制介绍(R-Lamda)
  6. 为工大瑞普新编写的CCNA实验手册提供下载
  7. 580刷590bios_AMD rx470/480/570/580/590高端技术公版/非公强刷BIOS教程教学-没差老师出品...
  8. 图像特征的特点及其常用的特征提取与匹配方法
  9. 关于2015年春运增开旅客列车的公告
  10. 计算英文句子中有多少单词?
  11. POC原型开发:巡店 一期结果
  12. 哪里有kitti数据集的百度云资源
  13. 面向对象开发期末复习概述(四)
  14. Python_爬虫_中文乱码
  15. 个人账号被Facebook封号怎么办
  16. 2018年中国数字经济发展报告:农村数字消费增速超一二线城市
  17. QT_文本编辑器_源码下载
  18. ThinkPad T440换装固态硬盘(SSD)和内存条
  19. C/C++经典面试题1(精心整理,附参考答案)
  20. Endnote生成GB/T7714-2005输出格式及中英文混排问题解决

热门文章

  1. 考虑到可访问性,使用 CSS 设置按钮样式
  2. 如何成为一名产品经理
  3. 03-JavaWeb之JSP
  4. 用计算机怎么录音,电脑怎么录音 怎么用电脑自带的录音工具来录音?
  5. 创建自己的手册 um命令
  6. DF-TAR: A Deep Fusion Network for Citywide Traffic Accident Risk Prediction... 阅读笔记
  7. 终于还是降回ios4.2.1了
  8. 为什么不用红外图片做人脸识别
  9. Python字符串中的换行符和制表符
  10. python逻辑判断函数_Python逻辑运算符及其用法