GeoSpark本质还是对地理要素进行操作,所以它支持了常用的一些地学几何图形。
几何图形中主要有三个要素:点,线,面。
横纵坐标构成点,多个点构成线,环线构成面,点线面混合构成几何集合。
1、基本地理数据概念
GeoSpark本质还是对地理要素进行操作,所以它支持了常用的一些地学几何图形。
几何图形中主要有三个要素:点,线,面。
横纵坐标构成点,多个点构成线,环线构成面,点线面混合构成几何集合。
对应的几个类为:
1 | 坐标:Coordinate |
之后我们创建的RDD[T] 中的泛型T就是以上这些类
2、通过GeometryFactory创建地理数据
所有地理对象都是通过com.vividsolutions.jts.geom
包下的GeometryFactory
工厂类完成创建
1 | package com.suddev.bigdata.core |
3、创建SpatialRDD(SRDD)
GeoSpark-Core 提供了三种特殊的SpatialRDD: PointRDD,PolygonRDD和LineStringRDD。
⚠️注意: GeoSpark定义的SpatialRDD是对sparkRDD的进一步封装(并不是RDD的实现),原RDD被放到了SpatialRDD之内了
它们可以从Spark RDD,CSV,TSV,WKT,WKB,Shapefiles,GeoJSON和NetCDF / HDF格式加载。
这里给出几种常用场景示例
3.1 初始化SparkContext
1 | val conf = new SparkConf(). |
3.2 创建typed Spatial RDD
3.2.1 通过已有Spark RDD创建PointRDD
1 | // 数据准备 |
3.2.2 通过CSV/TSV创建PointRDD
创建checkin.csv
在 data/checkin.csv
路径下:
1 | -88.331492,32.324142,hotel |
checkin.csv一共有三列(Column IDs) 为 0, 1, 2.
第0,1 列是坐标
第2列是用户定义数据
pointRDDOffset 控制地理坐标从第几列开始,故offset=0
1 | val pointRDDInputLocation = "data/checkin.csv" |
3.2.3 通过CSV/TSV创建PolygonRDD/LineStringRDD
创建checkinshape.csv
在 data/checkin.csv
路径下:
1 | -88.331492,32.324142,-88.331492,32.324142,-88.331492,32.324142,-88.331492,32.324142,-88.331492,32.324142,hotel |
checkinshape.csv一共有11列(Column IDs) 为 0~10
第0 - 9 列是5个坐标
第10列是用户定义数据
polygonRDDStartOffset 控制地理坐标从第几列开始,故StartOffset = 0
polygonRDDStartOffset 控制地理坐标从第几列结束,故EndOffset = 8
1 | val polygonRDDInputLocation = "data/checkinshape.csv" |
3.3 创建通用Spatial RDD
通用SpatialRDD不同于PointRDD,PolygonRDD和LineStringRDD,它允许输入数据文件包含混合的几何类型,能够适用更多场景。
WKT/WKB/GeoJson/Shapefile等文件类型就可以支持保存多种地理数据如 LineString, Polygon和MultiPolygon
3.3.1 通过WKT/WKB创建
checkin.tsv
1 | POINT(-88.331492 32.324142) hotel |
代码:
1 | val inputLocation = "data/checkin.tsv" |
3.3.2 通过GeoJSON创建
polygon.json
1 | { "type": "Feature", "properties": { "STATEFP": "01", "COUNTYFP": "077", "TRACTCE": "011501", "BLKGRPCE": "5", "AFFGEOID": "1500000US010770115015", "GEOID": "010770115015", "NAME": "5", "LSAD": "BG", "ALAND": 6844991, "AWATER": 32636 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -87.621765, 34.873444 ], [ -87.617535, 34.873369 ], [ -87.6123, 34.873337 ], [ -87.604049, 34.873303 ], [ -87.604033, 34.872316 ], [ -87.60415, 34.867502 ], [ -87.604218, 34.865687 ], [ -87.604409, 34.858537 ], [ -87.604018, 34.851336 ], [ -87.603716, 34.844829 ], [ -87.603696, 34.844307 ], [ -87.603673, 34.841884 ], [ -87.60372, 34.841003 ], [ -87.603879, 34.838423 ], [ -87.603888, 34.837682 ], [ -87.603889, 34.83763 ], [ -87.613127, 34.833938 ], [ -87.616451, 34.832699 ], [ -87.621041, 34.831431 ], [ -87.621056, 34.831526 ], [ -87.62112, 34.831925 ], [ -87.621603, 34.8352 ], [ -87.62158, 34.836087 ], [ -87.621383, 34.84329 ], [ -87.621359, 34.844438 ], [ -87.62129, 34.846387 ], [ -87.62119, 34.85053 ], [ -87.62144, 34.865379 ], [ -87.621765, 34.873444 ] ] ] } }, |
代码:
1 | val inputLocation = "data/polygon.json" |
3.3.3 通过Shapefile创建
1 | val shapefileInputLocation="data/myshapefile" |
⚠️注意:
.shp, .shx, .dbf 文件后缀必须是小写. 并且 shapefile 文件必须命名为myShapefile, 文件夹结构如下:
1 | - shapefile1 |
如果出现乱码问题可以在ShapefileReader.readToGeometryRDD
方法调用之前设置编码参数
1 | System.setProperty("geospark.global.charset", "utf8") |
4、坐标系转换
GeoSpark采用EPGS标准坐标系,其坐标系也可参考EPSG官网:https://epsg.io/
如果需要转换成其他标准的坐标系,可以通过以下方法
1 | // 源标准 |