Sedona是基于Spark分布式的地理信息计算引擎,原为GeoSpark,后被Apache收录孵化,更名为Sedona,相比于传统的ArcGIS、QGIS等分析工具,Sedona可以提供更好分布式空间分析。
准备工作
- Windows
- IDEA
- Sedona支持Java、Scala两种,本次开发语言选择Java。
具体安装教程在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的相关依赖
- 需要说明的是,在依赖中我们添加了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强制忽略椭球转换参数。