Thursday, January 05, 2012

GeoToolsで世界地図からOR条件で複数国をフィルタリングして描画する

GeoToolsで世界地図からOR条件で複数国をフィルタリングして描画するには、以下のコードを実行します。
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.imageio.*;
import org.geotools.data.shapefile.*;
import org.geotools.data.simple.*;
import org.opengis.filter.*;
import org.geotools.factory.*;
import org.geotools.geometry.jts.*;
import org.geotools.map.*;
import org.geotools.renderer.lite.*;
import org.geotools.styling.*;
import org.opengis.feature.simple.*;
import org.opengis.referencing.crs.*;

public class Geotools3
{
  public static void main(String args[])
    throws Exception
  {
    URL url = new URL("file://C:/share/geotools/world.shp");
    ShapefileDataStore shapefile = new ShapefileDataStore(url);

    SimpleFeatureSource fs = shapefile.getFeatureSource();

    // OR条件で複数の国をフィルタリング
    FilterFactory ff = CommonFactoryFinder.getFilterFactory2(null);
    java.util.List<Filter> filters = new ArrayList<Filter>();
    filters.add(ff.equals(
      ff.property("NAME"),
      ff.literal("UNITED STATES")
    ));
    filters.add(ff.equals(
      ff.property("NAME"),
      ff.literal("CANADA")
    ));
    filters.add(ff.equals(
      ff.property("NAME"),
      ff.literal("JAPAN")
    ));
    Filter countries = ff.or(filters);
    SimpleFeatureCollection sfc = fs.getFeatures(countries);

    SimpleFeatureType schema = sfc.getSchema();
    CoordinateReferenceSystem crs = 
      schema.getGeometryDescriptor().getCoordinateReferenceSystem();
    MapLayer layers[] = {};
    DefaultMapContext map = new DefaultMapContext(layers, crs);

    // スタイルを作成
    Style style = SLD.createSimpleStyle(schema);
    map.addLayer(new FeatureLayer(sfc, style));

    // レンダリング
    StreamingRenderer renderer = new StreamingRenderer();
    renderer.setContext(map);

    int width = 400;
    ReferencedEnvelope bounds = map.getMaxBounds();
    Rectangle rect = new Rectangle(0, 0, width, 
      (int)(width * bounds.getHeight() / bounds.getWidth()));

    BufferedImage image = new BufferedImage((int)rect.width, 
      (int)rect.height, 
      BufferedImage.TYPE_INT_RGB);
    Graphics2D gr = image.createGraphics();
    gr.setPaint(Color.WHITE);
    gr.fill(rect);
    renderer.paint(gr, rect, bounds);

    ImageIO.write(image, "jpeg", new File("countries.jpg"));
  }
}

出力画像

動作環境
JDK7 Update1, geotools 2.7.4

関連情報
・GeoToolsのウェブサイト
http://geotools.org/

※世界地図のシェイプファイルは以下からダウンロード
World map for APRS
http://aprsworld.net/gisdata/world/

No comments: