2011年11月28日月曜日

groovyとgeotoolsで線の色と太さを指定する

groovyとgeotoolsで線の色と太さを指定するには、以下のコードを実行します。
import java.awt.*
import java.awt.image.*
import javax.imageio.*
import org.geotools.data.shapefile.*
import org.geotools.factory.*
import org.geotools.filter.*
import org.geotools.map.*
import org.geotools.renderer.lite.*
import org.geotools.styling.*

url = new URL("file://C:/share/geotools/world.shp")
shapefile = new ShapefileDataStore(url)

fs = shapefile.getFeatureSource()

// 国の名前でフィルタリング
ff = FilterFactoryFinder.createFilterFactory()
filter = ff.createCompareFilter(FilterType.COMPARE_EQUALS)
filter.addLeftValue(ff.createAttributeExpression("NAME"))
filter.addRightValue(ff.createLiteralExpression("JAPAN"))
fs = fs.getFeatures(filter)

schema = fs.getSchema()
crs = schema.getGeometryDescriptor().getCoordinateReferenceSystem()
map = new DefaultMapContext([] as MapLayer[], crs)

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

rule = sf.createRule()
rule.symbolizers().add(sym)
fts = sf.createFeatureTypeStyle([rule] as Rule[])
style = sf.createStyle()
style.featureTypeStyles().add(fts)

map.addLayer(new FeatureLayer(fs, style))

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

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

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

ImageIO.write(image, "jpeg", new File("linecolor.jpg"))

出力画像

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

※.groovy/libからGROOVY_HOME/libにgeotools-2.7.3-bin.zipに
含まれるjarをコピーする

動作環境
groovy 1.8.2, JDK6 Update27, GeoTools 2.7.3

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

0 件のコメント:

コメントを投稿