SlideShare ist ein Scribd-Unternehmen logo
1 von 104
Status of GeoTools
2



About your Presenters
Andrea Aime                   Jody Garnett
(PMC)                         (PMC)




GeoSolutions                  LISAsoft
 GeoServer/GeoTools core       A great system integration
 developers, raster data       company helping our
 management, map rendering,    customers make effective use
 spatial data processing       of open source spatial.
2



About your Presenters
Andrea Aime                   Jody Garnett
(PMC)                         (PMC)




GeoSolutions                  LISAsoft
 GeoServer/GeoTools core       A great system integration
 developers, raster data       company helping our
 management, map rendering,    customers make effective use
 spatial data processing       of open source spatial.
3



About your Presenters
Justin Deolivera                 Jody Garnett
(PMC)                            (PMC)




OpenGeo                          LISAsoft
 Bringing the best open source    A great system integration
 geospatial software to           company helping our
 organisations around the         customers make effective use
 world.                           of open source spatial.
4



GeoTools - the Java GIS Toolkit
5



Development Community
261 Andrea Aime (GeoServer, JAITools) - GeoSolutions
261   Jody Garnett (GeoTools, uDig) - Lisasoft
167   Simone Giannecchini (GeoServer, JAITools) - GeoSolutions
123   Justin Deoliveira (GeoServer, GeoScript) - OpenGeo
114   Michael Bedward (JAITools) - Australia
 66 danieleromagnoli (GeoServer) - GeoSolutions
 54 bencaradocdavies - CSIRO
 51 NielsCharlier - CSIRO
 38 sbrunner ?                                2010 Stats tracking commits
 32 moovida (uDig, JGrass) - Hydrologis
 28 ang05a - CSIRO
 25 groldan - (GeoServer) - OpenGeo
 17 mpazos - Axios
                                              30 committers
 15 victortey - CSIRO
 13 mcr - ?
                                              10 organisations
  9 kengu - Norwegian Uni of Tech & Science
  8 ischneider - OpenGeo
  7 ianturton - University of Leeds           Healthy project with a broad base of support
  7 jesseeichar - CampToCamp
  7 lmoran - Consultant                       actively improving GeoTools
  6 afabiani - GeoSolutions
  6 rbraam - ?
  4 xiangtanlin - ?
  3 LeeBreisacher - ?
  3 lendholt - ?
  2 alfonx (AtlasStyler) - WikiSquare
  2 pieterdg - ?
  2 tdipisa - GeoSolutions
  1 atrofast - Ingres
  1 mleslie - Lisasoft
6



Stats




                                                  geotools-devel:
                                                    386 members total

                                                  geotools-gt2-users:
                                                    889 members total

Created vs resolved tickets (click here for update )
Strategic Direction
8



GeoTools 8
What is in a Name?
- sed/GeoTools 2.8.0/GeoTools 8.0/

What does this mean?
- not very much - business as usual
- confidence in our community
   - continue our commitment to stability
   - evolution handled with continuous small changes
Documentation

(what I did last summer)
10



User Guide - Before
11



User Guide - After
11



User Guide - After
12



    Code Examples - Before (Wiki)
private synchronized static FeatureSource
buildMemoryFeatureSource(FeatureCollection coll, String typename,
FeatureType currentFeatureType, AttributeType newTypes[]){

 FeatureType ftState=null;
 MemoryDataStore MStore=null;
 try {
             MStore = new MemoryDataStore();
             //---- current attributes
       AttributeType currentTypes[] = currentFeatureType.getAttributeTypes();

        //---- new array of attributes = current array+ new attributes
                                                                                Compile?
        AttributeType typesNew[] = new                                          What Version?
AttributeType[currentTypes.length+newTypes.length];
                                                                                When?
       for(int i=0;i<currentTypes.length;i++){
          typesNew[i] = currentTypes[i];
       }
       for(int i=0;i<newTypes.length;i++){
                                                                                All very good
       }
          typesNew[currentTypes.length+i] = newTypes[i];                        questions with no clear
                                                                                answer.
       ftState = FeatureTypeFactory.newFeatureType(typesNew, typename);
       MStore.createSchema(ftState);

       Iterator iterator = coll.iterator();
       FeatureCollection newColl = FeatureCollections.newCollection();
       Feature feature, newFeature;
       Object[] objs;
             try {
             for( int count=0; iterator.hasNext(); count++) {
               feature = (Feature) iterator.next();
13



    Code Examples - After (Sphinx)
private synchronized static FeatureSource
buildMemoryFeatureSource(FeatureCollection coll, String typename,
FeatureType currentFeatureType, AttributeType newTypes[]){

 FeatureType ftState=null;
 MemoryDataStore MStore=null;
 try {
             MStore = new MemoryDataStore();
             //---- current attributes
       AttributeType currentTypes[] = currentFeatureType.getAttributeTypes();

        //---- new array of attributes = current array+ new attributes
        AttributeType typesNew[] = new
                                                                                Pulled Live from
AttributeType[currentTypes.length+newTypes.length];                             Source!
       for(int i=0;i<currentTypes.length;i++){
          typesNew[i] = currentTypes[i];
       }                                                                        GeoTools Version at
       for(int i=0;i<newTypes.length;i++){
          typesNew[currentTypes.length+i] = newTypes[i];
                                                                                the Top of the Page!
       }

       ftState = FeatureTypeFactory.newFeatureType(typesNew, typename);
       MStore.createSchema(ftState);

       Iterator iterator = coll.iterator();
       FeatureCollection newColl = FeatureCollections.newCollection();
       Feature feature, newFeature;
       Object[] objs;
             try {
             for( int count=0; iterator.hasNext(); count++) {
               feature = (Feature) iterator.next();
13



   Code Examples - After (Sphinx)
SimpleFeatureSource alter(SimpleFeatureCollection collection, String typename,
        SimpleFeatureType featureType, final List<AttributeDescriptor> newTypes) {
    
    try {
        
        // Create target schema
        SimpleFeatureTypeBuilder buildType = new SimpleFeatureTypeBuilder();
        buildType.init(featureType);
        buildType.setName(typename);
        buildType.addAll(newTypes);
        
        final SimpleFeatureType schema = buildType.buildFeatureType();
        // Configure memory datastore
        final MemoryDataStore memory = new MemoryDataStore();
                                                                                 Pulled Live from
        memory.createSchema(schema);
        
                                                                                 Source!
        collection.accepts(new FeatureVisitor() {
            public void visit(Feature feature) {
                SimpleFeatureBuilder builder = new SimpleFeatureBuilder(schema);
                
                                                                                 GeoTools Version at
                builder.init((SimpleFeature) feature);                           the Top of the Page!
                for (AttributeDescriptor descriptor : newTypes) {
                    builder.add(DataUtilities.defaultValue(descriptor));
                }
                
                SimpleFeature newFeature = builder.buildFeature(feature.getIdentifier().getID());
                memory.addFeature(newFeature);
            }
        }, null);
        
        return memory.getFeatureSource(typename);
        
    } catch (Exception e) {
        e.printStackTrace();
    }
14



Code Examples - Example



                      Used for both Java
                      code examples and
                      also configuration files
                      such as maven
                      pom.xml.
15



Diagrams - Before (Visio)
16



Diagrams - After (Inkscape)
17



Class Diagrams - Before
18



Class Diagrams - After (Object Aid)
Tutorials - Before
Tutorials - After
Advanced Tutorials

Function
  Finally a nice quick guide to how to create a function!

AbstractDataStore Tutorial - Property DataStore
  The classic updated for GeoTools 8.

ContentDataStore Tutorial - CSVDataStore
  The new kid on the block; leaner; meaner and ready.

Welcome
  Introduction for different developer communities.

Update
  Have not used GeoTools in a while? Guide to updating.
22



Welcome Geomajas
23



Welcome GeoServer
24



Welcome uDig
25



Documentation Highlights
Details
- 291 “Pages”
- longest page is 36 pages printed out on paper
- Over 100,000 words
- Written from Feb through to May
- Accounts for every page of the wiki

New features
- Extensive FAQ
- whole project javadocs
- module by module reference
- plugins organised by module
Referencing

(do you know where your data is?)
27



Referencing
• Ellipsoids, datum, map projections
• Embedded EPSG database, over 5000 supported codes
  (gt-epsg-hsql module)
• Reprojection utilities
Geometry g = ...;
CoordinateReferenceSystem wgs84 = CRS.decode("EPSG:4326");              
                                                                        
CoordinateReferenceSystem utm32n = CRS.decode("EPSG:32632");
Geometry gtx = JTS.transform(g);
...
SimpleFetureCollection fc = featureSource.getFeature();
SimpleFeatureCollection fcTx = 
                new ReprojectingFeatureCollection(fc, utm32n);
28



Projections
Old projections          New Projections

 Aitoff
 Albers Equal A.
                                               Mollweide
 CassiniSoldner
 Cylindrical Equidist.      Robinson
 Krovak
 Lambert Conf.
 Mercator
 Oblique Mercator                               Eckert IV

 Orthogonal
 Polyconic
                             Winkel Tripel
 Stereographic
 Transverse Mercator
                                             Equidistant conic
Vector Plugins
Both direction and magnitude!
30



    Vector Data Sources
•   Application schema*        • JDBC
•   ArcSDE                        o DB2
•   Aggregating *                 o H2 spatial
•   CouchDb *                     o MySQL
•   CSV *                         o Postgis
•   DXF *                         o Oracle
•   Excel                         o SQL Server
•   Edigeo                        o Spatialite *
•   PreGeneralized                o Teradata *
•   SimpleFeatureService *
•   Shapefile (directory of)
•   WFS

                name* = new entry
                name = “unsupported”
31



JDBC DataStore "NG"
• JDBC stores:
  – common base
  – over 200 ready to use tests,
    just prepare the test data and
    run
  – Parametric SQL views: define
    a new data source as a raw
    query
    select ST_Union(the_geom) as geom
    from countries
    where REGION = %region%
  – Extensions for native joins
32



Application schema
 – Complex feature support
 – Recent development by CSIRO
 – Feature chaining, polymorphism
 – Better performance (native DBMS joins), memory use
 – Usable as vector data source, GML encoding,
   rendering
Raster Formats

   pixel power
34



    Raster Data Sources
•   ArcGrid                        • imageio-ext based
•   ArcSDE                            o AIG
•   GeoTiff                           o DTED
•   GRASS *                           o ECW
•   GTopo30                           o EnviHdr
•   Image Mosaic                      o ErdasImg
•   Image Mosaic JDBC *               o EsriHdr
•   Image Pyramid                     o JP2 (ECW, MrSid)
•   Image + World file                o MrSID
•   JP2 direct Kakadu                 o NITF*
•   Matlab                            o RPFTOC
•   Non georef. Image collection *

               name * = new entry
               name = unsupported land
35



Non geo-referenced data
36



Image mosaic
Rendering

Gotta see it to believe it
38



Rendering
38



Rendering
39



 Layers
• FeatureLayer:
  any vector + Style
  (shapefile, spatial db, WFS, ...)

• GridCoverageLayer:
  in memory raster grid

• GridReaderLayer:
  dynamic raster read from disk
  (leverage overviews and tiling)

• WMSLayer:
  get maps from a WMS server

• DirectLayer: (new feature!)
  roll your own custom paint method
40



StyleBuilder
• Style API is inspired by SLD 1.0 and SE 1.1:
  – a style is a complex, deep object graph
• StyleBuilder provides a set of hierarchical
  builders
• Build a style easily, just pick the portion you need

Style style = new StrokeBuilder().color(Color.BLUE)
         .width(3).dashArray(5, 2)
         .buildStyle();
40



StyleBuilder
• Style API is inspired by SLD 1.0 and SE 1.1:
  – a style is a complex, deep object graph
• StyleBuilder provides a set of hierarchical
  builders
• Build a style easily, just pick the portion you need

Style style = new StrokeBuilder().color(Color.BLUE)
         .width(3).dashArray(5, 2)
         .buildStyle();
41



StyleBuilder
• StyleBuilder allows you to freely mix CQL
  expressions
• Provides “literate” methods allowing you to
  define your style using your IDE autocomplete

fts = new FeatureTypeStyleBuilder();
fts.rule().filter("pop < 200000")
   .polygon().fill().colorHex("#66FF66");
fts.rule().filter("pop between 200000 and 500000")
   .polygon().fill().colorHex("#33CC33");
fts.rule().filter("pop > 500000")
   .polygon().fill().colorHex("#009900");
Style style = fts.buildStyle();
41



StyleBuilder
• StyleBuilder allows you to freely mix CQL
  expressions
• Provides “literate” methods allowing you to
  define your style using your IDE autocomplete

fts = new FeatureTypeStyleBuilder();
fts.rule().filter("pop < 200000")
   .polygon().fill().colorHex("#66FF66");
fts.rule().filter("pop between 200000 and 500000")
   .polygon().fill().colorHex("#33CC33");
fts.rule().filter("pop > 500000")
   .polygon().fill().colorHex("#009900");
Style style = fts.buildStyle();
42



Showing the Map Part 1
• To start we get the data and create a Style

FileDataStore store = FileDataStoreFinder.getDataStore(file);
SimpleFeatureSource featureSource = store.getFeatureSource();

Style style = SLD.createSimpleStyle(featureSource.getSchema());
43



Showing the Map Part 2
• Create Map and use JMapFrame to display
MapContent map = new MapContent();
map.setTitle("Quickstart");
Layer layer = new FeatureLayer(featureSource, style);
map.addLayer(layer);

JMapFrame.showMap(map);
43



Showing the Map Part 2
• Create Map and use JMapFrame to display
MapContent map = new MapContent();
map.setTitle("Quickstart");
Layer layer = new FeatureLayer(featureSource, style);
map.addLayer(layer);

JMapFrame.showMap(map);
44



Pluggable Mark Factory TTF
<Mark>
 <WellKnownName>ttf://Wingdings#0xF054</WellKnownName>
 <Fill>
   <CssParameter name="fill">#000088</CssParameter>
 </Fill>
</Mark>
44



Pluggable Mark Factory TTF
<Mark>
 <WellKnownName>ttf://Wingdings#0xF054</WellKnownName>
 <Fill>
   <CssParameter name="fill">#000088</CssParameter>
 </Fill>
</Mark>
45



Pluggable Mark Factory Slash
<Fill>
  <GraphicFill>
  <Graphic>
    <Mark>
      <WellKnownName>shape://slash</WellKnownName>
      <Stroke>
        <CssParameter name="stroke">0xAAAAAA</CssParameter>
      </Stroke>
    </Mark>
    <Size>16</Size>
  </Graphic>
</GraphicFill>
</Fill>     
45



Pluggable Mark Factory Slash
<Fill>
  <GraphicFill>
  <Graphic>
    <Mark>
      <WellKnownName>shape://slash</WellKnownName>
      <Stroke>
        <CssParameter name="stroke">0xAAAAAA</CssParameter>
      </Stroke>
    </Mark>
    <Size>16</Size>
  </Graphic>
</GraphicFill>
</Fill>     
46



  Pluggable Mark Factories Interface
public interface MarkFactory {
    public java.awt.Shape getShape(
            Graphics2D graphics,
            Expression symbolUrl,
            Feature feature) throws Exception;
}




                            org.geotools.renderer.style.WellKnownMarkFactory
                            org.geotools.renderer.style.TTFMarkFactory
                            org.geotools.renderer.style.ShapeMarkFactory




http://docs.geotools.org/latest/userguide/library/render/icon.html
47



   Geometry transform Arrow Head
Similar to SE 1.1 transformations, but open-ended, pluggable, add your own
transformation today!
<PointSymbolizer>
  <Geometry>
     <ogc:Function name="endPoint">         
       <ogc:PropertyName>the_geom</ogc:PropertyName>
     </ogc:Function>
  </Geometry>
  <Graphic>
    <Mark>
      <WellKnownName>shape://arrow</WellKnownName>
      <Fill/>
      <Stroke/>
    </Mark>
    <Rotation>
      <ogc:Function name="endAngle">
         <ogc:PropertyName>the_geom</ogc:PropertyName>
      </ogc:Function>
    </Rotation>
  </Graphic>
</PointSymbolizer>
47



   Geometry transform Arrow Head
Similar to SE 1.1 transformations, but open-ended, pluggable, add your own
transformation today!
<PointSymbolizer>
  <Geometry>
     <ogc:Function name="endPoint">         
       <ogc:PropertyName>the_geom</ogc:PropertyName>
     </ogc:Function>
  </Geometry>
  <Graphic>
    <Mark>
      <WellKnownName>shape://arrow</WellKnownName>
      <Fill/>
      <Stroke/>
    </Mark>
    <Rotation>
      <ogc:Function name="endAngle">
         <ogc:PropertyName>the_geom</ogc:PropertyName>
      </ogc:Function>
    </Rotation>
  </Graphic>
</PointSymbolizer>
48



Geometry transform Drop Shadow
<Geometry>
  <ogc:Function name="offset">   
    <ogc:PropertyName>the_geom</ogc:PropertyName>
    <ogc:Literal>0.00004</ogc:Literal> 
    <ogc:Literal>‐0.00004</ogc:Literal> 
 </ogc:Function> 
<Geometry>
48



Geometry transform Drop Shadow
<Geometry>
  <ogc:Function name="offset">   
    <ogc:PropertyName>the_geom</ogc:PropertyName>
    <ogc:Literal>0.00004</ogc:Literal> 
    <ogc:Literal>‐0.00004</ogc:Literal> 
 </ogc:Function> 
<Geometry>
Geometry transform Implementation
 Based on functions, a pluggable extension point
public class FilterFunction_offset extends FunctionExpressionImpl
                                   implements GeometryTransformation {
...
public Object evaluate(Object feature) {
        Geometry geom = getExpression(0).evaluate(feature, Geometry.class);
        Double offsetX = getExpression(1).evaluate(feature, Double.class);
        if(offsetX == null) offsetX = 0d;
        Double offsetY = getExpression(2).evaluate(feature, Double.class);
        if(offsetY == null) offsetY = 0d;

        if (geom != null) {
            Geometry offseted = (Geometry) geom.clone();
            offseted.apply(
               new OffsetOrdinateFilter(offsetX, offsetY));
            return offseted;
        } else {
            return null;
        }
    }
...
}
Geometry transform Implementation
 Based on functions, a pluggable extension point
public class FilterFunction_offset extends FunctionExpressionImpl
                                   implements GeometryTransformation {
...
public Object evaluate(Object feature) {
        Geometry geom = getExpression(0).evaluate(feature, Geometry.class);
        Double offsetX = getExpression(1).evaluate(feature, Double.class);
        if(offsetX == null) offsetX = 0d;
        Double offsetY = getExpression(2).evaluate(feature, Double.class);
        if(offsetY == null) offsetY = 0d;

        if (geom != null) {
            Geometry offseted = (Geometry) geom.clone();
            offseted.apply(
               new OffsetOrdinateFilter(offsetX, offsetY));
            return offseted;
        } else {
            return null;
        }
    }
...
}
50



 Rendering Transform Wind Map
<FeatureTypeStyle> 
   <Transformation> 
    <ogc:Function name="gs:RasterAsPointCollection"> 
      <ogc:Function name="parameter">    
         <ogc:Literal>data</ogc:Literal>                u   v
      </ogc:Function> 
    </ogc:Function> 
</Transformation> ...




Transform data before rendering. Contour extraction, wind
maps, geometry clustering. Pluggable, add your function!
50



 Rendering Transform Wind Map
<FeatureTypeStyle> 
   <Transformation> 
    <ogc:Function name="gs:RasterAsPointCollection"> 
      <ogc:Function name="parameter">    
         <ogc:Literal>data</ogc:Literal>                u   v
      </ogc:Function> 
    </ogc:Function> 
</Transformation> ...




Transform data before rendering. Contour extraction, wind
maps, geometry clustering. Pluggable, add your function!
Rendering Transform Contour Extract
<FeatureTypeStyle> 
  <Transformation> 
    <ogc:Function name="gs:Contour"> 
      <ogc:Function name="parameter"> 
        <ogc:Literal>data</ogc:Literal> 
      </ogc:Function> 
      <ogc:Function name="parameter"> 
        <ogc:Literal>levels</ogc:Literal> 
        <ogc:Literal>1100</ogc:Literal> 
        <ogc:Literal>1200</ogc:Literal> ....
        <ogc:Literal>1700</ogc:Literal> 
        <ogc:Literal>1800</ogc:Literal> 
      </ogc:Function> 
    </ogc:Function> 
 </Transformation>
Rendering Transform Contour Extract
<FeatureTypeStyle> 
  <Transformation> 
    <ogc:Function name="gs:Contour"> 
      <ogc:Function name="parameter"> 
        <ogc:Literal>data</ogc:Literal> 
      </ogc:Function> 
      <ogc:Function name="parameter"> 
        <ogc:Literal>levels</ogc:Literal> 
        <ogc:Literal>1100</ogc:Literal> 
        <ogc:Literal>1200</ogc:Literal> ....
        <ogc:Literal>1700</ogc:Literal> 
        <ogc:Literal>1800</ogc:Literal> 
      </ogc:Function> 
    </ogc:Function> 
 </Transformation>
XML

(what could be as fun as rendering?
             not xml)
XML

Technology           sax dom encode Supports
GeoTools SAX         SAX   DOM         Filter, GML, SLD


GeoTools DOM               DOM         Filter, GML, SLD


GeoTools Transform               XML   Filter, GML, SLD


JAXB                 SAX   DOM         n/a


XDO                  SAX   DOM   XML   Filter, GML, SLD, WMS, WFS1.0, XSD
(Schema Assisted
Generation 1)


GTXML                SAX   DOM   XML   Filter, GML, SLD, WMS, WFS1.0, WFS 1.1, WPS, XSD,
(Schema Assisted                       and more...
Generation 2)
54



Schema Assisted Parsing
GeoTools Specific Technology; makes use of the schema
information to minimise the code you need to write.
You teach GeoTools how to “bind” a object once; and it will
work in any schema that uses those objects.
55



Schema Assisted Encoding
The same approach is used when encoding objects;
basically using the schema as a cheat sheet to sort out what
to emit next.
Extensions
high value functionality built on top of GeoTools
57



 Brewer
Wraps up the ColorBrewer for Java Developers; generating
a normal Style you can use in GeoTools; or export to other
applications.

FeatureTypeStyle style = StyleGenerator.createFeatureTypeStyle(
            groups,
            ff.propertName(“population”),
            colors,
            "Generated Style",
            schema.getGeometryDescriptor(),
            StyleGenerator.ELSEMODE_IGNORE,
            0.95,
            stroke);
57



 Brewer
Wraps up the ColorBrewer for Java Developers; generating
a normal Style you can use in GeoTools; or export to other
applications.

FeatureTypeStyle style = StyleGenerator.createFeatureTypeStyle(
            groups,
            ff.propertName(“population”),
            colors,
            "Generated Style",
            schema.getGeometryDescriptor(),
            StyleGenerator.ELSEMODE_IGNORE,
            0.95,
            stroke);
58



Graph
Because getting there is half the fun.
BasicLineGraphGenerator graphGen = new BasicLineGraphGenerator();
for ( MultiLineString line : lines ) {
  graphGen.add( line );
}
Graph graph = graphGen.getGraph();

EdgeWeigter weighter = new EdgeWeighter() {
   public double getWeight(Edge e) {
      SimpleFeature feature = (SimpleFeature) e.getObject();
      Geometry geometry = (Geometry) feature.getDefaultGeometry();
      return gometry.getLength();
   }
};

DijkstraShortestPathFinder pf =
   new DijkstraShortestPathFinder( graph, start, weighter );
pf.calculate();
Path path = pf.getPath( destination );
Process

   Close to graduating
(Maybe at the Code Sprint?)
Process

Annotation Based
  No more filling in massive data structures; GeoTools will
generate based on annotations against a static method.

Bridge Functions and Process
  Used for rendering transformations; allowing you much
greater control of geometry prior to display.

Massive influx of High Quality Processes
  The full range of processes defined by GeoServer have
been back ported resulting in some of the best examples of
how to use GeoTools.

WPS Client
 Still unsupported ... nothing to see here
61



Process Annotation Example
Tutorial Coming soon!
@DescribeProcess(title = "Buffer", description = "Buffers a geometry using distance")
@DescribeResult(description = "The buffered geometry")
static public Geometry buffer(
    @DescribeParameter(name = "geom", description = "The geometry to be buffered")
    Geometry geom,
    @DescribeParameter(name = "distance",
                        description = "The distance (same unit of measure as the geometry)")
    double distance) {
        return geom.buffer(distance);
}
Application Schema
   Graduated this year!
63



Application Schema
AuScope has completed their work on Application Schema.
This is an interesting module that is able to take information
from several DataStores and "map" the values into the
correct shape for publication against an application schema.

This is used when the data format used cannot be generated
and must exactly match that provided by a standards body
or expert community.

Thanks to Ben and the AuScope team for their dedication on
this very challenging problem.
Teradata DataStore

Created and Graduated this year!
65



Terradata DataStore
A great bit of work from Jesse Eichar from Camptocamp.

This module went from a unsupported module through to
supported status in record time - excellent work Jesse!
EFeature
Mapping between Eclipse Modelling Framework
        and GeoTools Feature Model.
67



EFeature
• Kenneth Gulbrandsoy has been an amazingly
  active addition to the GeoTools community.
  Kenneth is a PHD student from Norwegian
  University of Technology and Science.
• EFeature datastore allows teams to leverage
  their Java objects into the GeoTools dynamic
  feature system
• Adding Spatial capabilities to EMF models
  – 98% finished
  – Goal is to make it a supported plugin in GeoTools
  – Docs are comming soon
Grass Raster reader
Created and Graduated this year!
69



Grass Raster Reader
Andrea Antonello has pulled together support for the
GRASS raster format and donated it to the GeoTools library
(going through the effort to match our quality assurance and
documentation standards).
Temporal
Merged into gt-main as core feature
71



Temporal
The temporal module has provided an enhanced range of
time and time range operations.
Justin has gathered this up into the gt-main module as one
of the cornerstones for WFS 2.0 Filter support.


after = ff.after(ff.property("date"),ff.literal(temporalInstant));


within = ff.toverlaps( ff.property("constructed_date"),
              ff.literal(period));
Query Improvements
   What is Justin up to?
73



Query Improvements
Join
 Justin has sorted out how Joins will be represented - finally!
Function
 Between Jody and Justin Functions now have excellent runtime
 documentation. Arguments are now listed by name; with specific
 type information.
Filter Evaluation over a Collection
 Niels (AuScope) has sorted out this one allowing you to control
 how many matches are required (one, any, all) when comparing
 groups of values.
Temporal
 As mentioned temporal filter support has been added; seriously
 increasing the number of operations available.
Swing and SWT
 (Getting your GUI on)
75



Swing
The much loved gt-swing module has been used for years
to make the GeoTools tutorials visual. At long last, it is
looking to graduate to supported status.

Michael Bedward has been a
star contributor this year
cleaning up the code base,
making it testable, all the
while answering questions
on the email list.
75



Swing
The much loved gt-swing module has been used for years
to make the GeoTools tutorials visual. At long last, it is
looking to graduate to supported status.

Michael Bedward has been a
star contributor this year
cleaning up the code base,
making it testable, all the
while answering questions
on the email list.
76



Swing
• Major clean up of the internals!
• JMapPane rewritten
  – Ported to Layer, FeatureLayer, RasterLayer etc...
  – DirectLayer support for Animation / map decorations
  – Nice clean background rendering
• Ability to add new InfoTool classes via plugin
• Support for Internationalisation
• Supported Status?
  – Docs and Test Coverage improving by the day


• Coming Soon: Concurrent rendering
77



SWT
A new addition to the project is a port of the gt-swing code to
an easy to use component for SWT.

Andrea Antonello (HydroloGIS) was responsible for this work
and it looks like gt-swing and gt-swt will be able to share the
same data models as time progresses.
What is Past?
Reflections on departed modules
79



Recently Dropped
JDBCDataStore
 The initial proof of concept JDBC datastore created in 2003 has
 finally been replaced. We had a good 2 year deprecation cycle to
 allow migration.
GeoAPI
 The "opengis" interfaces have been folded back into the library
 allowing us to take responsibility, improve javadocs and dive into
 filter improvements for WFS 2.0 work.
Assorted Spring Cleaning
 Simone was kind enough to clean out orphaned and empty
 modules from out "unsupported" pile.
What is Next?
Ideas on the future of GeoTools
81



Future Plans
Geometry Curves and 3D
  Tisham Dhar (CSIRO) is evaluating several alternatives.
GeoTools has components of ISO 19107 provided by
SYS Technologies and the of University Fachhochschule
Koeln.
WFS 2.0 Query
  Justin DeOlivera (OpenGeo) is in the middle of a
major update to DataStore query functionality
82



Future RnD Ideas
OSGi Bundles
 Branch started to explore this topic with contributors from several
 projects.
Android
 Jody had a chance to look at what it would take to port GoeTools
 to Andriod. If you are interested in doing the work talk to us at the
 Code Sprint.
3D
 A number of teams hook GeoTools to 3D engines each year.
 Indeed Oliver Gottwald plans to do so this year; anyone want to
 do it as part of the community?
MIL2525B
 Another classic we revisit each year - any takers?
Upstream Projects
Thanks! We don't Do this alone
84



Upstream Projects
JTS Topology Suite (JTS)
   Provides the excellent Geometry support we enjoy in
GeoTools. Thanks Martin!
imageio-ext
   Provides geospatial raster formats to the Java Advanced
Imaging project we use for coverages. Thanks Simone and
GeoSolutions.
jaitools
   Another extension to Java Advanced Imaging this time
thanks to Michael Bedward. Really fun for processing and
generating rasters.
Open Development
Is so much more than open source
Get Involved - Open Development
GeoTools provides clear “time boxed” procedures allowing you
to plan your community involvement.

Contribute
  Clean patch + test + description = contribution

Request for Change
   Open RFC procedure, time boxed allowing commit
three days after submitting (we have to meet deadlines as
well).

Release
  Public release process - make a release to match your
projects schedule and deadlines.

   Procedures are in place just add developers (or money).
Get Involved - Unsupported Area
Unsupported is a scratch pad used to work on new ideas.

Easy Commit Access
   Send email and read the developers guide; a PMC member
will help you with the paper work.

Unsupported does not mean unloved
  You get commit access to your module, and your work
deployed to maven nightly, and published each release.

Formal review only when Ready
   Ask for a QA / Docs check at any time and graduate to a
formal supported part of the library.
State of GeoTools

      Any Questions? Any time?

Weitere ähnliche Inhalte

Mehr von Jody Garnett

Open Source is hard, we are here to help!
Open Source is hard, we are here to help!Open Source is hard, we are here to help!
Open Source is hard, we are here to help!Jody Garnett
 
GeoServer Developers Workshop
GeoServer Developers WorkshopGeoServer Developers Workshop
GeoServer Developers WorkshopJody Garnett
 
GeoServer Ecosystem 2018
GeoServer Ecosystem 2018GeoServer Ecosystem 2018
GeoServer Ecosystem 2018Jody Garnett
 
State of GeoServer 2.14
State of GeoServer 2.14State of GeoServer 2.14
State of GeoServer 2.14Jody Garnett
 
Working with the OSGeo Community
Working with the OSGeo CommunityWorking with the OSGeo Community
Working with the OSGeo CommunityJody Garnett
 
State of GeoServer 2.13
State of GeoServer 2.13State of GeoServer 2.13
State of GeoServer 2.13Jody Garnett
 
Open Data and Open Software Geospatial Applications
Open Data and Open Software Geospatial ApplicationsOpen Data and Open Software Geospatial Applications
Open Data and Open Software Geospatial ApplicationsJody Garnett
 
Map box styles in GeoServer and OpenLayers
Map box styles in GeoServer and OpenLayersMap box styles in GeoServer and OpenLayers
Map box styles in GeoServer and OpenLayersJody Garnett
 
Quick and easy web maps
Quick and easy web mapsQuick and easy web maps
Quick and easy web mapsJody Garnett
 
Incubation Orientation
Incubation OrientationIncubation Orientation
Incubation OrientationJody Garnett
 
Understanding the Flexibility of Open Source
Understanding the Flexibility of Open SourceUnderstanding the Flexibility of Open Source
Understanding the Flexibility of Open SourceJody Garnett
 
Understanding Open Source
Understanding Open SourceUnderstanding Open Source
Understanding Open SourceJody Garnett
 
Understanding Open Source
Understanding Open SourceUnderstanding Open Source
Understanding Open SourceJody Garnett
 
State of GeoServer 2.10
State of GeoServer 2.10State of GeoServer 2.10
State of GeoServer 2.10Jody Garnett
 
Getting it Done at LocationTech
Getting it Done at LocationTechGetting it Done at LocationTech
Getting it Done at LocationTechJody Garnett
 
A New Vision for OSGeo
A New Vision for OSGeoA New Vision for OSGeo
A New Vision for OSGeoJody Garnett
 

Mehr von Jody Garnett (20)

Open Source is hard, we are here to help!
Open Source is hard, we are here to help!Open Source is hard, we are here to help!
Open Source is hard, we are here to help!
 
GeoServer Developers Workshop
GeoServer Developers WorkshopGeoServer Developers Workshop
GeoServer Developers Workshop
 
GeoServer Ecosystem 2018
GeoServer Ecosystem 2018GeoServer Ecosystem 2018
GeoServer Ecosystem 2018
 
State of GeoServer 2.14
State of GeoServer 2.14State of GeoServer 2.14
State of GeoServer 2.14
 
OSGeo AGM 2018
OSGeo AGM 2018OSGeo AGM 2018
OSGeo AGM 2018
 
Working with the OSGeo Community
Working with the OSGeo CommunityWorking with the OSGeo Community
Working with the OSGeo Community
 
State of GeoServer 2.13
State of GeoServer 2.13State of GeoServer 2.13
State of GeoServer 2.13
 
Open Data and Open Software Geospatial Applications
Open Data and Open Software Geospatial ApplicationsOpen Data and Open Software Geospatial Applications
Open Data and Open Software Geospatial Applications
 
Map box styles in GeoServer and OpenLayers
Map box styles in GeoServer and OpenLayersMap box styles in GeoServer and OpenLayers
Map box styles in GeoServer and OpenLayers
 
Quick and easy web maps
Quick and easy web mapsQuick and easy web maps
Quick and easy web maps
 
State of GeoGig
State of GeoGigState of GeoGig
State of GeoGig
 
State of JTS 2017
State of JTS 2017State of JTS 2017
State of JTS 2017
 
OSGeo AGM 2017
OSGeo AGM 2017OSGeo AGM 2017
OSGeo AGM 2017
 
Incubation Orientation
Incubation OrientationIncubation Orientation
Incubation Orientation
 
Understanding the Flexibility of Open Source
Understanding the Flexibility of Open SourceUnderstanding the Flexibility of Open Source
Understanding the Flexibility of Open Source
 
Understanding Open Source
Understanding Open SourceUnderstanding Open Source
Understanding Open Source
 
Understanding Open Source
Understanding Open SourceUnderstanding Open Source
Understanding Open Source
 
State of GeoServer 2.10
State of GeoServer 2.10State of GeoServer 2.10
State of GeoServer 2.10
 
Getting it Done at LocationTech
Getting it Done at LocationTechGetting it Done at LocationTech
Getting it Done at LocationTech
 
A New Vision for OSGeo
A New Vision for OSGeoA New Vision for OSGeo
A New Vision for OSGeo
 

Kürzlich hochgeladen

A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 

Kürzlich hochgeladen (20)

A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 

Status of GeoTools

  • 2. 2 About your Presenters Andrea Aime Jody Garnett (PMC) (PMC) GeoSolutions LISAsoft GeoServer/GeoTools core A great system integration developers, raster data company helping our management, map rendering, customers make effective use spatial data processing of open source spatial.
  • 3. 2 About your Presenters Andrea Aime Jody Garnett (PMC) (PMC) GeoSolutions LISAsoft GeoServer/GeoTools core A great system integration developers, raster data company helping our management, map rendering, customers make effective use spatial data processing of open source spatial.
  • 4. 3 About your Presenters Justin Deolivera Jody Garnett (PMC) (PMC) OpenGeo LISAsoft Bringing the best open source A great system integration geospatial software to company helping our organisations around the customers make effective use world. of open source spatial.
  • 5. 4 GeoTools - the Java GIS Toolkit
  • 6. 5 Development Community 261 Andrea Aime (GeoServer, JAITools) - GeoSolutions 261 Jody Garnett (GeoTools, uDig) - Lisasoft 167 Simone Giannecchini (GeoServer, JAITools) - GeoSolutions 123 Justin Deoliveira (GeoServer, GeoScript) - OpenGeo 114 Michael Bedward (JAITools) - Australia 66 danieleromagnoli (GeoServer) - GeoSolutions 54 bencaradocdavies - CSIRO 51 NielsCharlier - CSIRO 38 sbrunner ? 2010 Stats tracking commits 32 moovida (uDig, JGrass) - Hydrologis 28 ang05a - CSIRO 25 groldan - (GeoServer) - OpenGeo 17 mpazos - Axios 30 committers 15 victortey - CSIRO 13 mcr - ? 10 organisations 9 kengu - Norwegian Uni of Tech & Science 8 ischneider - OpenGeo 7 ianturton - University of Leeds Healthy project with a broad base of support 7 jesseeichar - CampToCamp 7 lmoran - Consultant actively improving GeoTools 6 afabiani - GeoSolutions 6 rbraam - ? 4 xiangtanlin - ? 3 LeeBreisacher - ? 3 lendholt - ? 2 alfonx (AtlasStyler) - WikiSquare 2 pieterdg - ? 2 tdipisa - GeoSolutions 1 atrofast - Ingres 1 mleslie - Lisasoft
  • 7. 6 Stats geotools-devel: 386 members total geotools-gt2-users: 889 members total Created vs resolved tickets (click here for update )
  • 9. 8 GeoTools 8 What is in a Name? - sed/GeoTools 2.8.0/GeoTools 8.0/ What does this mean? - not very much - business as usual - confidence in our community - continue our commitment to stability - evolution handled with continuous small changes
  • 11. 10 User Guide - Before
  • 14. 12 Code Examples - Before (Wiki) private synchronized static FeatureSource buildMemoryFeatureSource(FeatureCollection coll, String typename, FeatureType currentFeatureType, AttributeType newTypes[]){ FeatureType ftState=null; MemoryDataStore MStore=null; try { MStore = new MemoryDataStore(); //---- current attributes AttributeType currentTypes[] = currentFeatureType.getAttributeTypes(); //---- new array of attributes = current array+ new attributes Compile? AttributeType typesNew[] = new What Version? AttributeType[currentTypes.length+newTypes.length]; When? for(int i=0;i<currentTypes.length;i++){ typesNew[i] = currentTypes[i]; } for(int i=0;i<newTypes.length;i++){ All very good } typesNew[currentTypes.length+i] = newTypes[i]; questions with no clear answer. ftState = FeatureTypeFactory.newFeatureType(typesNew, typename); MStore.createSchema(ftState); Iterator iterator = coll.iterator(); FeatureCollection newColl = FeatureCollections.newCollection(); Feature feature, newFeature; Object[] objs; try { for( int count=0; iterator.hasNext(); count++) { feature = (Feature) iterator.next();
  • 15. 13 Code Examples - After (Sphinx) private synchronized static FeatureSource buildMemoryFeatureSource(FeatureCollection coll, String typename, FeatureType currentFeatureType, AttributeType newTypes[]){ FeatureType ftState=null; MemoryDataStore MStore=null; try { MStore = new MemoryDataStore(); //---- current attributes AttributeType currentTypes[] = currentFeatureType.getAttributeTypes(); //---- new array of attributes = current array+ new attributes AttributeType typesNew[] = new Pulled Live from AttributeType[currentTypes.length+newTypes.length]; Source! for(int i=0;i<currentTypes.length;i++){ typesNew[i] = currentTypes[i]; } GeoTools Version at for(int i=0;i<newTypes.length;i++){ typesNew[currentTypes.length+i] = newTypes[i]; the Top of the Page! } ftState = FeatureTypeFactory.newFeatureType(typesNew, typename); MStore.createSchema(ftState); Iterator iterator = coll.iterator(); FeatureCollection newColl = FeatureCollections.newCollection(); Feature feature, newFeature; Object[] objs; try { for( int count=0; iterator.hasNext(); count++) { feature = (Feature) iterator.next();
  • 16. 13 Code Examples - After (Sphinx) SimpleFeatureSource alter(SimpleFeatureCollection collection, String typename,         SimpleFeatureType featureType, final List<AttributeDescriptor> newTypes) {          try {                  // Create target schema         SimpleFeatureTypeBuilder buildType = new SimpleFeatureTypeBuilder();         buildType.init(featureType);         buildType.setName(typename);         buildType.addAll(newTypes);                  final SimpleFeatureType schema = buildType.buildFeatureType();         // Configure memory datastore         final MemoryDataStore memory = new MemoryDataStore(); Pulled Live from         memory.createSchema(schema);          Source!         collection.accepts(new FeatureVisitor() {             public void visit(Feature feature) {                 SimpleFeatureBuilder builder = new SimpleFeatureBuilder(schema);                  GeoTools Version at                 builder.init((SimpleFeature) feature); the Top of the Page!                 for (AttributeDescriptor descriptor : newTypes) {                     builder.add(DataUtilities.defaultValue(descriptor));                 }                                  SimpleFeature newFeature = builder.buildFeature(feature.getIdentifier().getID());                 memory.addFeature(newFeature);             }         }, null);                  return memory.getFeatureSource(typename);              } catch (Exception e) {         e.printStackTrace();     }
  • 17. 14 Code Examples - Example Used for both Java code examples and also configuration files such as maven pom.xml.
  • 19. 16 Diagrams - After (Inkscape)
  • 21. 18 Class Diagrams - After (Object Aid)
  • 24. Advanced Tutorials Function Finally a nice quick guide to how to create a function! AbstractDataStore Tutorial - Property DataStore The classic updated for GeoTools 8. ContentDataStore Tutorial - CSVDataStore The new kid on the block; leaner; meaner and ready. Welcome Introduction for different developer communities. Update Have not used GeoTools in a while? Guide to updating.
  • 28. 25 Documentation Highlights Details - 291 “Pages” - longest page is 36 pages printed out on paper - Over 100,000 words - Written from Feb through to May - Accounts for every page of the wiki New features - Extensive FAQ - whole project javadocs - module by module reference - plugins organised by module
  • 29. Referencing (do you know where your data is?)
  • 30. 27 Referencing • Ellipsoids, datum, map projections • Embedded EPSG database, over 5000 supported codes (gt-epsg-hsql module) • Reprojection utilities Geometry g = ...; CoordinateReferenceSystem wgs84 = CRS.decode("EPSG:4326");                 CoordinateReferenceSystem utm32n = CRS.decode("EPSG:32632"); Geometry gtx = JTS.transform(g); ... SimpleFetureCollection fc = featureSource.getFeature(); SimpleFeatureCollection fcTx =                  new ReprojectingFeatureCollection(fc, utm32n);
  • 31. 28 Projections Old projections New Projections Aitoff Albers Equal A. Mollweide CassiniSoldner Cylindrical Equidist. Robinson Krovak Lambert Conf. Mercator Oblique Mercator Eckert IV Orthogonal Polyconic Winkel Tripel Stereographic Transverse Mercator Equidistant conic
  • 33. 30 Vector Data Sources • Application schema* • JDBC • ArcSDE o DB2 • Aggregating * o H2 spatial • CouchDb * o MySQL • CSV * o Postgis • DXF * o Oracle • Excel o SQL Server • Edigeo o Spatialite * • PreGeneralized o Teradata * • SimpleFeatureService * • Shapefile (directory of) • WFS name* = new entry name = “unsupported”
  • 34. 31 JDBC DataStore "NG" • JDBC stores: – common base – over 200 ready to use tests, just prepare the test data and run – Parametric SQL views: define a new data source as a raw query select ST_Union(the_geom) as geom from countries where REGION = %region% – Extensions for native joins
  • 35. 32 Application schema – Complex feature support – Recent development by CSIRO – Feature chaining, polymorphism – Better performance (native DBMS joins), memory use – Usable as vector data source, GML encoding, rendering
  • 36. Raster Formats pixel power
  • 37. 34 Raster Data Sources • ArcGrid • imageio-ext based • ArcSDE o AIG • GeoTiff o DTED • GRASS * o ECW • GTopo30 o EnviHdr • Image Mosaic o ErdasImg • Image Mosaic JDBC * o EsriHdr • Image Pyramid o JP2 (ECW, MrSid) • Image + World file o MrSID • JP2 direct Kakadu o NITF* • Matlab o RPFTOC • Non georef. Image collection * name * = new entry name = unsupported land
  • 40. Rendering Gotta see it to believe it
  • 43. 39 Layers • FeatureLayer: any vector + Style (shapefile, spatial db, WFS, ...) • GridCoverageLayer: in memory raster grid • GridReaderLayer: dynamic raster read from disk (leverage overviews and tiling) • WMSLayer: get maps from a WMS server • DirectLayer: (new feature!) roll your own custom paint method
  • 44. 40 StyleBuilder • Style API is inspired by SLD 1.0 and SE 1.1: – a style is a complex, deep object graph • StyleBuilder provides a set of hierarchical builders • Build a style easily, just pick the portion you need Style style = new StrokeBuilder().color(Color.BLUE) .width(3).dashArray(5, 2) .buildStyle();
  • 45. 40 StyleBuilder • Style API is inspired by SLD 1.0 and SE 1.1: – a style is a complex, deep object graph • StyleBuilder provides a set of hierarchical builders • Build a style easily, just pick the portion you need Style style = new StrokeBuilder().color(Color.BLUE) .width(3).dashArray(5, 2) .buildStyle();
  • 46. 41 StyleBuilder • StyleBuilder allows you to freely mix CQL expressions • Provides “literate” methods allowing you to define your style using your IDE autocomplete fts = new FeatureTypeStyleBuilder(); fts.rule().filter("pop < 200000") .polygon().fill().colorHex("#66FF66"); fts.rule().filter("pop between 200000 and 500000") .polygon().fill().colorHex("#33CC33"); fts.rule().filter("pop > 500000") .polygon().fill().colorHex("#009900"); Style style = fts.buildStyle();
  • 47. 41 StyleBuilder • StyleBuilder allows you to freely mix CQL expressions • Provides “literate” methods allowing you to define your style using your IDE autocomplete fts = new FeatureTypeStyleBuilder(); fts.rule().filter("pop < 200000") .polygon().fill().colorHex("#66FF66"); fts.rule().filter("pop between 200000 and 500000") .polygon().fill().colorHex("#33CC33"); fts.rule().filter("pop > 500000") .polygon().fill().colorHex("#009900"); Style style = fts.buildStyle();
  • 48. 42 Showing the Map Part 1 • To start we get the data and create a Style FileDataStore store = FileDataStoreFinder.getDataStore(file); SimpleFeatureSource featureSource = store.getFeatureSource(); Style style = SLD.createSimpleStyle(featureSource.getSchema());
  • 49. 43 Showing the Map Part 2 • Create Map and use JMapFrame to display MapContent map = new MapContent(); map.setTitle("Quickstart"); Layer layer = new FeatureLayer(featureSource, style); map.addLayer(layer); JMapFrame.showMap(map);
  • 50. 43 Showing the Map Part 2 • Create Map and use JMapFrame to display MapContent map = new MapContent(); map.setTitle("Quickstart"); Layer layer = new FeatureLayer(featureSource, style); map.addLayer(layer); JMapFrame.showMap(map);
  • 51. 44 Pluggable Mark Factory TTF <Mark> <WellKnownName>ttf://Wingdings#0xF054</WellKnownName> <Fill> <CssParameter name="fill">#000088</CssParameter> </Fill> </Mark>
  • 52. 44 Pluggable Mark Factory TTF <Mark> <WellKnownName>ttf://Wingdings#0xF054</WellKnownName> <Fill> <CssParameter name="fill">#000088</CssParameter> </Fill> </Mark>
  • 53. 45 Pluggable Mark Factory Slash <Fill>   <GraphicFill>   <Graphic>     <Mark>       <WellKnownName>shape://slash</WellKnownName>       <Stroke>         <CssParameter name="stroke">0xAAAAAA</CssParameter>       </Stroke>     </Mark>     <Size>16</Size>   </Graphic> </GraphicFill> </Fill>     
  • 54. 45 Pluggable Mark Factory Slash <Fill>   <GraphicFill>   <Graphic>     <Mark>       <WellKnownName>shape://slash</WellKnownName>       <Stroke>         <CssParameter name="stroke">0xAAAAAA</CssParameter>       </Stroke>     </Mark>     <Size>16</Size>   </Graphic> </GraphicFill> </Fill>     
  • 55. 46 Pluggable Mark Factories Interface public interface MarkFactory { public java.awt.Shape getShape( Graphics2D graphics, Expression symbolUrl, Feature feature) throws Exception; } org.geotools.renderer.style.WellKnownMarkFactory org.geotools.renderer.style.TTFMarkFactory org.geotools.renderer.style.ShapeMarkFactory http://docs.geotools.org/latest/userguide/library/render/icon.html
  • 56. 47 Geometry transform Arrow Head Similar to SE 1.1 transformations, but open-ended, pluggable, add your own transformation today! <PointSymbolizer>   <Geometry>      <ogc:Function name="endPoint">                 <ogc:PropertyName>the_geom</ogc:PropertyName>      </ogc:Function>   </Geometry>   <Graphic>     <Mark>       <WellKnownName>shape://arrow</WellKnownName>       <Fill/>       <Stroke/>     </Mark>     <Rotation>       <ogc:Function name="endAngle">          <ogc:PropertyName>the_geom</ogc:PropertyName>       </ogc:Function>     </Rotation>   </Graphic> </PointSymbolizer>
  • 57. 47 Geometry transform Arrow Head Similar to SE 1.1 transformations, but open-ended, pluggable, add your own transformation today! <PointSymbolizer>   <Geometry>      <ogc:Function name="endPoint">                 <ogc:PropertyName>the_geom</ogc:PropertyName>      </ogc:Function>   </Geometry>   <Graphic>     <Mark>       <WellKnownName>shape://arrow</WellKnownName>       <Fill/>       <Stroke/>     </Mark>     <Rotation>       <ogc:Function name="endAngle">          <ogc:PropertyName>the_geom</ogc:PropertyName>       </ogc:Function>     </Rotation>   </Graphic> </PointSymbolizer>
  • 58. 48 Geometry transform Drop Shadow <Geometry>   <ogc:Function name="offset">        <ogc:PropertyName>the_geom</ogc:PropertyName>     <ogc:Literal>0.00004</ogc:Literal>      <ogc:Literal>‐0.00004</ogc:Literal>   </ogc:Function>  <Geometry>
  • 59. 48 Geometry transform Drop Shadow <Geometry>   <ogc:Function name="offset">        <ogc:PropertyName>the_geom</ogc:PropertyName>     <ogc:Literal>0.00004</ogc:Literal>      <ogc:Literal>‐0.00004</ogc:Literal>   </ogc:Function>  <Geometry>
  • 60. Geometry transform Implementation Based on functions, a pluggable extension point public class FilterFunction_offset extends FunctionExpressionImpl                                    implements GeometryTransformation { ... public Object evaluate(Object feature) {         Geometry geom = getExpression(0).evaluate(feature, Geometry.class);         Double offsetX = getExpression(1).evaluate(feature, Double.class);         if(offsetX == null) offsetX = 0d;         Double offsetY = getExpression(2).evaluate(feature, Double.class);         if(offsetY == null) offsetY = 0d;         if (geom != null) {             Geometry offseted = (Geometry) geom.clone();             offseted.apply(                new OffsetOrdinateFilter(offsetX, offsetY));             return offseted;         } else {             return null;         }     } ... }
  • 61. Geometry transform Implementation Based on functions, a pluggable extension point public class FilterFunction_offset extends FunctionExpressionImpl                                    implements GeometryTransformation { ... public Object evaluate(Object feature) {         Geometry geom = getExpression(0).evaluate(feature, Geometry.class);         Double offsetX = getExpression(1).evaluate(feature, Double.class);         if(offsetX == null) offsetX = 0d;         Double offsetY = getExpression(2).evaluate(feature, Double.class);         if(offsetY == null) offsetY = 0d;         if (geom != null) {             Geometry offseted = (Geometry) geom.clone();             offseted.apply(                new OffsetOrdinateFilter(offsetX, offsetY));             return offseted;         } else {             return null;         }     } ... }
  • 62. 50 Rendering Transform Wind Map <FeatureTypeStyle>     <Transformation>      <ogc:Function name="gs:RasterAsPointCollection">        <ogc:Function name="parameter">              <ogc:Literal>data</ogc:Literal>  u v       </ogc:Function>      </ogc:Function>  </Transformation> ... Transform data before rendering. Contour extraction, wind maps, geometry clustering. Pluggable, add your function!
  • 63. 50 Rendering Transform Wind Map <FeatureTypeStyle>     <Transformation>      <ogc:Function name="gs:RasterAsPointCollection">        <ogc:Function name="parameter">              <ogc:Literal>data</ogc:Literal>  u v       </ogc:Function>      </ogc:Function>  </Transformation> ... Transform data before rendering. Contour extraction, wind maps, geometry clustering. Pluggable, add your function!
  • 64. Rendering Transform Contour Extract <FeatureTypeStyle>    <Transformation>      <ogc:Function name="gs:Contour">        <ogc:Function name="parameter">          <ogc:Literal>data</ogc:Literal>        </ogc:Function>        <ogc:Function name="parameter">          <ogc:Literal>levels</ogc:Literal>          <ogc:Literal>1100</ogc:Literal>          <ogc:Literal>1200</ogc:Literal> ....         <ogc:Literal>1700</ogc:Literal>          <ogc:Literal>1800</ogc:Literal>        </ogc:Function>      </ogc:Function>   </Transformation>
  • 65. Rendering Transform Contour Extract <FeatureTypeStyle>    <Transformation>      <ogc:Function name="gs:Contour">        <ogc:Function name="parameter">          <ogc:Literal>data</ogc:Literal>        </ogc:Function>        <ogc:Function name="parameter">          <ogc:Literal>levels</ogc:Literal>          <ogc:Literal>1100</ogc:Literal>          <ogc:Literal>1200</ogc:Literal> ....         <ogc:Literal>1700</ogc:Literal>          <ogc:Literal>1800</ogc:Literal>        </ogc:Function>      </ogc:Function>   </Transformation>
  • 66. XML (what could be as fun as rendering? not xml)
  • 67. XML Technology sax dom encode Supports GeoTools SAX SAX DOM Filter, GML, SLD GeoTools DOM DOM Filter, GML, SLD GeoTools Transform XML Filter, GML, SLD JAXB SAX DOM n/a XDO SAX DOM XML Filter, GML, SLD, WMS, WFS1.0, XSD (Schema Assisted Generation 1) GTXML SAX DOM XML Filter, GML, SLD, WMS, WFS1.0, WFS 1.1, WPS, XSD, (Schema Assisted and more... Generation 2)
  • 68. 54 Schema Assisted Parsing GeoTools Specific Technology; makes use of the schema information to minimise the code you need to write. You teach GeoTools how to “bind” a object once; and it will work in any schema that uses those objects.
  • 69. 55 Schema Assisted Encoding The same approach is used when encoding objects; basically using the schema as a cheat sheet to sort out what to emit next.
  • 70. Extensions high value functionality built on top of GeoTools
  • 71. 57 Brewer Wraps up the ColorBrewer for Java Developers; generating a normal Style you can use in GeoTools; or export to other applications. FeatureTypeStyle style = StyleGenerator.createFeatureTypeStyle(             groups,             ff.propertName(“population”),             colors,             "Generated Style",             schema.getGeometryDescriptor(),             StyleGenerator.ELSEMODE_IGNORE,             0.95,             stroke);
  • 72. 57 Brewer Wraps up the ColorBrewer for Java Developers; generating a normal Style you can use in GeoTools; or export to other applications. FeatureTypeStyle style = StyleGenerator.createFeatureTypeStyle(             groups,             ff.propertName(“population”),             colors,             "Generated Style",             schema.getGeometryDescriptor(),             StyleGenerator.ELSEMODE_IGNORE,             0.95,             stroke);
  • 73. 58 Graph Because getting there is half the fun. BasicLineGraphGenerator graphGen = new BasicLineGraphGenerator(); for ( MultiLineString line : lines ) {   graphGen.add( line ); } Graph graph = graphGen.getGraph(); EdgeWeigter weighter = new EdgeWeighter() {    public double getWeight(Edge e) {       SimpleFeature feature = (SimpleFeature) e.getObject();       Geometry geometry = (Geometry) feature.getDefaultGeometry();       return gometry.getLength();    } }; DijkstraShortestPathFinder pf = new DijkstraShortestPathFinder( graph, start, weighter ); pf.calculate(); Path path = pf.getPath( destination );
  • 74. Process Close to graduating (Maybe at the Code Sprint?)
  • 75. Process Annotation Based No more filling in massive data structures; GeoTools will generate based on annotations against a static method. Bridge Functions and Process Used for rendering transformations; allowing you much greater control of geometry prior to display. Massive influx of High Quality Processes The full range of processes defined by GeoServer have been back ported resulting in some of the best examples of how to use GeoTools. WPS Client Still unsupported ... nothing to see here
  • 76. 61 Process Annotation Example Tutorial Coming soon! @DescribeProcess(title = "Buffer", description = "Buffers a geometry using distance") @DescribeResult(description = "The buffered geometry") static public Geometry buffer(     @DescribeParameter(name = "geom", description = "The geometry to be buffered")     Geometry geom,     @DescribeParameter(name = "distance",                         description = "The distance (same unit of measure as the geometry)")     double distance) {         return geom.buffer(distance); }
  • 77. Application Schema Graduated this year!
  • 78. 63 Application Schema AuScope has completed their work on Application Schema. This is an interesting module that is able to take information from several DataStores and "map" the values into the correct shape for publication against an application schema. This is used when the data format used cannot be generated and must exactly match that provided by a standards body or expert community. Thanks to Ben and the AuScope team for their dedication on this very challenging problem.
  • 79. Teradata DataStore Created and Graduated this year!
  • 80. 65 Terradata DataStore A great bit of work from Jesse Eichar from Camptocamp. This module went from a unsupported module through to supported status in record time - excellent work Jesse!
  • 81. EFeature Mapping between Eclipse Modelling Framework and GeoTools Feature Model.
  • 82. 67 EFeature • Kenneth Gulbrandsoy has been an amazingly active addition to the GeoTools community. Kenneth is a PHD student from Norwegian University of Technology and Science. • EFeature datastore allows teams to leverage their Java objects into the GeoTools dynamic feature system • Adding Spatial capabilities to EMF models – 98% finished – Goal is to make it a supported plugin in GeoTools – Docs are comming soon
  • 83. Grass Raster reader Created and Graduated this year!
  • 84. 69 Grass Raster Reader Andrea Antonello has pulled together support for the GRASS raster format and donated it to the GeoTools library (going through the effort to match our quality assurance and documentation standards).
  • 85. Temporal Merged into gt-main as core feature
  • 86. 71 Temporal The temporal module has provided an enhanced range of time and time range operations. Justin has gathered this up into the gt-main module as one of the cornerstones for WFS 2.0 Filter support. after = ff.after(ff.property("date"),ff.literal(temporalInstant)); within = ff.toverlaps( ff.property("constructed_date"), ff.literal(period));
  • 87. Query Improvements What is Justin up to?
  • 88. 73 Query Improvements Join Justin has sorted out how Joins will be represented - finally! Function Between Jody and Justin Functions now have excellent runtime documentation. Arguments are now listed by name; with specific type information. Filter Evaluation over a Collection Niels (AuScope) has sorted out this one allowing you to control how many matches are required (one, any, all) when comparing groups of values. Temporal As mentioned temporal filter support has been added; seriously increasing the number of operations available.
  • 89. Swing and SWT (Getting your GUI on)
  • 90. 75 Swing The much loved gt-swing module has been used for years to make the GeoTools tutorials visual. At long last, it is looking to graduate to supported status. Michael Bedward has been a star contributor this year cleaning up the code base, making it testable, all the while answering questions on the email list.
  • 91. 75 Swing The much loved gt-swing module has been used for years to make the GeoTools tutorials visual. At long last, it is looking to graduate to supported status. Michael Bedward has been a star contributor this year cleaning up the code base, making it testable, all the while answering questions on the email list.
  • 92. 76 Swing • Major clean up of the internals! • JMapPane rewritten – Ported to Layer, FeatureLayer, RasterLayer etc... – DirectLayer support for Animation / map decorations – Nice clean background rendering • Ability to add new InfoTool classes via plugin • Support for Internationalisation • Supported Status? – Docs and Test Coverage improving by the day • Coming Soon: Concurrent rendering
  • 93. 77 SWT A new addition to the project is a port of the gt-swing code to an easy to use component for SWT. Andrea Antonello (HydroloGIS) was responsible for this work and it looks like gt-swing and gt-swt will be able to share the same data models as time progresses.
  • 94. What is Past? Reflections on departed modules
  • 95. 79 Recently Dropped JDBCDataStore The initial proof of concept JDBC datastore created in 2003 has finally been replaced. We had a good 2 year deprecation cycle to allow migration. GeoAPI The "opengis" interfaces have been folded back into the library allowing us to take responsibility, improve javadocs and dive into filter improvements for WFS 2.0 work. Assorted Spring Cleaning Simone was kind enough to clean out orphaned and empty modules from out "unsupported" pile.
  • 96. What is Next? Ideas on the future of GeoTools
  • 97. 81 Future Plans Geometry Curves and 3D Tisham Dhar (CSIRO) is evaluating several alternatives. GeoTools has components of ISO 19107 provided by SYS Technologies and the of University Fachhochschule Koeln. WFS 2.0 Query Justin DeOlivera (OpenGeo) is in the middle of a major update to DataStore query functionality
  • 98. 82 Future RnD Ideas OSGi Bundles Branch started to explore this topic with contributors from several projects. Android Jody had a chance to look at what it would take to port GoeTools to Andriod. If you are interested in doing the work talk to us at the Code Sprint. 3D A number of teams hook GeoTools to 3D engines each year. Indeed Oliver Gottwald plans to do so this year; anyone want to do it as part of the community? MIL2525B Another classic we revisit each year - any takers?
  • 99. Upstream Projects Thanks! We don't Do this alone
  • 100. 84 Upstream Projects JTS Topology Suite (JTS) Provides the excellent Geometry support we enjoy in GeoTools. Thanks Martin! imageio-ext Provides geospatial raster formats to the Java Advanced Imaging project we use for coverages. Thanks Simone and GeoSolutions. jaitools Another extension to Java Advanced Imaging this time thanks to Michael Bedward. Really fun for processing and generating rasters.
  • 101. Open Development Is so much more than open source
  • 102. Get Involved - Open Development GeoTools provides clear “time boxed” procedures allowing you to plan your community involvement. Contribute Clean patch + test + description = contribution Request for Change Open RFC procedure, time boxed allowing commit three days after submitting (we have to meet deadlines as well). Release Public release process - make a release to match your projects schedule and deadlines. Procedures are in place just add developers (or money).
  • 103. Get Involved - Unsupported Area Unsupported is a scratch pad used to work on new ideas. Easy Commit Access Send email and read the developers guide; a PMC member will help you with the paper work. Unsupported does not mean unloved You get commit access to your module, and your work deployed to maven nightly, and published each release. Formal review only when Ready Ask for a QA / Docs check at any time and graduate to a formal supported part of the library.
  • 104. State of GeoTools Any Questions? Any time?

Hinweis der Redaktion

  1. Welcome to GeoTools!\n
  2. I am afraid Andrea could not join us today; he has managed to break his ankle (and left me up here all alone).\n
  3. I am afraid Andrea could not join us today; he has managed to break his ankle (and left me up here all alone).\n
  4. GeoTools *is* the Java GIS Toolkit :-)\n\nWell at least it is happy to trace its roots back to the dawn of the JVM.\n\nGeoTools 1.0 &amp;#xA0;was started at Leeds University by James&amp;#xA0;Macgill and Ian Turton&amp;#xA0;in 1996.\n\nThe codebase was reset in 2003 with an influx of code from the SEAGIS project and a project management committee setup.\n\nWe have had a steady series of releases since then:\n\nThe Geotools 1.0 Lite Project (1996 - 2003)\nGeotools 2.0 Project (2002 to&amp;#xA0;Geotools 2.1 (2004 to 2005)\n2004)\nGeotools 2.2 (2005)\nGeoTools 2.3 (2005-2007)\nGeoTools 2.4 (2006-2007)\nGeoTools 2.5 (2007)\nGeoTools 2.6 (2008)\nGeoTools 2.7 (2009 - Present)&amp;#xA0;GeoTools 8 (unreleased)&amp;#xA0;\n
  5. GeoTools today is well represented with ten organisations actively participating.\n\nMore importantly you can see a number of names marked with &quot;?&quot; - these individuals are new to GeoTools and are often working on RnD activities in our&amp;#xA0;&quot;unsupported&quot; sandbox.\n
  6. This graph shows a very active project with many issues being reported; and the developers doing the best to keep up.\n\nYou can really notice a few spikes as development teams try out the library from armed with a different application or dataset in mind.\n\nClick on the link to see an update of the chart provided (additional charts are available if you login to the issue tracker).\n
  7. Documentation is the key feature this year!\n\nReally :-)\n
  8. This really is the &quot;GeoTools 2&quot; project finally taking over and being the &quot;GeoTools&quot; project.\n\nWe have averaged one release ever year or so. Making &quot;Version 8&quot; a clear indication of where the project is at with respect to maturity and stability.\n
  9. Documentation is the key feature this year!\n\nReally :-)\n
  10. Since 2003 GeoTools has employed a &amp;#x201C;wiki&amp;#x201D; to capture user documentation.\n
  11. In 2009 we set up our main website using &amp;#x201C;Sphinx&amp;#x201D;\nin 2010 Jody ported the tutorials from open office to Sphinx.\nIn 2011 Jody finished the Job.\n
  12. In 2009 we set up our main website using &amp;#x201C;Sphinx&amp;#x201D;\nin 2010 Jody ported the tutorials from open office to Sphinx.\nIn 2011 Jody finished the Job.\n
  13. The wiki was a great way to pass around small java code examples.\n\nDid they compile? Not really. Could you tell when they were written? Or what version of GeoTools they worked on?\n\nOnce again no.\n
  14. The wiki was a great way to pass around small java code examples.\n\nDid they compile? Not really.\n\nCould you tell when they were written? Or what version of GeoTools they worked on?\n\nOnce again no.\n
  15. The wiki was a great way to pass around small java code examples.\n\nDid they compile? Not really.\n\nCould you tell when they were written? Or what version of GeoTools they worked on?\n\nOnce again no.\n
  16. \n
  17. This is the origional diagram made for a presentation at FOSS4G 2006 (Done in Viso so nobody could really edit it)\n
  18. All diagrams are now done in SVG using Inkscape (so that any developer can update them as needed).\n
  19. Class diagrams were uploaded to the wiki using a range of tools.&amp;#xA0;\n\nThis often allowed the class diagrams to fall behind the current state of the library - providing oppertunity for confusion.\n
  20. Class diagrams are created using &quot;ObjectAID&quot; directly from the java classes or interfaces involved.\n\nThe diagrams are committed directly into source code and are&amp;#xA0;set to&amp;#xA0;automatically&amp;#xA0;generate the PNG file used in the documentations if they are modified.\n\nThis allows us to give you accurate and up to date diagrams.\n
  21. In the past the creation of Tutorials for GeoTools was a bit add-hoc.\n\nBasically when Jody Got a workshop accepted at FOSS4G.\n\nThese would also gradually go out of date. As the versions of Java, Maven and Eclipse used changed over time.\n
  22. Tutorials now documented in &quot;sphinx&quot; giving us a chance to splice in live code examples that do not go out fo date.\n\nOrigional done for FOSS4G 2010 their long term stability showed the viability of using Sphinx for GeoTools.\n
  23. \n
  24. Extensive welcome section\n
  25. \n
  26. \n
  27. \n
  28. \n
  29. Andrea has been working hard on referencing; as you can see he really believes in this being a developer friendly presentation - with source code examples!\n\nThe key thing about &amp;#x201C;referencing&amp;#x201D; information is the rich set of data structures used to mark down what your information should be used; and the helpful way we have isolated you from the internal details (ie Math) using utility classes such as CRS, JTS and ReprojectingFeatureCollection.\n
  30. A quick list of some of the traditional projects available to GeoTools developers.\n
  31. \n
  32. The important part here is to note the number of new entries being added to GeoTools.\n\nItems marked in grey are considered unsupported (often they are an experiment; or represent code that does not have an active maintenance contract).\n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. The number of layers you can work with is now &amp;#x201C;open ended&amp;#x201D; with the ability to define your own implementation of &amp;#x201C;Direct Layer&amp;#x201D;. This class hierarchy is an improvement in that each kind of layer is represented a distinct class.\n
  42. \n
  43. \n
  44. \n
  45. \n
  46. The ability to define your own symbology and &amp;#x201C;plug&amp;#x201D; it into the rendering engine is really being taken advantage of in GeoTools. Here we have a quick example of using a true type font.\n
  47. The feature is often used by teams implementing MIL2525B symbology. A popular example from the GeoServer cookbook is the &amp;#x201C;Slash&amp;#x201D; shown above.\n
  48. All of this is backed by a Java interface so can connect the geotools renderer to any set of symbology you have in your possession; or create a symbol dynamically on the fly by accessing feature attributes.\n
  49. Another feature that is starting to gain traction is the use of functions to transform a geometry prior to display. In this example the technique is used to create arrow heads.\n\n
  50. Another example used to create a drop shadow effect; by offsetting the geometry.\n
  51. You can create a function quickly as shown above; you need to &amp;#x201C;Register&amp;#x201D; it in META-INF/services by adding the name of your class to the appropriate text file.\n
  52. \n
  53. \n
  54. \n
  55. If you would like to read more try the FAQ http://docs.geotools.org/latest/userguide/library/xml/faq.html\n
  56. \n
  57. \n
  58. \n
  59. \n
  60. http://how2map.blogspot.com/2011/04/classifiers-and-colorbrewer.html\n
  61. \n
  62. \n
  63. Check out the GeoTools docs for a tutorial coming soon!\n
  64. \n
  65. We mentioned this one earlier!\n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. Part of keeping GeoTools in fighting shape is cutting off the cruft.\n\nWe have been diligent about allowing full deprecation cycle allowing projects to transition to the JDBC &quot;next generation&quot; datastore based on a much cleaner design.\n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n