Sedona是基于Spark分布式的地理信息计算引擎,原为GeoSpark,后被Apache收录孵化,更名为Sedona,相比于传统的ArcGIS、QGIS等分析工具,Sedona可以提供更好分布式空间分析。
准备工作
- Windows
- IDEA
- Sedona支持Java、Scala两种。
具体安装教程在GeoSpark入门中已经讲过了,可以参考https://www.jianshu.com/p/8e6960791b98
Maven依赖
-
打开IDEA,创建Maven新工程,修改pom.xml文件
<properties> <spark.version>2.4.0</spark.version> <sedona.spark.version>2.4_2.11</sedona.spark.version> <sedona.ersion>1.0.0-incubating</sedona.ersion> </properties> <dependencies> <dependency> <groupId>org.apache.sedona</groupId> <artifactId>sedona-core-2.4_2.11</artifactId> <version>1.0.0-incubating</version> </dependency> <dependency> <groupId>org.apache.sedona</groupId> <artifactId>sedona-sql-2.4_2.11</artifactId> <version>1.0.0-incubating</version> </dependency> <dependency> <groupId>org.apache.sedona</groupId> <artifactId>sedona-viz-2.4_2.11</artifactId> <version>1.0.0-incubating</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-main</artifactId> <version>24.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.geotools/gt-referencing --> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-referencing</artifactId> <version>24.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.geotools/gt-epsg-hsql --> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-epsg-hsql</artifactId> <version>24.0</version> </dependency> <dependency> <groupId>org.wololo</groupId> <artifactId>jts2geojson</artifactId> <version>0.14.3</version> </dependency> <dependency> <groupId>org.locationtech.jts</groupId> <artifactId>jts-core</artifactId> <version>1.18.0</version> </dependency> </dependencies> <repositories> <repository> <id>maven2-repository.dev.java.net</id> <name>Java.net repository</name> <url>https://download.java.net/maven/2</url> </repository> <repository> <id>osgeo</id> <name>OSGeo Release Repository</name> <url>https://repo.osgeo.org/repository/release/</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories>
- 需要说明的是,在依赖中我们添加了JTS、GeoTools,这是因为Sedona的空间分析工具依赖JTS、GeoTools等开发包,但是由于GPL或MIT协议关系,在Sedona
中并未提供,需要我们自己添加。 -
如果IDEA不能运行,可以尝试添加Scala的相关依赖图片.png
- 需要说明的是,在依赖中我们添加了JTS、GeoTools,这是因为Sedona的空间分析工具依赖JTS、GeoTools等开发包,但是由于GPL或MIT协议关系,在Sedona
CSV文件读取
-
我们从CSV中创建一个Spark的RDD,CSV内容如下,将其保存在项目文件的Resources下,命名为checkin.csv:
-88.331492,32.324142,hotel -88.175933,32.360763,gas -88.388954,32.357073,bar -88.221102,32.35078,restaurant
然后我们初始化一个SparkContext,并调用GeoSpark的PointRDD,将我们的CSV导入。
SparkConf conf = new SparkConf();
conf.setAppName("Chapter01");
conf.setMaster("local[*]");
conf.set("spark.serializer", "org.apache.spark.serializer. KryoSerializer");
conf.set("spark.kryo.registrator", "org.apache.sedona.coreserde. SedonaKryoRegistrator");
JavaSparkContext sc = new JavaSparkContext(conf);
String pointRDDInputLocation = Chapter01.class.getResourc("checkin. csv").toString();
Integer pointRDDOffset = 0; // 地理位置(经纬度)从第0列开始
FileDataSplitter pointRDDSplitter = FileDataSplitter.CSV;
Boolean carryOtherAttributes = true; // 第二列的属性(酒店名)
PointRDD rdd = new PointRDD(sc, pointRDDInputLocation, pointRDDOffset, pointRDDSplitter, carryOtherAttributes);
rdd.analyze();
System.out.println(rdd.approximateTotalCount);
可以看到代码中调用了rdd.analyze()
方法,对于Sedona(GeoSpark)
来说,当我们得到Sedona的RDD
时,第一步要做的就是应该调用analyze
方法,然后在去进行分析操作,否则会有异常出现,具体analyze
里面做了什么操作,我们后期会讲。
坐标系转换
- Sedona采用EPGS标准坐标系,其坐标系也可参考EPSG官网:[https://epsg.io/(https://epsg.io)
// 坐标系转换 String sourceCrsCode = "epsg:4326"; String targetCrsCode = "epsg:4547"; rdd.CRSTransform(sourceCrsCode, targetCrsCode, true); rdd.rawSpatialRDD.foreach((p)->{ System.out.println(p); });
- 和GeoSpark不同的是,
rdd.CRSTransform(sourceCrsCode, targetCrsCode, true);
这里最后一个参数加了true
,这是因为从4326(WGS84)坐标系到4547(CGCS2000)坐标系这里涉及到了椭球的转换,GeoTools默认是需要提供椭球转换参数的,但是我们没有提供,GeoTools会直接报错的,将最后一个参数改为true
,可以让GeoTool强制忽略椭球转换参数。