轉自:https://blog.csdn.net/cobramonkey/article/details/71124888java
做爲大數據分析的重要工具,Hadoop在這一領域發揮着不可或缺的做用。有些人認爲隨着Spark的興起和應用,Hadoop的MapReduce計算框架已通過時(而事實也是如此),Spark的高效、易用確實功能強大,在大數據分析計算中其做用也日漸提升。但不管分析工具如何改進,Hadoop帶給咱們的HDFS、HIVE以及NoSQL的表明HBASE在今天這個以數據爲核心的大數據時代,依舊是不可或缺的。扯了這麼多,就來講說筆者最近進行地理大數據池化時遇到的格式轉換問題,即將shapefile轉換爲GeoJson。linux
- 1.GeoJson是啥
談到GeoJson,就不得不說和它看起來彷佛關係密切的Json格式。Json全稱JavaScript Object Notation,即Javascript對象標註。在網絡傳輸過程當中,大致量和多格式的數據會形成處理的複雜化且消耗大量的網絡資源,個人理解是Json格式就是將JavaScript中的對象統一規範化,以鍵值對的形式保存原有對象的信息,這樣在傳輸時,只需傳輸與簡單文本差很少的內容便可完成網頁內容的傳輸和網頁響應。而這部分數據在具體應用時,則能夠根據其應用規則來從Json格式還原。大致上說,Json是由一個個鍵值對組成的具備面向對象思想的數據格式,具備如下特色:
數據在鍵值對中 數據由逗號分隔 花括號保存對象 方括號保存數組
- 1
- 2
- 3
- 4
下面的例子可能更加一目瞭然:web
{
"dog":[ { "name":"旺財", "food":"骨頭" }, { "name":"奇福", "food":"肉" } ] }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
這個例子中,dog爲一類實體,其中分爲具體的個體,每一個個體有本身的屬性。這些結構和信息在總體上就是數據,在具體應用中能夠是網頁中各類各樣的數據。
GeoJson其實就是按照這些規範組織起來的存儲帶有空間信息數據的格式,是一種對各種地理數據結構編碼的格式規範,其最大的意義也是用於共享交換和簡化數據體積、形式等。地理數據中矢量數據應用最廣,WebGIS或是地理信息分析中大多以矢量爲載體,矢量數據包括點、線、面、多面。GeoJson實例以下:數據庫
{"type":"Feature", "geometry": { "type":"Point","coordinates":[127.7156,47.5683] }, "properties":{"AREA":54.4471,"PERIMETER":68.4888,"?????":2,"????_1":23,"ADCODE93":230000,"ADCODE99":230000,"NAME":"????","POLYGONID":2,"SCALE":1.0,"ANGLE":0.0}, "id":"?????_label.1" }
- 1
- 2
- 3
- 4
- 5
- 6
-
2.Shapefile爲啥要轉格式
咱們能夠設想一下shp文件的應用場景 :
(1)本地小規模地理數據分析統計等應用功能。這種應用場景下,需求數據量小,徹底能夠在本地單機環境下直接藉助GIS工具對shp進行分析。若要求自動化,則能夠結合二次開發設計小程序徹底能夠知足業務需求,這種場景下轉換的意義並不明顯。
(2)WebGIS網站須要進行地理數據分析操做功能。這種應用場景下,需求數據量通常狀況也不大,在配置webgis時可根據地圖服務發佈工具來發布可分析和操做的地圖服務來知足這一業務需求。若存在地理數據交互和傳輸,能夠轉換地圖服務中的空間屬性和非空間屬性信息爲GeoJson格式進行操做。
(3)本地存在大規模的shp數據,須要入庫存儲及分析管理等應用。這種應用場景下,Hadoop、Spark的大數據存儲和分析框架最爲適合。Hadoop分佈式文件系統(HDFS)和數據庫系統(HBASE)是以文本或更爲基礎的二進制流來存儲數據,理論上全部類型的數據均可以直接放入其中儲存,但咱們的應用並不是只是創建一個大規模的用於數據儲存的倉庫,它還應知足進行大數據分析、挖掘等應用需求,這種條件下,將shp轉爲GeoJson確實爲一種很是合適的解決辦法。Geojson格式包含了數據最根本的空間信息與屬性信息,且其以鍵值對的形式組織,與hadoop的數據組織思想一致,以這個格式存入HDFS或轉化爲Hbase,在進行分析時並不須要進行數據取出加格式轉換和還原文件等操做,用戶能夠根據Mapreduce或Spark框架直接對存儲的數據進行分析,因此,轉換爲GeoJson是很是合適的選擇。json -
3.如何轉換
若爲網頁環境,則直接能夠藉助大佬ArcGIS發佈的ArcGIS API for JavaScript中已封裝好現有的工具便可;如果桌面或後臺環境那麼就要考慮語言和方法了。如果對GeoJson的格式有了必定理解且不怕麻煩,徹底能夠藉助C#、Java等語言進行編寫,在這個過程當中惟一須要考慮的是,你須要一個工具來讀取shp元素或是arcsde中的feature元素。.NET做爲ArcGIS從10.x版本開始欽定的首要支持開發框架,比起Java的不更新開發工具包待遇,C#的地位高的不是一點半點。C#部分要實現這個轉換彷佛能夠藉助NuGet包 geoJson.net(博主GRACE_ETERNITY用這個工具實現了geometry部分的轉換),印象中10.2.2後的ArcGIS工具箱彷佛開始提供了這個shptogeojson轉換功能,估計新版本的sdk for .net中也會存在吧!總之,做爲大佬寵兒的C#就不需費心。咱們關鍵要討論的是Java中這一功能的實現。小程序Java做爲大數據開發支持性優秀的語言,在分析地理大數據時應用需求較大。本着本身動手,豐衣足食的開源精神,要實現shp到geojson的轉換免不了要折騰。windows
首先,是工具的選取。ArcGIS官方對Java的Arcobject工具是可用的,筆者用過10.2.2的,可用於讀取shp,但要獲取arcsde中的內容,則須要ArcSDE SDK for Java,網上可蒐集的資源都是9.3版本的,且爲32位版,若你裝的64位的eclipse jdk oracle數據庫及客戶端啥的使用時就頭大了。開源的開發仍是要用開源的工具,GDAL及GeoTools是不錯的選擇。GDAL功能強大,有ogr工具庫,能夠一行代碼完成shp轉geojson,但須要本身編譯,windows環境下可能下獲得別人編譯好的jar,而對於linux環境下,則能夠根據大牛博主箜_Kong這部分的博客,很強大。若連編譯也不想整,直接拿來用,能夠藉助GeoTools工具FeatureJson和GeometryJson類的write方法來實現,羅嗦了這麼多,下面貼出FeatureJson類實現這一功能的代碼:數組
ShapefileDataStoreFactory sfdsf=new ShapefileDataStoreFactory(); ShapefileDataStore sfds=(ShapefileDataStore)sfdsf.createDataStore(fille URL); sfds.setCharset(Charset.forName("GBK")); SimpleFeatureSource featureSource=sfds.getFeatureSource(); SimpleFeatureCollection feacollection =featureSource.getFeatures(); SimpleFeatureIterator iterator=feacollection.features(); FeatureJSON fJson=new FeatureJSON(); while(iterator.hasNext()){ SimpleFeature sFeature=iterator.next(); fJson.writeFeature(sFeature, outputStream); } outputStream.flush();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 4.進一步的思考 GeoTools工具提供的現有功能是適用於Shapefile的,對於ArcGIS的Geodatabase中的數據支持較差,根據GeoTools官方文檔中的說明,Geotools對ArcSDE中的數據進行操做時,同樣須要依賴arcsde-jar-for-java jar包,也就是其依舊是根據ArcGIS提供的java類庫文件來實現。上文提到arcsde-jar-for-java只能獲取到9.3版本,其對於java是不可行的。ArcGIS官方還爲咱們提供了另一種方式:ST_Geometry函數包。向底層邁進一步來看,空間數據存儲到數據庫中依舊是按照關係型數據庫的組織、存儲方式來進行,其特殊之處的是對於空間數據部分ArcGIS作了二層組織包裝。如矢量數據以ArcSDE GeoDatabase組織存儲在Oracle中,其非空間部分屬性數據能夠直接經過SQL 語句查詢獲得,而其中存儲幾何內容的字段則進行了包裝和組織,通常shape字段爲幾何字段,若以」select * from 矢量數據表名」語句查詢,則shape部分返回一個相似Blob的結果。而ArcGIS提供的ST_Geometry函數包就是將幾何字段內容進行解析和運算的方法集合。 大致如此,GeoTools工具使用時相關功能的中文資料較少,開發時只能藉助官方文檔篩選。但願能幫到有一樣需求的朋友。