Monday, November 26, 2012

GeoTools 8.4 Released

The GeoTools team is pleased to annonce the release of GeoTools 8.4, available for download from SourceForge:
This release is also deployed to the OSGeo Maven Repository. For more information on setting up your project with Maven consult the Quickstart.

About GeoTools 8.4

GeoTools 8.4 is primarily a bug fix release containing some good fixes:
  • [GEOT-4161] - UOM based symbolizers should not be affected by DPI rescaling
  • [GEOT-4293] - Nullpointer from FeatureHandler from FeatureJson
  • [GEOT-4311] - Relative url in external graphic doesn't resolve
  • [GEOT-4186] - Avoid NPE when calling ExternalGraphics.setLocation() with a null location
  • [GEOT-4269] - Harden Renderer calculateScale routine against bad source CRSes
  • [GEOT-4301] - A fix for the missing CRS info on the parsed GML2 document
  • [GEOT-4040] - Support PostgreSQL 9 hex bytea output format to avoid massive data corruption
A number of these improvements came in from the community via GitHub pull request:
We would like thank Milton Jonathan, Gerson Gerlang, Davide Savazzi, Sebastian Graca for their contributions. 

Upgrading from GeoTools 2.7

For those migrating from GeoTools 2.7, upgrade instructions are available. No additional GeoTools 2.7 released are scheduled. 

Thanks for using GeoTools.

Friday, November 16, 2012

FeatureCollection cleanup

The FeatureCollection cleanup proposal is now complete. The first batch of work went into the GeoTools 8.0 release, this second phase removes several methods from FeatureCollection. These methods were not widely implemented, and as a result not adopted by client code.
Upgrade instructions are available: As part of this work Andrea provided an extensive review of the existing FeatureCollection implementations and a number of utility methods have been introduced to make working with features easier:
  • DataUtilities.visit( FeatureCollection, FeatureVisitor, ProgerssListener )
  • DataUtilities.bounds( FeatureCollection ) // Already existed
  • DataUtilities.bounds( FeatureIterator )
  • DataUtilities.count( FeatureCollection )
  • DataUtilities.count( FeatureIterator )
  • DataUtilities.close( Iterator )
  • DataUtilities.first( SimpleFeatureCollection ): SimpleFeature
  • DataUtilities.first( FeatureCollection ): F
  • DataUtilities.list( FeatureCollection ): List  // Already existed 
  • DataUtilities.list( FeatureCollection, int ): List
  • DataUtilities.iterator( FeatureIterator ): Iterator // also Closable 
  • DataUtilities.collectionCast( FeatureCollection ): Collection
For additional information, and an overview of the FeatureCollection implementations please review the detailed change proposal.
If you cannot make the transition today:
  • A milestone 9.0-M0 release has been deployed to maven. 
  • To switch your maven pom.xml over to 9.0-M0:
  • You can use this milestone release as a rest area until you have time to upgrade.
One of the joys of working on a large stable project such as GeoTools is the gradual change of pace, and the careful planning that goes into keeping projects working together:
  • The initial GeoTools 2.0 rewrite provided a clear FeatureResults API acting in a fashion similar to a JDBC ResultSet.
  • GeoTools 2.1 introduced FeatureCollection as a superclass of FeatureResults, bringing in the java.util.Collection methods being removed today. This was motivated by an amusing Bring Back FeatureCollection rant from our founder James MacGill - well we tried James and it was a bad idea.
  • The transition to Java 5 forced us to remove direct use of the java.util.Collection interface, however we kept the methods for backwards compatibility. It was too easy to introduce a resource leak with the Java 5 for-each syntax:
for( Feature feature : featureCollection ){
    System.out.println( feature.getID() );
  • With todays change GeoTools programs are ready for the Java 7 try-with-resource syntax as shown below:
try( FeatureIterator iter=featureCollection.features() ){
   while( iter.hasNext() ){
        Feature feature =;
        System.out.println( feature.getID() );