OSM数据分析及图形化显示以及各组员之间的关系Relation的存储

OpenStreetMap(OSM)

 

 

 

https://wiki.openstreetmap.org/wiki/Elements

 

 

 

OSM虽然是简称,但如果赋予数据的话,它就是一种格式,格式以.osm结尾,其元素有

 

 

三大元素:

1. Node ---   二维几何形态的最最基本的组成元素,点Point,横坐标:维度(lat) 纵坐标:经度(lon)

2. Way  ---    由N个Node组成,可以是闭合的多边形(Polygon)、非闭合的LineString,或者其他

3. Relation -- 关系,引用的成员包含Node、Way、甚至是一个Relation

4. Tag     ---  Element的属性标签,单纯的Node、Way或者Relation没有任何意义,只存在几何形态geometry,只有通过tag标签的k-v键值对的值,我们才知道Node代表什么,Way表示的是一个体育场还是一个耕地,或者Relation是一个地铁站还是一个片区

 

 

我们针对官网,导出一个简单的片区,具体操作如下

 

 

1.注册一个用户,在官网上搜索"北京市",定位到故宫这块

 

 

2.手动选择要导出的区域

 

 

 

3.导出

 

 

 

4.文本编辑工具打开 "gugong.osm",大致浏览下其xml构造

 

A.node

 

B.way

 

 

C.Relation

 

 

我们发现,这种结构其实很简单,最开始document元素是node,上面说过了node是最基础的几何形态点的表示,因此,先有node,紧接着就是way,高级一点的就是relation。

如果用Java面向对象的思想定义上述三个element的话,就是,OsmNode、OsmWay、OsmRelation

但是仅此是无法描述OsmNode和OsmWay之间的关系,比如Way里面引用了N个Node,同理,也无法描述OsmRelation与OsmNode以及OsmWay甚至是和自己(当然对象不是一个对象)之间的关系

为此,我们还需定义两个对象,一个是OsmWayNodes,描述Way和Node之间的关系,一个就是OsmRelationMembers,描述OsmRelation各成员之间的关系,当然members成员又指向 OsmNode、OsmWay或者OsmRelation

 

当我们有了XXX.osm数据文件后,我们就可以解析其中的XML,当然XML的解析数据需要映射到Osm对象上,也就是映射到内存中

注意,Osm格式的数据是具有拓扑关系的,不同于传统的几何对象,它包含了各个成员之间的引用,而共点是最能阐述这一特性的

 

利用OSM编辑工具,我们可以打开一个XXX.osm数据源进行查看和编辑,比如打开刚才的故宫的Osm数据

 

 

 

 

我们看到的花花绿绿的颜色,是渲染过的Osm,其真实数据就是一堆XML

 

我们查找并定位到关系“紫禁城城垣”,看看这个是个什么鬼

 

 

 

我们发现,其有两个成员,对比xml里面的members,没毛病,数据对着的,而且渲染的数据,属于这两个成员的部分高亮显示

 

点进关系,进一步查看,我们发现成员是由两个内城墙和外城墙组成的,因为高亮,我们很容易读懂Relation是什么

 

 

这是渲染过的数据,没渲染的数据长什么样了?

 

我们使用GeoTools工具包里面的JMapFrame,来加载我们的本地osm数据如下

 

 

 

 

 

当然,通过解析XML数据,我们可以很容易的构造Osm对象,有了对象就可以读取Relation为”紫禁城城垣“的数据,并打印其几何对象的WKT描述

 

 

具体这个Relation表示的常规几何形态是什么,我们也可以通过其成员的组成,来构建geometry,比如

 

 

 

 

 最后我们看一下,紫禁城城垣“这个关系的自定义几何形态的WKT文本描述是什么

 

 

RELATION(ID(231743),WAY(ID(42501669),NODE(ID(273144491),POINT(116.390556 39.912297 0.000000)),NODE(ID(273144490),POINT(116.390590 39.911573 0.000000)),NODE(ID(755823888),POINT(116.390390 39.911569 0.000000)),NODE(ID(273144489),POINT(116.390299 39.911570 0.000000)),NODE(ID(486763021),POINT(116.390273 39.912318 0.000000)),NODE(ID(273355452),POINT(116.386601 39.912182 0.000000)),NODE(ID(487060019),POINT(116.386555 39.913202 0.000000)),NODE(ID(487060020),POINT(116.386532 39.913648 0.000000)),NODE(ID(1684331502),POINT(116.386212 39.920595 0.000000)),NODE(ID(273355449),POINT(116.386196 39.920862 0.000000)),NODE(ID(734740359),POINT(116.390258 39.921014 0.000000)),NODE(ID(530743284),POINT(116.390570 39.921022 0.000000)),NODE(ID(734740355),POINT(116.390882 39.921035 0.000000)),NODE(ID(273355450),POINT(116.394968 39.921180 0.000000)),NODE(ID(487060017),POINT(116.395350 39.913911 0.000000)),NODE(ID(487060018),POINT(116.395374 39.913464 0.000000)),NODE(ID(1684381349),POINT(116.395412 39.912781 0.000000)),NODE(ID(273355451),POINT(116.395424 39.912508 0.000000)),NODE(ID(486763020),POINT(116.391750 39.912378 0.000000)),NODE(ID(273144495),POINT(116.391795 39.911595 0.000000)),NODE(ID(273357846),POINT(116.391636 39.911593 0.000000)),NODE(ID(273144494),POINT(116.391479 39.911588 0.000000)),NODE(ID(273144493),POINT(116.391433 39.912318 0.000000)),NODE(ID(273144491),POINT(116.390556 39.912297 0.000000)),ROLE(outer)),WAY(ID(40332723),NODE(ID(486763012),POINT(116.386940 39.912262 0.000000)),NODE(ID(531826618),POINT(116.389438 39.912357 0.000000)),NODE(ID(506819997),POINT(116.389761 39.912369 0.000000)),NODE(ID(486763018),POINT(116.390241 39.912388 0.000000)),NODE(ID(273144497),POINT(116.390228 39.912612 0.000000)),NODE(ID(506827426),POINT(116.391003 39.912636 0.000000)),NODE(ID(273144496),POINT(116.391737 39.912658 0.000000)),NODE(ID(486763016),POINT(116.391755 39.912436 0.000000)),NODE(ID(506819980),POINT(116.392204 39.912452 0.000000)),NODE(ID(533736276),POINT(116.392445 39.912461 0.000000)),NODE(ID(486762974),POINT(116.395072 39.912563 0.000000)),NODE(ID(486762975),POINT(116.395065 39.912756 0.000000)),NODE(ID(486762977),POINT(116.395314 39.912765 0.000000)),NODE(ID(486762978),POINT(116.395278 39.913459 0.000000)),NODE(ID(486762987),POINT(116.395090 39.913456 0.000000)),NODE(ID(511195501),POINT(116.395077 39.913682 0.000000)),NODE(ID(486762988),POINT(116.395065 39.913905 0.000000)),NODE(ID(486762989),POINT(116.395261 39.913910 0.000000)),NODE(ID(511995035),POINT(116.395221 39.914684 0.000000)),NODE(ID(533736392),POINT(116.395198 39.915125 0.000000)),NODE(ID(486762991),POINT(116.394894 39.920913 0.000000)),NODE(ID(486762993),POINT(116.394633 39.920904 0.000000)),NODE(ID(486762995),POINT(116.394626 39.921099 0.000000)),NODE(ID(486762997),POINT(116.390886 39.920969 0.000000)),NODE(ID(512073939),POINT(116.390891 39.920883 0.000000)),NODE(ID(273357088),POINT(116.390896 39.920784 0.000000)),NODE(ID(549604689),POINT(116.390582 39.920776 0.000000)),NODE(ID(273357087),POINT(116.390273 39.920763 0.000000)),NODE(ID(512073940),POINT(116.390267 39.920866 0.000000)),NODE(ID(486762998),POINT(116.390262 39.920945 0.000000)),NODE(ID(486762999),POINT(116.386538 39.920801 0.000000)),NODE(ID(486763000),POINT(116.386543 39.920604 0.000000)),NODE(ID(486763002),POINT(116.386291 39.920598 0.000000)),NODE(ID(528004823),POINT(116.386320 39.919976 0.000000)),NODE(ID(486763004),POINT(116.386612 39.913651 0.000000)),NODE(ID(486763005),POINT(116.386866 39.913658 0.000000)),NODE(ID(511195475),POINT(116.386870 39.913579 0.000000)),NODE(ID(549604474),POINT(116.386875 39.913425 0.000000)),NODE(ID(511195474),POINT(116.386885 39.913283 0.000000)),NODE(ID(486763007),POINT(116.386889 39.913212 0.000000)),NODE(ID(486763009),POINT(116.386641 39.913204 0.000000)),NODE(ID(486763010),POINT(116.386669 39.912444 0.000000)),NODE(ID(486763011),POINT(116.386936 39.912450 0.000000)),NODE(ID(486763012),POINT(116.386940 39.912262 0.000000)),ROLE(inner)))

 

 

 

 

 

最复杂的Relation解决了后,Osm数据就没有什么值得人害怕的地方了,有了Osm对象后,下一步就是对象的存储,以及对象的查询渲染,渲染的时候需要Tag标签元素,由于Tag标签元素过多,不是一两个就能说明的,放在以后,慢慢吸收!

 

 

 

Well-known text

 

 

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值