Skip to content

Commit

Permalink
Merge pull request #165 from jbouffard/query-reproject
Browse files Browse the repository at this point in the history
Query By Reprojected CRS
  • Loading branch information
echeipesh committed May 5, 2017
2 parents 43d8f17 + 0c52612 commit 53e44db
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import geopyspark.geotrellis._
import geotrellis.vector._
import geotrellis.vector.io.wkt.WKT
import geotrellis.raster._
import geotrellis.proj4._
import geotrellis.spark._
import geotrellis.spark.io._
import geotrellis.spark.io.accumulo._
Expand Down Expand Up @@ -43,7 +44,8 @@ abstract class LayerReaderWrapper {
layerName: String,
zoom: Int,
queryGeometryString: String,
queryIntervalStrings: ArrayList[String]
queryIntervalStrings: ArrayList[String],
projQuery: String
): TiledRasterRDD[_]
}

Expand Down Expand Up @@ -133,21 +135,29 @@ abstract class FilteringLayerReaderWrapper()
layerName: String,
zoom: Int,
queryGeometryString: String,
queryIntervalStrings: ArrayList[String]
queryIntervalStrings: ArrayList[String],
projQuery: String
): TiledRasterRDD[_] = {
val id = LayerId(layerName, zoom)
val valueClass = getValueClass(id)
val queryCRS = TileRDD.getCRS(projQuery)
val spatialQuery = getSpatialQuery(queryGeometryString)

(keyType, valueClass) match {
case ("SpatialKey", "geotrellis.raster.Tile") => {
val spatialQuery = getSpatialQuery(queryGeometryString)

val layer = layerReader.query[SpatialKey, Tile, TileLayerMetadata[SpatialKey]](id)
val query = spatialQuery match {
case Some(point: Point) => layer.where(Contains(point))
case Some(polygon: Polygon) => layer.where(Intersects(polygon))
case Some(multi: MultiPolygon) => layer.where(Intersects(multi))
case None => layer
val layerCRS = layer.result.metadata.crs
val query = (queryCRS, spatialQuery) match {
case (Some(crs), Some(point: Point)) => layer.where(Contains(point.reproject(layerCRS, crs)))
case (None, Some(point: Point)) => layer.where(Contains(point))

case (Some(crs), Some(polygon: Polygon)) => layer.where(Intersects(polygon.reproject(layerCRS, crs)))
case (None, Some(polygon: Polygon)) => layer.where(Intersects(polygon))

case (Some(crs), Some(multi: MultiPolygon)) => layer.where(Intersects(multi.reproject(layerCRS, crs)))
case (None, Some(multi: MultiPolygon)) => layer.where(Intersects(multi))

case (_, None) => layer
case _ => throw new Exception("Unsupported Geometry")
}

Expand All @@ -157,27 +167,34 @@ abstract class FilteringLayerReaderWrapper()
}

case ("SpatialKey", "geotrellis.raster.MultibandTile") => {
val spatialQuery = getSpatialQuery(queryGeometryString)

val layer = layerReader.query[SpatialKey, MultibandTile, TileLayerMetadata[SpatialKey]](id)
val query = spatialQuery match {
case Some(polygon: Polygon) => layer.where(Intersects(polygon))
case Some(multi: MultiPolygon) => layer.where(Intersects(multi))
case None => layer
val layerCRS = layer.result.metadata.crs
val query = (queryCRS, spatialQuery) match {
case (Some(crs), Some(polygon: Polygon)) => layer.where(Intersects(polygon.reproject(layerCRS, crs)))
case (None, Some(polygon: Polygon)) => layer.where(Intersects(polygon))

case (Some(crs), Some(multi: MultiPolygon)) => layer.where(Intersects(multi.reproject(layerCRS, crs)))
case (None, Some(multi: MultiPolygon)) => layer.where(Intersects(multi))

case (_, None) => layer
case _ => throw new Exception("Unsupported Geometry")
}
new SpatialTiledRasterRDD(Some(zoom), query.result)
}

case ("SpaceTimeKey", "geotrellis.raster.Tile") => {
val spatialQuery = getSpatialQuery(queryGeometryString)
val temporalQuery = getTemporalQuery(queryIntervalStrings)

val layer = layerReader.query[SpaceTimeKey, Tile, TileLayerMetadata[SpaceTimeKey]](id)
val query1 = spatialQuery match {
case Some(polygon: Polygon) => layer.where(Intersects(polygon))
case Some(multi: MultiPolygon) => layer.where(Intersects(multi))
case None => layer
val layerCRS = layer.result.metadata.crs
val query1 = (queryCRS, spatialQuery) match {
case (Some(crs), Some(polygon: Polygon)) => layer.where(Intersects(polygon.reproject(layerCRS, crs)))
case (None, Some(polygon: Polygon)) => layer.where(Intersects(polygon))

case (Some(crs), Some(multi: MultiPolygon)) => layer.where(Intersects(multi.reproject(layerCRS, crs)))
case (None, Some(multi: MultiPolygon)) => layer.where(Intersects(multi))

case (_, None) => layer
case _ => throw new Exception("Unsupported Geometry")
}
val query2 = temporalQuery match {
Expand All @@ -190,14 +207,18 @@ abstract class FilteringLayerReaderWrapper()
}

case ("SpaceTimeKey", "geotrellis.raster.MultibandTile") => {
val spatialQuery = getSpatialQuery(queryGeometryString)
val temporalQuery = getTemporalQuery(queryIntervalStrings)

val layer = layerReader.query[SpaceTimeKey, MultibandTile, TileLayerMetadata[SpaceTimeKey]](id)
val query1 = spatialQuery match {
case Some(polygon: Polygon) => layer.where(Intersects(polygon))
case Some(multi: MultiPolygon) => layer.where(Intersects(multi))
case None => layer
val layerCRS = layer.result.metadata.crs
val query1 = (queryCRS, spatialQuery) match {
case (Some(crs), Some(polygon: Polygon)) => layer.where(Intersects(polygon.reproject(layerCRS, crs)))
case (None, Some(polygon: Polygon)) => layer.where(Intersects(polygon))

case (Some(crs), Some(multi: MultiPolygon)) => layer.where(Intersects(multi.reproject(layerCRS, crs)))
case (None, Some(multi: MultiPolygon)) => layer.where(Intersects(multi))

case (_, None) => layer
case _ => throw new Exception("Unsupported Geometry")
}
val query2 = temporalQuery match {
Expand Down
13 changes: 11 additions & 2 deletions geopyspark/geotrellis/catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ def query(geopysc,
layer_zoom,
intersects,
time_intervals=None,
proj_query=None,
options=None,
**kwargs):

Expand Down Expand Up @@ -349,19 +350,27 @@ def query(geopysc,
if time_intervals is None:
time_intervals = []

if proj_query is None:
proj_query = ""
if isinstance(proj_query, int):
proj_query = "EPSG:" + str(proj_query)


if isinstance(intersects, Polygon) or isinstance(intersects, Point):
srdd = cached.reader.query(key,
layer_name,
layer_zoom,
dumps(intersects),
time_intervals)
time_intervals,
proj_query)

elif isinstance(intersects, str):
srdd = cached.reader.query(key,
layer_name,
layer_zoom,
intersects,
time_intervals)
time_intervals,
proj_query)
else:
raise TypeError("Could not query intersection", intersects)

Expand Down
7 changes: 7 additions & 0 deletions geopyspark/tests/catalog_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,12 @@ def test_query(self):

self.assertDictEqual(queried.to_numpy_rdd().first()[0], {'col': 1450, 'row': 996})

def test_query_crs(self):
intersection = box(8348915.46680623, 543988.943201519, 8348915.4669, 543988.943201520)
queried = query(BaseTestClass.geopysc, SPATIAL, self.uri, self.layer_name, 11, intersection,
proj_query=3857)

self.assertDictEqual(queried.to_numpy_rdd().first()[0], {'col': 1450, 'row': 996})

if __name__ == "__main__":
unittest.main()

0 comments on commit 53e44db

Please sign in to comment.