Sedona是基于Spark分布式的地理信息計(jì)算引擎鸯匹,原為GeoSpark伦腐,后被Apache收錄孵化,更名為Sedona疼鸟,相比于傳統(tǒng)的ArcGIS后控、QGIS等分析工具,Sedona可以提供更好分布式空間分析空镜。
準(zhǔn)備工作
- Windows
- IDEA
- Sedona支持Java浩淘、Scala兩種。
具體安裝教程在GeoSpark入門中已經(jīng)講過了吴攒,可以參考http://www.reibang.com/p/8e6960791b98
Maven依賴
-
打開IDEA,創(chuàng)建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洼怔,這是因?yàn)镾edona的空間分析工具依賴JTS欣鳖、GeoTools等開發(fā)包,但是由于GPL或MIT協(xié)議關(guān)系茴厉,在Sedona
中并未提供泽台,需要我們自己添加什荣。 -
如果IDEA不能運(yùn)行,可以嘗試添加Scala的相關(guān)依賴圖片.png
- 需要說明的是张抄,在依賴中我們添加了JTS、GeoTools洼怔,這是因?yàn)镾edona的空間分析工具依賴JTS欣鳖、GeoTools等開發(fā)包,但是由于GPL或MIT協(xié)議關(guān)系茴厉,在Sedona
CSV文件讀取
-
我們從CSV中創(chuàng)建一個(gè)Spark的RDD怀酷,CSV內(nèi)容如下稻爬,將其保存在項(xiàng)目文件的Resources下,命名為checkin.csv:
-88.331492,32.324142,hotel -88.175933,32.360763,gas -88.388954,32.357073,bar -88.221102,32.35078,restaurant
然后我們初始化一個(gè)SparkContext蜕依,并調(diào)用GeoSpark的PointRDD桅锄,將我們的CSV導(dǎo)入。
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; // 地理位置(經(jīng)緯度)從第0列開始
FileDataSplitter pointRDDSplitter = FileDataSplitter.CSV;
Boolean carryOtherAttributes = true; // 第二列的屬性(酒店名)
PointRDD rdd = new PointRDD(sc, pointRDDInputLocation, pointRDDOffset, pointRDDSplitter, carryOtherAttributes);
rdd.analyze();
System.out.println(rdd.approximateTotalCount);
可以看到代碼中調(diào)用了rdd.analyze()
方法样眠,對(duì)于Sedona(GeoSpark)
來說友瘤,當(dāng)我們得到Sedona的RDD
時(shí),第一步要做的就是應(yīng)該調(diào)用analyze
方法檐束,然后在去進(jìn)行分析操作辫秧,否則會(huì)有異常出現(xiàn),具體analyze
里面做了什么操作被丧,我們后期會(huì)講盟戏。
坐標(biāo)系轉(zhuǎn)換
- Sedona采用EPGS標(biāo)準(zhǔn)坐標(biāo)系,其坐標(biāo)系也可參考EPSG官網(wǎng):[https://epsg.io/(https://epsg.io)
// 坐標(biāo)系轉(zhuǎn)換 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);
這里最后一個(gè)參數(shù)加了true
柿究,這是因?yàn)閺?326(WGS84)坐標(biāo)系到4547(CGCS2000)坐標(biāo)系這里涉及到了橢球的轉(zhuǎn)換,GeoTools默認(rèn)是需要提供橢球轉(zhuǎn)換參數(shù)的黄选,但是我們沒有提供蝇摸,GeoTools會(huì)直接報(bào)錯(cuò)的,將最后一個(gè)參數(shù)改為true
办陷,可以讓GeoTool強(qiáng)制忽略橢球轉(zhuǎn)換參數(shù)探入。