转自:https://blog.csdn.net/cobramonkey/article/details/71124888

作为大数据分析的重要工具,Hadoop在这一领域发挥着不可或缺的作用。有些人认为随着Spark的兴起和应用,Hadoop的MapReduce计算框架已经过时(而事实也是如此),Spark的高效、易用确实功能强大,在大数据分析计算中其作用也日渐提高。但无论分析工具如何改进,Hadoop带给我们的HDFS、HIVE以及NoSQL的代表HBASE在今天这个以数据为核心的大数据时代,依旧是不可或缺的。扯了这么多,就来说说笔者最近进行地理大数据池化时遇到的格式转换问题,即将shapefile转换为GeoJson。

  • 1.GeoJson是啥 
    谈到GeoJson,就不得不说和它看起来似乎关系密切的Json格式。Json全称JavaScript Object Notation,即Javascript对象标注。在网络传输过程中,大体量和多格式的数据会造成处理的复杂化且消耗大量的网络资源,我的理解是Json格式就是将JavaScript中的对象统一规范化,以键值对的形式保存原有对象的信息,这样在传输时,只需传输与简单文本差不多的内容即可完成网页内容的传输和网页响应。而这部分数据在具体应用时,则可以根据其应用规则来从Json格式还原。大体上说,Json是由一个个键值对组成的具有面向对象思想的数据格式,具有以下特点:
数据在键值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
  • 1
  • 2
  • 3
  • 4

下面的例子可能更加一目了然:

{
"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是非常合适的选择。

  • 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的转换免不了要折腾。

    首先,是工具的选取。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工具使用时相关功能的中文资料较少,开发时只能借助官方文档筛选。希望能帮到有同样需求的朋友。

GeoJson格式与转换(shapefile)Geotools的更多相关文章

  1. GeoJSON格式规范说明

    GeoJSON格式规范说明 1.简介 GeoJSON是一种对各种地理数据结构进行编码的格式.GeoJSON对象可以表示几何.特征或者特征集合.GeoJSON支持下面几何类型:点.线.面.多点.多线.多 ...

  2. [转] 将DOS格式文本文件转换成UNIX格式

    点击此处阅读原文 用途说明 dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter).DOS下的文本文 ...

  3. SQL中CONVERT日期不同格式的转换用法

    SQL中CONVERT日期不同格式的转换用法 格式: CONVERT(data_type,expression[,style]) 说明:此样式一般在时间类型(datetime,smalldatetim ...

  4. atitit.标准时间格式 互相转换 秒数 最佳实践

    atitit.标准时间格式 互相转换 秒数 最佳实践 例如00:01:19 转换为秒数  79,,and互相转换 一个思路是使用div 60 mod...不过麻烦的... 更好的方法是使用stamp ...

  5. Echarts-地图扩展-标准geoJson格式扩展地图-例子

    本人菜鸟一枚,最近搞echarts地图.看到官方给的“标准geoJson格式扩展地图-全国主要城市”的例子,瞬间就蒙逼了.不怪人官网的例子不好,实在是我看不懂它是怎么弄得.最后折腾了一晚上,最后终于弄 ...

  6. js字符串的各种格式的转换 ToString,Format

    1.转换钱的格式,仅限int型,float型,double型 double d = 400; d.ToString("C"); //¥400.00 2.10进制数,仅限int型的数 ...

  7. ASP:GB2312格式文本文件转换成UTF-8格式

    '-------------------------------------------------'函数名称:gb2utf_file'作用:利用AdoDb.Stream对象来把GB2312格式文本文 ...

  8. xBIM 格式之间转换

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  9. Unity 数据Json格式的转换

    把对象转换为字节序列的过程称为对象的序列化. 把字节序列化恢复为对象过程称为对象的反序列化. JSON格式的转换,是一大神给我说的,让我拿来存储数据库时对一些数据的处理,感觉特别好用.但是我并没有深入 ...

随机推荐

  1. php中应用memcached

    PHP连接Memcached 先安装php的memcache扩展 # wget  http://ip/data/attachment/forum/memcache-2.2.3.tgz# tar zxf ...

  2. Python使用filetype精确判断文件类型

    Python使用filetype精确判断文件类型 判断文件类型在开发中非常常见的需求,怎样才能准确的判断文件类型呢?首先大家想到的是文件的后缀,但是非常遗憾的是这种方法是非常不靠谱的,因为文件的后缀是 ...

  3. Python列表排序

    1.冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就 ...

  4. React Native 安装

    第一 :在天朝如果你可以违规上网的话便可以按 react native 中文网的文档进行安装与调试.地址为:https://reactnative.cn/docs/getting-started.ht ...

  5. CentOS 安装jdk 1.8

    方法一:手动解压JDK的压缩包,然后设置环境变量   1.在/usr/目录下创建java目录  [root@localhost ~]# mkdir/usr/java [root@localhost ~ ...

  6. VM虚拟机网络设置

    两台PC安装了虚拟机和XP,采用“桥接”模式,设置了两个虚拟机的地址为同网段.但发现飞Q可以联通,数据库无法连接,且ping不通. 解决: (1)将防火墙关闭. (2)通过“虚拟网络编辑器”将该网络桥 ...

  7. docker随笔

    --查看系统内核版本,docker对于centos系统内核版本需要高于3.10uname -r--移除旧的版本sudo yum remove docker \ docker-client \ dock ...

  8. property自己实现

    # 先回顾一下 class Room: def __init__(self,name,width,length): self.name = name self.width = width self.l ...

  9. Spring中用到了哪些设计模式?

    谈谈Spring中都用到了哪些设计模式? JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是 ...

  10. Array js扩展方法 forEach()

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...