7 votos

Cómo dibujar polígonos en un mapa existente?

Si quieres un mapa con algunos círculos, cuadrados, etc. que representan las ciudades o algo más que usted puede utilizar el código siguiente.

Tenga en cuenta que puede cambiar el mapa y las coordenadas con el suyo, y tendrás tu propio mapa en una aplicación java!

import java.awt.Color;
import java.net.URL;
import org.geotools.data.DataUtilities;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.FeatureCollections;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.map.FeatureLayer;
import org.geotools.map.MapContent;
import org.geotools.renderer.lite.StreamingRenderer;
import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.Graphic;
import org.geotools.styling.Mark;
import org.geotools.styling.PointSymbolizer;
import org.geotools.styling.PolygonSymbolizer;
import org.geotools.styling.Rule;
import org.geotools.styling.Style;
import org.geotools.styling.StyleBuilder;
import org.geotools.styling.StyleFactory;
import org.geotools.swing.JMapFrame;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.feature.type.GeometryDescriptor;
import org.opengis.filter.FilterFactory;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;

public class MyGIS{
    public static void main(String[] args) {
        try {
            usingFeatureCaching();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void usingFeatureCaching() throws Exception {

        //Shape-file's path
        URL url = new URL("file://C:/PE/Italia/reg2011_g.shp");
        ShapefileDataStore shapefile = new ShapefileDataStore(url);

        // Creates a map and adds the shapefile
        MapContent map = new MapContent();

        //Set's windows title
        map.setTitle("Italy");

        //Creates the map style
        StyleBuilder styleBuilder = new StyleBuilder();
        PolygonSymbolizer restrictedSymb = styleBuilder.createPolygonSymbolizer(Color.LIGHT_GRAY, Color.BLACK, 0);

        //Sets opacity
        restrictedSymb.getFill().setOpacity(styleBuilder.literalExpression(0.5));
        org.geotools.styling.Style myStyle = styleBuilder.createStyle(restrictedSymb);

        //Adds another layer to the map     
        FeatureLayer layer = new FeatureLayer(shapefile.getFeatureSource(), myStyle);
        map.addLayer(layer);

        //-------------------------- BUILDS THE CIRCLE ON THE MAP ------------------------------------------//

        StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
        FilterFactory ff = CommonFactoryFinder.getFilterFactory2();

        SimpleFeatureSource fs = shapefile.getFeatureSource();

        SimpleFeatureType pointtype = DataUtilities.createType("Location", "the_geom:Point," + "name:String");

        SimpleFeatureBuilder sfb = new SimpleFeatureBuilder(pointtype);

        double longitude = 537319.7867d;
        double latitude = 5062350.2792d;

        GeometryFactory geometryFactory= JTSFactoryFinder.getGeometryFactory(null);
        com.vividsolutions.jts.geom.Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));
        sfb.add(point);

        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)),
                //circle thickness
                ff.literal(1)
        );

        org.geotools.styling.Fill fill2 = sf.createFill(
                ff.literal(new Color(0xff, 0xC8, 0x61)));

        map.setTitle("Italia");


        //Type of symbol
        Mark mark = sf.getCircleMark();

        mark.setFill(fill2);
        mark.setStroke(stroke2);

        Graphic graphic = sf.createDefaultGraphic();
        graphic.graphicalSymbols().clear();
        graphic.graphicalSymbols().add(mark);

        //circle dimension on the map
        graphic.setSize(ff.literal(5));

        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.setMapContent(map);

        //Shows the map 
        JMapFrame.showMap(map);
    }
}

Este es el resultado del código:

The code's result

PS: Aquí usted puede encontrar el proyecto completo, ¡a disfrutar!

4voto

steffan Puntos 330

He creado hace un tiempo un método para dibujar puntos en una capa de georeferenciadas flickr fotos. Se demuestra que, básicamente, de cómo crear un FeatureLayer con la costumbre de los puntos de

public Layer getFlickrLayer(){

    SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();

    b.setName( "pictures" );
    b.setCRS( DefaultGeographicCRS.WGS84 ); 
    //picture location
    b.add( "geom", Point.class );
    //picture url
    b.add( "url", String.class );

    final SimpleFeatureType TYPE = b.buildFeatureType();

    SimpleFeatureCollection collection = FeatureCollections.newCollection("internal");
    WKTReader2 wkt = new WKTReader2();

    for(Photo currentPhoto : this.photoList){

        float lat = currentPhoto.getGeoData().getLatitude();
        float lng = currentPhoto.getGeoData().getLongitude();

        try {
            collection.add( SimpleFeatureBuilder.build( TYPE, new Object[]{ wkt.read("POINT("+lng+" "+lat+")"), "<<"+currentPhoto.getSmallUrl()+">>"}, null) );
        } catch (ParseException e) {

            e.printStackTrace();
        }
    }
    Style style = SLD.createPointStyle("Star", Color.BLUE, Color.BLUE, 0.3f, 15);

    Layer flickrLayer = new FeatureLayer(collection, style);

    flickrLayer.setTitle("flickr layer");

    return flickrLayer;

}

Como se puede ver el SimpleFeatureBuilder puede ser utilizado para crear puntos. Sólo tiene que utilizar su propio lat y lng valores y eliminar la dirección url de la imagen y crea una capa con sus propios puntos. También he creado un estilo para los puntos. Usted puede simplemente añadir esta capa a un mapa ya existente.

En caso de no necesitar más compleja función de los puntos puede ser creado sin el bien conocido método de texto.

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();

Coordinate coordinates = new Coordinate(lat, lng);
Point point = geometryFactory.createPoint(coordinates);

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X