Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Using GeoScript
Groovy
Jared Erickson	

CUGOS February 2014
What is GeoScript?
• Geospatial Swiss Army Knife	

• One scripting API Many Languages
What is Groovy?
• Yes, there is a language called Groovy 	

• Dynamic JVM Language	

• Strong Java Integration	

• Closures, MetaProgramming, Scripting
Uses
• Scripts	

• Shell	

• Console	

• GeoServer	

• uDig	

• Apps (GeoScript as a Library)
How do I install it?

• Install Java	

• Install Groovy	

• Download GeoScript Groovy and put the
bin directory on your path	


• https://github.com/jericks/geoscript-groovy/
releases
How do I learn it?

http://geoscript.org
http://geoscript.org/groovy/api/
Command line tools
geoscript-groovy = run scripts	

geoscript-groovysh = interactive shell	

geoscript-groovyConsole = mini ide	

!
Inline Scripts 	

(geoscript-groovy)

geoscript-groovy -e "println new
geoscript.layer.Shapefile('states.shp').toJSONString()" |
mapfart	

!

geoscript-groovy -e "println new
geoscript.layer.Shapefile('states.shp').bounds.geometry"	

!

geoscript-groovy -e "println new
geoscript.layer.Shapefile('states.shp').count"
Inline Scripts	

(geoscript-groovy)

geoscript-groovy -e "geoscript.render.Draw.draw(new
geoscript.layer.Shapefile('states.shp'), out: 'image.png')"	

!

geoscript-groovy -e "new
geoscript.layer.Shapefile('states.shp').eachFeature{ println
it.geom.centroid}" | geom combine | geom buffer -d 1.5	

!

echo "POINT (1 1)" | geom buffer -d 10 | geoscriptgroovy -e "println
geoscript.geom.Geometry.fromWKT(System.in.text).kml"
Inline Scripts	

(geoscript-groovy)

• One liners	

• Interact with other command line tools	

• geom, mapfart, ogr, ect…	

• Read Standard Input (System.in.text)	

• Write to Standard Output (println)
Scripts	


web.groovy

(geoscript-groovy)

1 import com.sun.grizzly.http.embed.GrizzlyWebServer!
2 import com.sun.grizzly.http.servlet.ServletAdapter!
3 !
4 @Grab(group='com.sun.grizzly', module='grizzly-servlet-webserver',
version='1.9.10')!
5 def start() {!
6
println("Starting web server...")!
7
def server = new GrizzlyWebServer(8080, "web")!
8
def servlet = new ServletAdapter()!
9
servlet.contextPath = "/geoscript"!
10
servlet.servletInstance = new groovy.servlet.GroovyServlet()!
11
server.addGrizzlyAdapter(servlet, ["/geoscript"] as String[])!
12
server.start()!
13 }!
14 start()
Scripts	


(geoscript-groovy)

web/buffer.groovy
1
2
3
4
5

import geoscript.geom.*!
!
def geom = Geometry.fromWKT(request.getParameter("geom"))!
def distance = request.getParameter("d") as double!
println(geom.buffer(distance).wkt)

web/draw.groovy
1
2
3
4
5
6
7

import geoscript.geom.*!
import geoscript.viewer.Viewer!
!
def geom = Geometry.fromWKT(request.getParameter("geom"))!
def image = Viewer.drawToImage(geom, size: [400, 400])!
response.contentType = "image/png"!
javax.imageio.ImageIO.write(image, "png", response.outputStream)
Scripts	

(groovy)

1
2
3
4
5
6
7

@GrabResolver(name="opengeo", root="http://repo.opengeo.org")!
@Grab("org.geoscript:geoscript-groovy:1.1")!
import geoscript.geom.Point!
!
p = new Point(1,1)!
println p.geoJSON!

• Use GeoScript without installing GeoScript	

• Just need Java and Groovy	

• @GrabResolver and @Grab can download
dependencies
Scripts	


(geoscript-groovy)

• Larger multiline scripts	

• Good for complex processing	

• Record your workflow	

• Can create command line tools, web
services, or desktop apps	


• Use @Grab to get dependencies
Shell	


(geoscript-groovysh)
Groovy Shell (2.1.9, JVM: 1.7.0_45)	

Type 'help' or 'h' for help.	

-------------------------------------------------------------------------------	

groovy:000> import geoscript.workspace.PostGIS	

===> [import geoscript.workspace.PostGIS]	

groovy:000> postgis = new PostGIS("states",user: "jericks")	

===> geoscript.workspace.PostGIS@7840df80	

groovy:000> postgis.layers	

===> [states]	

groovy:000> states = postgis.get("states")	

===> states	

groovy:000> states.bounds	

===> (-124.731422,24.955967,-66.969849,49.371735,EPSG:4326)	

groovy:000> states.count	

===> 49	

groovy:000> states.eachFeature{ println it.geom.centroid }	

POINT (-89.20368628698026 40.06397152717181)	

POINT (-77.01592888814594 38.90248929357207)	

POINT (-75.50090936853277 38.994999876971384)	

POINT (-80.61424804312078 38.64111336139042)
Shell	


(geoscript-groovysh)
groovy:000> states.schema.fields	

===> [the_geom: MultiPolygon(EPSG:4326), STATE_NAME: String, STATE_FIPS: String,
SUB_REGION: String, STATE_ABBR: String, LAND_KM: Double, WATER_KM: Double, PERSONS:
Double, FAMILIES: Double, HOUSHOLD: Double, MALE: Double, FEMALE: Double, WORKERS:
Double, DRVALONE: Double, CARPOOL: Double, PUBTRANS: Double, EMPLOYED: Double,
UNEMPLOY: Double, SERVICE: Double, MANUAL: Double, P_MALE: Double, P_FEMALE: Double,
SAMP_POP: Double]	

groovy:000> state_centroids = states.transform("state_centroids", [the_geom:
"centroid(the_geom)", name: "STATE_NAME", abbreviation: "STATE_ABBR"])	

===> state_centroids	

groovy:000> state_centroids.count	

===> 49	

groovy:000> postgis	

===> geoscript.workspace.PostGIS@7840df80	

groovy:000> postgis.add(state_centroids)	

===> state_centroids	

groovy:000> postgis.names	

===> [state_centroids, states]	

groovy:000> postgis["state_centroids"].schema	

===> state_centroids the_geom: Point(EPSG:4326), name: String, abbreviation: String
Shell	


(geoscript-groovysh)

• Good for trying things out	

• Interact and explore all things geospatial
Console	


(geoscript-groovyConsole)
Console 	


(geoscript-groovyConsole)
Console 	


geoscript-groovyConsole
Console
• Good for longer scripts (but not too long)	

• Excellent preview (View -> Visualize Script
Results)	


• Use it when rendering images, maps,
geometries
uDig
uDig
•
•
•

Done by Andrea Antonello and the UDig crew	


•

http://prezi.com/wyopic4sinhg/geographic-scripting-inudig-user-friendly-desktop-internet-gis/	


Part of the Spatial Toolbox	

http://udig.github.io/docs/user/getting_started/GeoScript
%20Introduction.html	


• http://www.slideshare.net/moovida/04-geographic-

scripting-in-udig-halfway-between-user-and-developer
GeoServer
• Web services	

• Web Processing Services (WPS)	

• Filter Functions (used in SLDs for styling your maps)	

• Download groovy plugin from http://
ares.opengeo.org/geoserver/2.4.x/community-latest/	


• Extract jars to geoserver/WEB-INF/lib 	

• http://www.slideshare.net/JaredErickson/scriptinggeoserver
GeoServer
$DATA_DIR/scripts/wps/buffer.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

import geoscript.geom.Geometry!
!
title = 'Buffer'!
description = 'Buffers a geometry'!
!
inputs = [!
geom: [name: 'geom', title: 'The geometry to buffer', type: Geometry.class],!
distance: [name: 'distance', title: 'The buffer distance', type: Double.class]!
]!
!
outputs = [!
result: [name: 'result', title: 'The buffered geometry', type: Geometry.class]!
]!
!
def run(input) {!
[result: input.geom.buffer(input.distance as double)]!
}!
GeoServer
As a library
Geoscript is just another jar
<repositories>!
<repository>!
<id>opengeo</id>!
<name>OpenGeo Maven Repository</name>!
<url>http://repo.opengeo.org</url>!
<snapshots>!
<enabled>true</enabled>!
</snapshots>!
</repository>!
</repositories>
<dependency>!
<groupId>org.geoscript</groupId>!
<artifactId>geoscript-groovy</artifactId>!
<version>1.2</version>!
</dependency>
Gradle - App
$ mkdir geo-gradle	

$ cd geo-gradle/	

$ touch build.gradle	

$ vi build.gradle	

$ mkdir -p src/main/groovy/org/jce/geo	

$ touch src/main/groovy/org/jce/geo/App.groovy	

$ vi src/main/groovy/org/jce/geo/App.groovy	

$ gradle build
Gradle - build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

apply plugin: "groovy"!
apply plugin: "application"!
!
version = 0.1!
mainClassName = "org.jce.geo.App"!
!
repositories {!
maven {!
url "http://repo.opengeo.org"!
}!
maven {!
url "http://download.osgeo.org/webdav/geotools/"!
}!
mavenCentral()!
}!
!
dependencies {!
compile "org.codehaus.groovy:groovy-all:2.1.9"!
compile "org.geoscript:geoscript-groovy:1.2"!
}
Gradle - Code
src/main/groovy/org/jce/geo/App.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14

package org.jce.geo!
!
import geoscript.geom.Geometry!
import geoscript.proj.Projection!
!
class App {!
static void main(String[] args) {!
Geometry geom = Geometry.fromString(args[0])!
Projection fromProj = new Projection(args[1])!
Projection toProj = new Projection(args[2])!
Geometry transformedGeom = fromProj.transform(geom, toProj)!
println transformedGeom.wkt!
}!
}
Using GeoScript Groovy
Functionality

• Geometry	

• Projection	

• Layer	

• Raster	

• Style	

• Render	


Usages

• Scripts	

• Shell	

• Console	

• GeoServer	

• uDig	

• Apps
Thank you!

More Related Content

Using Geoscript Groovy

  • 2. What is GeoScript? • Geospatial Swiss Army Knife • One scripting API Many Languages
  • 3. What is Groovy? • Yes, there is a language called Groovy • Dynamic JVM Language • Strong Java Integration • Closures, MetaProgramming, Scripting
  • 4. Uses • Scripts • Shell • Console • GeoServer • uDig • Apps (GeoScript as a Library)
  • 5. How do I install it? • Install Java • Install Groovy • Download GeoScript Groovy and put the bin directory on your path • https://github.com/jericks/geoscript-groovy/ releases
  • 6. How do I learn it? http://geoscript.org http://geoscript.org/groovy/api/
  • 7. Command line tools geoscript-groovy = run scripts geoscript-groovysh = interactive shell geoscript-groovyConsole = mini ide !
  • 8. Inline Scripts (geoscript-groovy) geoscript-groovy -e "println new geoscript.layer.Shapefile('states.shp').toJSONString()" | mapfart ! geoscript-groovy -e "println new geoscript.layer.Shapefile('states.shp').bounds.geometry" ! geoscript-groovy -e "println new geoscript.layer.Shapefile('states.shp').count"
  • 9. Inline Scripts (geoscript-groovy) geoscript-groovy -e "geoscript.render.Draw.draw(new geoscript.layer.Shapefile('states.shp'), out: 'image.png')" ! geoscript-groovy -e "new geoscript.layer.Shapefile('states.shp').eachFeature{ println it.geom.centroid}" | geom combine | geom buffer -d 1.5 ! echo "POINT (1 1)" | geom buffer -d 10 | geoscriptgroovy -e "println geoscript.geom.Geometry.fromWKT(System.in.text).kml"
  • 10. Inline Scripts (geoscript-groovy) • One liners • Interact with other command line tools • geom, mapfart, ogr, ect… • Read Standard Input (System.in.text) • Write to Standard Output (println)
  • 11. Scripts web.groovy (geoscript-groovy) 1 import com.sun.grizzly.http.embed.GrizzlyWebServer! 2 import com.sun.grizzly.http.servlet.ServletAdapter! 3 ! 4 @Grab(group='com.sun.grizzly', module='grizzly-servlet-webserver', version='1.9.10')! 5 def start() {! 6 println("Starting web server...")! 7 def server = new GrizzlyWebServer(8080, "web")! 8 def servlet = new ServletAdapter()! 9 servlet.contextPath = "/geoscript"! 10 servlet.servletInstance = new groovy.servlet.GroovyServlet()! 11 server.addGrizzlyAdapter(servlet, ["/geoscript"] as String[])! 12 server.start()! 13 }! 14 start()
  • 12. Scripts (geoscript-groovy) web/buffer.groovy 1 2 3 4 5 import geoscript.geom.*! ! def geom = Geometry.fromWKT(request.getParameter("geom"))! def distance = request.getParameter("d") as double! println(geom.buffer(distance).wkt) web/draw.groovy 1 2 3 4 5 6 7 import geoscript.geom.*! import geoscript.viewer.Viewer! ! def geom = Geometry.fromWKT(request.getParameter("geom"))! def image = Viewer.drawToImage(geom, size: [400, 400])! response.contentType = "image/png"! javax.imageio.ImageIO.write(image, "png", response.outputStream)
  • 13. Scripts (groovy) 1 2 3 4 5 6 7 @GrabResolver(name="opengeo", root="http://repo.opengeo.org")! @Grab("org.geoscript:geoscript-groovy:1.1")! import geoscript.geom.Point! ! p = new Point(1,1)! println p.geoJSON! • Use GeoScript without installing GeoScript • Just need Java and Groovy • @GrabResolver and @Grab can download dependencies
  • 14. Scripts (geoscript-groovy) • Larger multiline scripts • Good for complex processing • Record your workflow • Can create command line tools, web services, or desktop apps • Use @Grab to get dependencies
  • 15. Shell (geoscript-groovysh) Groovy Shell (2.1.9, JVM: 1.7.0_45) Type 'help' or 'h' for help. ------------------------------------------------------------------------------- groovy:000> import geoscript.workspace.PostGIS ===> [import geoscript.workspace.PostGIS] groovy:000> postgis = new PostGIS("states",user: "jericks") ===> geoscript.workspace.PostGIS@7840df80 groovy:000> postgis.layers ===> [states] groovy:000> states = postgis.get("states") ===> states groovy:000> states.bounds ===> (-124.731422,24.955967,-66.969849,49.371735,EPSG:4326) groovy:000> states.count ===> 49 groovy:000> states.eachFeature{ println it.geom.centroid } POINT (-89.20368628698026 40.06397152717181) POINT (-77.01592888814594 38.90248929357207) POINT (-75.50090936853277 38.994999876971384) POINT (-80.61424804312078 38.64111336139042)
  • 16. Shell (geoscript-groovysh) groovy:000> states.schema.fields ===> [the_geom: MultiPolygon(EPSG:4326), STATE_NAME: String, STATE_FIPS: String, SUB_REGION: String, STATE_ABBR: String, LAND_KM: Double, WATER_KM: Double, PERSONS: Double, FAMILIES: Double, HOUSHOLD: Double, MALE: Double, FEMALE: Double, WORKERS: Double, DRVALONE: Double, CARPOOL: Double, PUBTRANS: Double, EMPLOYED: Double, UNEMPLOY: Double, SERVICE: Double, MANUAL: Double, P_MALE: Double, P_FEMALE: Double, SAMP_POP: Double] groovy:000> state_centroids = states.transform("state_centroids", [the_geom: "centroid(the_geom)", name: "STATE_NAME", abbreviation: "STATE_ABBR"]) ===> state_centroids groovy:000> state_centroids.count ===> 49 groovy:000> postgis ===> geoscript.workspace.PostGIS@7840df80 groovy:000> postgis.add(state_centroids) ===> state_centroids groovy:000> postgis.names ===> [state_centroids, states] groovy:000> postgis["state_centroids"].schema ===> state_centroids the_geom: Point(EPSG:4326), name: String, abbreviation: String
  • 17. Shell (geoscript-groovysh) • Good for trying things out • Interact and explore all things geospatial
  • 21. Console • Good for longer scripts (but not too long) • Excellent preview (View -> Visualize Script Results) • Use it when rendering images, maps, geometries
  • 22. uDig
  • 23. uDig • • • Done by Andrea Antonello and the UDig crew • http://prezi.com/wyopic4sinhg/geographic-scripting-inudig-user-friendly-desktop-internet-gis/ Part of the Spatial Toolbox http://udig.github.io/docs/user/getting_started/GeoScript %20Introduction.html • http://www.slideshare.net/moovida/04-geographic- scripting-in-udig-halfway-between-user-and-developer
  • 24. GeoServer • Web services • Web Processing Services (WPS) • Filter Functions (used in SLDs for styling your maps) • Download groovy plugin from http:// ares.opengeo.org/geoserver/2.4.x/community-latest/ • Extract jars to geoserver/WEB-INF/lib • http://www.slideshare.net/JaredErickson/scriptinggeoserver
  • 25. GeoServer $DATA_DIR/scripts/wps/buffer.groovy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import geoscript.geom.Geometry! ! title = 'Buffer'! description = 'Buffers a geometry'! ! inputs = [! geom: [name: 'geom', title: 'The geometry to buffer', type: Geometry.class],! distance: [name: 'distance', title: 'The buffer distance', type: Double.class]! ]! ! outputs = [! result: [name: 'result', title: 'The buffered geometry', type: Geometry.class]! ]! ! def run(input) {! [result: input.geom.buffer(input.distance as double)]! }!
  • 27. As a library Geoscript is just another jar <repositories>! <repository>! <id>opengeo</id>! <name>OpenGeo Maven Repository</name>! <url>http://repo.opengeo.org</url>! <snapshots>! <enabled>true</enabled>! </snapshots>! </repository>! </repositories> <dependency>! <groupId>org.geoscript</groupId>! <artifactId>geoscript-groovy</artifactId>! <version>1.2</version>! </dependency>
  • 28. Gradle - App $ mkdir geo-gradle $ cd geo-gradle/ $ touch build.gradle $ vi build.gradle $ mkdir -p src/main/groovy/org/jce/geo $ touch src/main/groovy/org/jce/geo/App.groovy $ vi src/main/groovy/org/jce/geo/App.groovy $ gradle build
  • 29. Gradle - build.gradle 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 apply plugin: "groovy"! apply plugin: "application"! ! version = 0.1! mainClassName = "org.jce.geo.App"! ! repositories {! maven {! url "http://repo.opengeo.org"! }! maven {! url "http://download.osgeo.org/webdav/geotools/"! }! mavenCentral()! }! ! dependencies {! compile "org.codehaus.groovy:groovy-all:2.1.9"! compile "org.geoscript:geoscript-groovy:1.2"! }
  • 30. Gradle - Code src/main/groovy/org/jce/geo/App.groovy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 package org.jce.geo! ! import geoscript.geom.Geometry! import geoscript.proj.Projection! ! class App {! static void main(String[] args) {! Geometry geom = Geometry.fromString(args[0])! Projection fromProj = new Projection(args[1])! Projection toProj = new Projection(args[2])! Geometry transformedGeom = fromProj.transform(geom, toProj)! println transformedGeom.wkt! }! }
  • 31. Using GeoScript Groovy Functionality • Geometry • Projection • Layer • Raster • Style • Render Usages • Scripts • Shell • Console • GeoServer • uDig • Apps