Alguns exemplos muito simples com GeoTools 2 Material adicional para a disciplina CAP365
Rafael Santos
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
1
A API GeoTools ● ● ● ●
● ● ●
Não é uma solução GIS. Permite o desenvolvimento de aplicações georeferenciadas. 100% Java: sem necessidade de instalação de .so ou .dll. Código aberto, implementa especificações do Open Geospatial Consortium (OGC). Base para outros projetos. Algumas de suas classes usam a API JAI. http://docs.codehaus.org/display/GEOTOOLS/Home
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
2
Exemplos – Dados
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
3
Hello World (1 de 2) package basic; import import import import import import
java.io.*; java.net.URL; org.geotools.data.FeatureSource; org.geotools.data.shapefile.ShapefileDataStore; org.geotools.feature.*; com.vividsolutions.jts.geom.Geometry;
public class ShapefileInfo { public static void main(String[] args) throws IOException { // Onde estão nossos shapefiles? String baseDir = "/home/rafael/Java/Geo/kernelestimator/WebContent/Shapefiles/"; // Criamos uma URL com o shapefile que nos interessa. URL s = new File(baseDir+"Brasil/55mu2500gc.shp").toURL(); // Criamos um DataStore a partir do Shapefile ShapefileDataStore data = new ShapefileDataStore(s); // O nome do DataStore é o próprio nome do Shapefile (só tem um) String nome = data.getTypeNames()[0];
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
4
Hello World (2 de 2)
}
// Recuperamos o schema para estes dados. FeatureType ft = source.getSchema(); // Imprimimos pares atributo/tipo for (int i=0; i
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
5
Hello World (resultados) Oct 14, 2006 6:31:43 PM org.geotools.data.shapefile.ShapefileDataStore openPrjReader WARNING: projection (.prj) for shapefile: file:/home/rafael/Java/Geo/kernelestimator/WebContent/Shapefiles/Brasil/55mu2500gc.shp is not available Oct 14, 2006 6:31:44 PM org.geotools.data.shapefile.ShapefileDataStore openPrjReader WARNING: projection (.prj) for shapefile: file:/home/rafael/Java/Geo/kernelestimator/WebContent/Shapefiles/Brasil/55mu2500gc.shp is not available 0: Geometry 1: Feature GEOCODIGO java.lang.Long 2: Feature NOME java.lang.String 3: Feature UF java.lang.String 4: Feature ID_UF java.lang.Long 5: Feature REGIAO java.lang.String 6: Feature MESOREGIAO java.lang.String 7: Feature MICROREGIA java.lang.String 8: Feature LATITUDE java.lang.String 9: Feature LONGITUDE java.lang.String 10: Feature SEDE java.lang.Boolean Temos 5807 features.
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
6
Visualização (1 de 5) package basic; import import import import import import import import import import
java.awt.*; java.awt.Dimension; java.awt.geom.AffineTransform; java.io.IOException; javax.swing.JComponent; org.geotools.data.shapefile.ShapefileDataStore; org.geotools.map.*; org.geotools.renderer.shape.ShapefileRenderer; org.geotools.styling.*; com.vividsolutions.jts.geom.*;
/** * Esta classe representa um componente gráfico capaz de desenhar o conteúdo * (geometria) de uma instância de ShapefileDataStore. */ public class ShapefileComponent extends JComponent { private ShapefileDataStore sds; private ShapefileRenderer renderer; private Envelope envelope; private final Coordinate center; private double zoom; private final int width = 640; private final int height = 640;
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
7
Visualização (2 de 5) public ShapefileComponent(ShapefileDataStore sds) throws IOException { this.sds = sds; // Criamos um Style StyleBuilder sb = new StyleBuilder(); // Criamos símbolos para a linha LineSymbolizer lineSymb = (LineSymbolizer) sb.createLineSymbolizer(Color.RED, 1); Style style = sb.createStyle(lineSymb); // Criamos um MapContext com os dados e um estilo MapContext mc = new DefaultMapContext(); mc.addLayer(sds.getFeatureSource(),style); // Agora com o contexto criamos um ShapefileRenderer renderer = new ShapefileRenderer(mc); envelope = mc.getLayerBounds(); center = new Coordinate((envelope.getMinX()+envelope.getMaxX())/2, (envelope.getMinY()+envelope.getMaxY())/2); zoom = 1; } public Dimension getMaximumSize()
{ return getPreferredSize(); }
public Dimension getMinimumSize()
{ return getPreferredSize(); }
public Dimension getPreferredSize() { return new Dimension(width,height); }
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
8
Visualização (3 de 5) protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.WHITE); g2d.fillRect(0,0,width,height); // Uma AffineTransform que mapeie dados no shapefile com a área para plotagem AffineTransform at = new AffineTransform(); // Calculamos a escala double escala = (Math.min(getWidth()/envelope.getWidth(), getHeight()/envelope.getHeight()) *zoom); // Fazemos a translação para o centro do componente. at.translate (getWidth()/2,getHeight()/2); // Mudamos a escala vertical para corrigir a orientação. at.scale(escala,-escala); // Fazemos a translação para o centro da geometria. at.translate(-center.x,-center.y); // Pintamos a geometria no componente. renderer.paint(g2d,getBounds(),at); } }
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
9
Visualização (4 de 5) package basic; import import import import
java.io.*; java.net.URL; javax.swing.JFrame; org.geotools.data.shapefile.ShapefileDataStore;
public class DisplayShapefile extends JFrame { public DisplayShapefile(URL s) throws IOException { super("Shapefile"); ShapefileDataStore data = new ShapefileDataStore(s); ShapefileComponent sc = new ShapefileComponent(data); getContentPane().add(sc); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); }
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
10
Visualização (5 de 5) public static void main(String[] args) throws IOException { // Onde estão nossos shapefiles? String baseDir = "/home/rafael/Java/Geo/kernelestimator/WebContent/Shapefiles/"; // Criamos uma URL com o shapefile que nos interessa. URL s = new File(baseDir+"Brasil/55mu2500gc.shp").toURL(); // Criamos a GUI para mostrar este Shapefile como um componente. new DisplayShapefile(s); } }
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
11
Problemas ●
●
O projeto é relativamente maduro, muitos colaboradores ativos. Versões atuais ainda de transição. – –
●
A documentação das APIs não está disponível no momento! –
●
2.2 sugerida para novos projetos, 2.3 em preparo. Exemplos e tutoriais podem não ser boas referências...
Para versão 2.2.1, arquivo com JavaDocs está corrompido.
Documentação sobre modelos faz muita referência a documentos do OGC. –
Dificuldades para os “nãoiniciados”.
Outubro/2006
http://www.lac.inpe.br/~rafael.santos
12