Monday, January 09, 2012

GeoToolsで指定の国の色を変更する

GeoToolsで指定の国の色を変更するには、以下のコードを実行します。
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
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 Geotools6
{
  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();

    FilterFactory ff = CommonFactoryFinder.getFilterFactory2(null);
    SimpleFeatureType schema = fs.getSchema();
    CoordinateReferenceSystem crs = 
      schema.getGeometryDescriptor().getCoordinateReferenceSystem();
    MapLayer layers[] = {};
    DefaultMapContext map = new DefaultMapContext(layers, crs);

    //スタイルを作成
    StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
    // ポリゴンの線の色1
    org.geotools.styling.Stroke stroke1 = sf.createStroke(
      ff.literal(new Color(10, 20, 207)),
      ff.literal(1)
    );
    // ポリゴンの線の色2
    org.geotools.styling.Stroke stroke2 = sf.createStroke(
      ff.literal(new Color(47, 184, 27)),
      ff.literal(1)
    );
    // ポリゴンの塗りつぶし色1
    org.geotools.styling.Fill fill1 = sf.createFill(
      ff.literal(new Color(65, 195, 224))
    );
    // ポリゴンの塗りつぶし色2
    org.geotools.styling.Fill fill2 = sf.createFill(
      ff.literal(new Color(133, 255, 7))
    );
    PolygonSymbolizer sym1 = sf.createPolygonSymbolizer(stroke1, fill1, null);
    PolygonSymbolizer sym2 = sf.createPolygonSymbolizer(stroke2, fill2, null);

    // フィルタを作成
    Filter filter = ff.equals(
      ff.property("NAME"),
      ff.literal("AUSTRALIA")
    );
    // フィルタに一致する場合のルールを作成
    Rule rule1 = sf.createRule();
    rule1.symbolizers().add(sym1);
    rule1.setFilter(filter);

    Rule rule2 = sf.createRule();
    rule2.symbolizers().add(sym2);
    rule2.setElseFilter(true);

    Rule rules[] = {rule1, rule2};
    FeatureTypeStyle fts = sf.createFeatureTypeStyle(rules);
    Style style = sf.createStyle();
    style.featureTypeStyles().add(fts);

    map.addLayer(new FeatureLayer(fs, 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("fill_with_rule.jpg"));
  }
}

出力画像

動作環境
JDK7 Update1, geotools 2.7.4

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

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

No comments: