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
?
?
?
總結
以上是生活随笔為你收集整理的OSM数据分析及图形化显示以及各组员之间的关系Relation的存储的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Win10下双系统Ubuntu14.04
 - 下一篇: 81.(cesium之家)cesium修