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/

Tuesday, January 03, 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 Geotools2
{
  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);
    Filter filter = ff.equals(
      ff.property("NAME"),
      ff.literal("JAPAN")
    );
    SimpleFeatureCollection sfc = fs.getFeatures(filter);

    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("japan.jpg"));
  }
}

出力画像

動作環境
JDK7 Update1, geotools 2.7.4

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

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

Monday, January 02, 2012

GeoToolsで指定した地点に四角マークを描画する

GeoToolsで指定した地点に四角マークを描画するには、以下のコードを実行します。
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import javax.imageio.*;
import org.geotools.data.*;
import org.geotools.data.shapefile.*;
import org.geotools.data.simple.*;
import org.opengis.filter.*;
import org.geotools.factory.*;
import org.geotools.feature.*;
import org.geotools.feature.simple.*;
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.feature.type.*;
import org.opengis.referencing.crs.*;
import com.vividsolutions.jts.geom.*;

public class Geotools13
{
  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);
    Filter filter = ff.equals(
      ff.property("NAME"),
      ff.literal("JAPAN")
    );
    SimpleFeatureCollection sfc = fs.getFeatures(filter);

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

    //スタイルを作成
    StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
    // ポリゴンの線の色
    org.geotools.styling.Stroke stroke1 = sf.createStroke(
      ff.literal(new Color(0x59, 0x58, 0x55)),
      ff.literal(1)
    );
    // ポリゴンの塗りつぶし色
    org.geotools.styling.Fill fill1 = sf.createFill(
      ff.literal(new Color(0xD2, 0xDB, 0xD5))
    );
    PolygonSymbolizer sym1 = sf.createPolygonSymbolizer(stroke1, fill1, null);

    // フィルタに一致する場合のルールを作成
    Rule rule1 = sf.createRule();
    rule1.symbolizers().add(sym1);
    rule1.setFilter(filter);
    Rule rules[] = {rule1};
    FeatureTypeStyle fts = sf.createFeatureTypeStyle(rules);
    Style style1 = sf.createStyle();
    style1.featureTypeStyles().add(fts);

    map.addLayer(new FeatureLayer(sfc, style1));

    // --------------------------------------------------
    // 別のレイヤーを作成
    // ポイント用のタイプを作成
    SimpleFeatureType pointtype = DataUtilities.createType(
      "Location", 
      "the_geom:Point," + 
      "name:String"
    );
    SimpleFeatureBuilder sfb = new SimpleFeatureBuilder(pointtype);

    // 札幌を示すポイントを作成
    // 経度
    double longitude = 140.0811767578125d;
    // 緯度
    double latitude = 42.90816007196054d;
    GeometryFactory gf = JTSFactoryFinder.getGeometryFactory(null);
    com.vividsolutions.jts.geom.Point point = gf.createPoint(new Coordinate(longitude, latitude));
    sfb.add(point);
    sfb.add("sapporo");

    SimpleFeatureCollection col = FeatureCollections.newCollection();
    SimpleFeature feature1 = sfb.buildFeature(null);
    col.add(feature1);

    // マーカーの線
    org.geotools.styling.Stroke stroke2 = sf.createStroke(
      ff.literal(new Color(0xC8, 0x46, 0x63)),
      ff.literal(3)
    );
    // マーカーの塗りつぶし色
    org.geotools.styling.Fill fill2 = sf.createFill(ff.literal(new Color(0xff, 0xC8, 0x61)));

    // マーカーの形
    Mark mark = sf.getSquareMark();
    mark.setFill(fill2);
    mark.setStroke(stroke2);

    Graphic graphic = sf.createDefaultGraphic();
    graphic.graphicalSymbols().clear();
    graphic.graphicalSymbols().add(mark);
    graphic.setSize(ff.literal(18));

    GeometryDescriptor geomDesc = fs.getSchema().getGeometryDescriptor();
    String geometryAttributeName = geomDesc.getLocalName();
    PointSymbolizer sym2 = sf.createPointSymbolizer(graphic, geometryAttributeName);

    Rule rule2 = sf.createRule();
    rule2.symbolizers().add(sym2);
    Rule rules2[] = {rule2};
    FeatureTypeStyle fts2 = sf.createFeatureTypeStyle(rules2);
    Style style2 = sf.createStyle();
    style2.featureTypeStyles().add(fts2);
    // レイヤーとして追加
    map.addLayer(new FeatureLayer(col, style2));

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

    int width = 400;
    ReferencedEnvelope bounds = map.getLayerBounds();
    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("sapporo.jpg"));
  }
}

出力画像

動作環境
JDK7 Update1, geotools 2.7.4

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

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

Sunday, January 01, 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 Geotools4
{
  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);
    Filter filter = ff.equals(
      ff.property("NAME"),
      ff.literal("JAPAN")
    );
    SimpleFeatureCollection sfc = fs.getFeatures(filter);

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

    // 線の色を水色にするスタイルを作成
    StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
    org.geotools.styling.Stroke stroke = sf.createStroke(
      ff.literal(new Color(0x77, 0x99, 0xdd)),
      ff.literal(2)
    );
    LineSymbolizer sym = sf.createLineSymbolizer(stroke, null);

    Rule rule = sf.createRule();
    rule.symbolizers().add(sym);
    Rule rules[] = {rule};
    FeatureTypeStyle fts = sf.createFeatureTypeStyle(rules);
    Style style = sf.createStyle();
    style.featureTypeStyles().add(fts);

    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("linecolor.jpg"));
  }
}

出力画像

動作環境
JDK7 Update1, geotools 2.7.4

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

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

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.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 Geotools1
{
  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();
    SimpleFeatureType schema = fs.getSchema();
    CoordinateReferenceSystem crs = 
      schema.getGeometryDescriptor().getCoordinateReferenceSystem();
    MapLayer layers[] = {};
    DefaultMapContext map = new DefaultMapContext(layers, crs);

    // スタイルを作成
    Style style = SLD.createSimpleStyle(schema);
    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("world.jpg"));
  }
}

出力画像

動作環境
JDK7 Update1, geotools 2.7.4

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

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

Monday, July 04, 2011

JMagickまとめ

画像操作・変形


画像の大きさを変更する
画像を回転させる
画像を上下・左右にスクロールさせる
画像の上下反転左右反転をする
画像をかたむける
画像を波型に揺らす

パターン生成


プラズマフラクタル画像を生成する
画像をタイル配置する
ビルトインパターンの画像を生成する

グラデーション


グラデーション画像を生成する
バンド状のグラデーションを描画する
画像の指定した点から円形のバンド状に明るさを変える

グレースケール・明度・彩度


画像を2値化する
2値化した画像の黒色部分の色を変え白色分を透明にする
画像をグレースケールに変換する
マスクした部分を白黒にする
画像の彩度を右方向へ徐々に落とす
画像のコントラストを上げる
明度・彩度・色相を変更する

画像処理


画像を油絵調に変換する
画像を木炭画調に変換する
画像に色を着色する
画像のエッジ抽出をする
メディアンフィルタを適用する
画像の色を減色する
画像をセピア調っぽく変換する

画像描画


JMgickで角丸四角を描画する
画像の上に文字列を描画する
タイルパターンの文字列を描画する
手塗り風の四角を描画する

切り取り


画像を丸く切り取る
画像の一部を四角に切り取る
画像を角丸四角に切り取る
画像を切り落とす

重ね合わせ


画像を重ね合わせる
画像を半透明にして重ね合わせる
半透明の青いぼかしを重ね合わせる

その他


画像の端を暗くする
画像を2値化してメッシュ状にした透過PNGを生成する
画像の輪郭を影で浮かび上がらせた画像を生成する
画像の端がかすれたような処理をする
画像をビデオ風にする
文字列画像を作成する
画像に枠をつける
アニメーションGIFを出力する
画像のqualityを指定して保存する
ImageMagickをJavaから使用するための設定(JMagickインストール)

Wednesday, June 22, 2011

groovyとJOGLのまとめ

ワイヤーフレームの描画


ワイヤーフレームの立方体を描画する
ワイヤーフレームの円錐を描画する
ワイヤーフレームの円柱を描画する
ワイヤーフレームのティーポットを描画する
ワイヤーフレームの球を描画する
ワイヤーフレームのドーナツ型を描画する
ワイヤーフレームのひし形12面体を描画する
ワイヤーフレームのティーポットを描画する
ワイヤーフレームの4面体を描画する
ワイヤーフレームの8面体を描画する
ワイヤーフレームの20面体を描画する
ワイヤーフレームの12面体を描画する
ワイヤーフレームの四角を描画する
ワイヤーフレームの線の太さを指定する
線のスタイルを指定する
ワイヤフレームにアンチエイリアスをかける
2つのワイヤーフレームの立方体を重ね書きする

基本形状の描画


立方体を描画する
円錐を描画する
円柱を描画する
球を描画する
ティーポットを描画する
ひし形12面体を描画する
4面体を描画する
8面体を描画する
12面体を描画する
20面体を描画する
ドーナツ型を描画する

テクスチャ


テクスチャの張られたポリゴンを描画する
背景テクスチャの上にポリゴンを描画する
ポリゴンに繰り返しテクスチャを貼り付ける
球にテクスチャをマッピングする

質感・光源・効果


質感を設定する
半透明のティーポットを描画する
スポットライトを使用する
光源を設定する
フラットシェーディングの球を描画する
フォグをつけてレンダリングする

ポリゴン


市松模様の面を描画する
凹んだポリゴンを描画する
円弧を描画する
円盤を描画する

文字列の描画


文字列を描画する
ビットマップ文字列を描画する
ストロークフォントの文字列を描画する
複数の球の文字列を描画する

その他描画


つぶれた球を描画する
樽の形を描画する
立方体の市松模様を描画する
球が輪のようになった画像を描画する
球状に配置された立方体を描画する
複数の直方体を凸凹に配置する
少しずつ回転させた複数の立方体を描画する
画像を放射状に配置する
円柱がウニのように広がった画像を作成する
ピラミッドを描画する
複数の直方体の山を描画する
複数の直方体をスプリング状に配置する
複数の立方体を渦巻状に描画する
JOGLとJOGLでワイヤーフレームとポリゴンの球を描画する

Thursday, June 16, 2011

pycairoのまとめ

図形の描画


pycairoで四角形を描画する


pycairoで円を描画する



pycairoでビットマップイメージを描画する



pycairoで点線を描画する



pycairoで線色と塗りつぶし色を指定して四角形を描画する



pycairoでラインキャップとラインジョインのタイプを指定する



pycairoで角丸四角を描画する



pycairoで回転した四角を描画する



pycairoでテクスチャで塗りつぶしをする



pycairoで半透明の四角を描画する


文字列の描画


pycairoで文字列を描画する


pycairoで日本語文字列を描画する



pycairoで文字列の領域を求める



pycairoでイタリックの文字列を描画する


グラデーションの使用



pycairoでグラデーションを描画する



pycairoで放射グラデーションを描画する



pycairoを使用して半透明放射グラデーションで画像を切り取る


画像処理


pycairoで画像をビデオ風に加工する


pycairoで画像をセピア調に変換する



pycairooで画像をグレースケールに変換する



pixbufでJPEGを読み込んでpycairoでPNGで保存する



pycairoで画像を三角形に切り取る



pycairoで画像を半透明に重ね合わせる



pycairoで画像にモザイクをかける



pycairoで画像を縮小する



pycairoで画像を左右反転させる



Pycairoで画像を上下反転させる



pycairoで角丸四角でクリッピングして画像を描画する


その他


pycairoをWindowsにインストール