import java.awt.*; import java.awt.image.*; import java.io.*; import java.net.*; import java.util.*; 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.*; 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.geometry.coordinate.*; import org.opengis.referencing.crs.*; import com.vividsolutions.jts.geom.*; public class Geotools16 { 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:LineString," + "name:String" ); SimpleFeatureBuilder sfb = new SimpleFeatureBuilder(pointtype); // 東京を示すポイントを作成 // 経度 double longitude1 = 139.6917064d; // 緯度 double latitude1 = 35.6894875d; // 那覇を示すポイントを作成 // 経度 double longitude2 = 127.67898559570312d; // 緯度 double latitude2 = 26.19364441820758d; com.vividsolutions.jts.geom.GeometryFactory gf = JTSFactoryFinder.getGeometryFactory(null); Coordinate cords[] = { new Coordinate(longitude1, latitude1), new Coordinate(longitude2, latitude2) }; com.vividsolutions.jts.geom.LineString lineseg = gf.createLineString(cords); sfb.add(lineseg); sfb.add("tokyo and naha"); 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) ); GeometryDescriptor geomDesc = fs.getSchema().getGeometryDescriptor(); String geometryAttributeName = geomDesc.getLocalName(); LineSymbolizer sym2 = sf.createLineSymbolizer(stroke2, 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("tokyo_and_naha.jpg")); } }出力画像
動作環境
JDK7 Update1, geotools 2.7.4
関連情報
・GeoToolsのウェブサイト
http://geotools.org/
※世界地図のシェイプファイルは以下からダウンロード
World map for APRS
http://aprsworld.net/gisdata/world/