Geospark空间查询
title: ‘模板’
date: 2021-01-01 00:00:00
tags: [scala]
published: true
hideInList: false
#feature: /post-images/hello-gridea.png
isTop: false
Geospark空間查詢
Geospark空間查詢
GeoSpark空間索引
構(gòu)建索引
// 構(gòu)建索引 boolean buildOnSpatialPartitionedRDD = false; // 如果只需要在做空間分析的時(shí)候構(gòu)建索引,則設(shè)置為true rdd.buildIndex(IndexType.QUADTREE, buildOnSpatialPartitionedRDD);使用索引查詢
// 查詢 GeometryFactory geometryFactory = new GeometryFactory(); Coordinate[] coordinates = new Coordinate[5]; coordinates[0] = new Coordinate(-123.1,49.2); coordinates[1] = new Coordinate(-123.1,49.3); coordinates[2] = new Coordinate(-123.2,49.3); coordinates[3] = new Coordinate(-123.2,29.2); coordinates[4] = coordinates[0]; // The last coordinate is the same as the first coordinate in order to compose a closed ring Polygon polygonObject = geometryFactory.createPolygon(coordinates); boolean usingIndex = true; // 使用索引 JavaRDD<Geometry> queryResult = RangeQuery.SpatialRangeQuery(rdd, polygonObject, false, usingIndex); System.out.println(String.format("查詢結(jié)果總數(shù)為: %d",queryResult.count())); 查詢結(jié)果總數(shù)為: 623. 輸出查詢結(jié)果
// 遍歷查詢結(jié)果 queryResult.foreach(new VoidFunction<Geometry>() {@Overridepublic void call(Geometry geometry) throws Exception {System.out.println(geometry);} }); POLYGON ((-123.15566057081632 49.26206733490204, -123.15564728017853 49.26241791476514, -123.15548939905344 49.262415429329856, -123.15550257747702 49.26206484963618, -123.15566057081632 49.26206733490204)) 1 -9999 Kitsilano N POLYGON ((-123.15760176703519 49.261936547646954, -123.15718706338478 49.2619299178749, -123.15719832396375 49.26162160945501, -123.15761313807661 49.26162814910161, -123.15760218456263 49.26192530535148, -123.15760176703519 49.261936547646954)) 2 208 Rosemary Brown Park Kitsilano W 11th Avenue Vine Street N N N ................................. POLYGON ((-123.12325003271694 49.290529597005786, -123.12325184999034 POLYGON ((-123.11921795166444 49.288179012132034, -123.11889234917355 49.28806261407178, -123.11905901714364 49.28781953241384, -123.11954592548769 49.28796238352621, -123.11921795166444 49.288179012132034)) 80 27 Portal Park Downtown W Hastings Street Thurlow Street N N NKNN臨近查詢
KNN臨近查詢用于查詢距指定點(diǎn)最近的K個(gè)Geometry,在本案例中我們指定中心點(diǎn)為(-123.1,49.2),我們來(lái)查詢距離這個(gè)點(diǎn)最近的5個(gè)公園的分布。
注意:QTREE索引不支持KNN查詢,所以在使用KNN的時(shí)候,可以選擇R-Tree索引。
// 臨近查詢(KNN) rdd.buildIndex(IndexType.RTREE, buildOnSpatialPartitionedRDD); // QTREE不支持KNN查詢 Point pointObject = geometryFactory.createPoint(new Coordinate(-123.1,49.2)); int K = 5; // K Nearest Neighbors List<Geometry> result = KNNQuery.SpatialKnnQuery(rdd, pointObject, K, usingIndex); 距離點(diǎn)(-123.1,49.2)最近的五個(gè)公園是: 1: MULTIPOLYGON... 3 141 Tea Swamp Park Mount Pleasant E 15th Avenue Sophia Street N N N 2: POLYGON ... 23 140 Robson Park Mount Pleasant Kingsway St. George Street N Y N 4: POLYGON... 18 138 Major Matthews Park Mount Pleasant W 11th Avenue Manitoba Street N N N 5: POLYGON ... 24 136 Guelph Park Mount Pleasant E 7th Avenue Brunswick Street N N N空間關(guān)聯(lián)查詢(Spatial Join Query)
空間關(guān)聯(lián)查詢:創(chuàng)建一個(gè)表聯(lián)接(類(lèi)似于SQL語(yǔ)句中的join關(guān)聯(lián)),其中根據(jù)兩層中特性的相對(duì)位置,將一個(gè)圖層屬性表中的字段追加到另一個(gè)圖層層屬性表中。
現(xiàn)在我們有兩個(gè)圖層,一個(gè)是公園(polygon),另外一個(gè)是公園里一些點(diǎn)(point),現(xiàn)在我們要把這些點(diǎn)所在公園的屬性賦給這些點(diǎn),用到的就是空間關(guān)聯(lián)查詢。
// 空間關(guān)聯(lián)查詢 shapeInputLocation = Learn02.class.getResource("/point").toString(); SpatialRDD pointRdd = ShapefileReader.readToGeometryRDD(sc, shapeInputLocation); // analyze方法主要用來(lái)計(jì)算邊界 pointRdd.analyze(); parkRdd.analyze(); // spark中的分區(qū)操作,空間關(guān)聯(lián)查詢前必須進(jìn)行 parkRdd.spatialPartitioning(GridType.KDBTREE); pointRdd.spatialPartitioning(parkRdd.getPartitioner());boolean considerBoundaryIntersection = true; // 因?yàn)槭且渣c(diǎn)為基礎(chǔ),因此必須考慮邊界 usingIndex = false; JavaPairRDD<Geometry, HashSet<Geometry>> joinResult = JoinQuery.SpatialJoinQuery(parkRdd, pointRdd, usingIndex, considerBoundaryIntersection); System.out.println("空間關(guān)聯(lián)查詢結(jié)果為:"); joinResult.foreach((kv)->{System.out.println(String.format("{%s}--{%s}", kv._1.getUserData().toString(), kv._2.toString())); });SpatialJoinQuery返回一個(gè)類(lèi)似于Map集合的RDD,其中Key是SpatialJoinQuery中的第一個(gè)RDD,也就是我們的pointRDD,Value是一個(gè)Set集合,集合里面每個(gè)元素都是來(lái)自于SpatialJoinQuery中的第二個(gè)RDD,也就是parkRDD,在我們這個(gè)案例下,我們的key、value都是一一對(duì)應(yīng)的,但是當(dāng)我們反過(guò)來(lái)執(zhí)行JoinQuery.SpatialJoinQuery(pointRdd, parkRdd, usingIndex, considerBoundaryIntersection),那此時(shí)key和value就是一對(duì)多關(guān)系了,因此一個(gè)公園里會(huì)有很多個(gè)點(diǎn),但是一個(gè)點(diǎn)只會(huì)屬于一個(gè)公園(邊界上的點(diǎn)除外)。
{5}--{[POLYGON... 62 201 English Bay Beach Park West End Beach Avenue Bidwell Street N Y Y]} {10}--{[POLYGON ... 48 110 Hadden Park Kitsilano Ogden Avenue Cypress Street N Y Y]} {13}--{[POLYGON ... 76 24 Marina Square Downtown Bayshore Drive Denman Street N N Y]} {14}--{[POLYGON... 77 11 Cardero Park Downtown Bayshore Drive Cardero Street N N Y]} {3}--{[POLYGON ... 74 206 Stanley Park West End W Georgia Street Chilco Street N Y Y]} {2}--{[POLYGON... 61 -9999 Sunset Beach Park West End Y ]} {0}--{[POLYGON ... 73 -9999 Nelson Park West End Y ]} {1}--{[POLYGON ... 74 206 Stanley Park West End W Georgia Street Chilco Street N Y Y]} {15}--{[POLYGON ... 75 18 Devonian Harbour Park Downtown W Georgia Street Denman Street N N Y]} {19}--{[POLYGON... 35 28 CRAB Park at Portside Downtown E Waterfront Road Main Street Y Y N]} {8}--{[POLYGON ... 73 -9999 Nelson Park West End Y ]} {6}--{[POLYGON ... 62 201 English Bay Beach Park West End Beach Avenue Bidwell Street N Y Y]} {12}--{[POLYGON ... 79 -9999 Harbour Green Park Downtown N ]} {11}--{[POLYGON ... 78 13 Coal Harbour Park Downtown W Hastings Street Broughton Street N N N]}參考鏈接:https://www.jianshu.com/p/458f05244479
總結(jié)
以上是生活随笔為你收集整理的Geospark空间查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Geospark从Shapefile中加
- 下一篇: GeosparkViz 可视化