2015-12-02 2 views
0

Я использую GeoTools 14.1GeoTools - рисунок точек на изображении

Я пытаюсь построить на изображении несколько точек

Это код, я использую:

double[][] points = new double[8][2]; 
    points[0] = new double[]{45.46433710338643, 9.190417528152478}; 
    points[1] = new double[]{45.46195085146914, 9.189746320685355}; 
    points[2] = new double[]{45.460062304163635, 9.19015527826191}; 
    points[3] = new double[]{45.472950871127445, 9.17363731952788}; 
    points[4] = new double[]{45.4737153001908,9.203728795018847}; 
    points[5] = new double[]{45.4849795331724,9.20162835217198}; 
    points[6] = new double[]{45.48560542313713,9.195953607559215}; 
    points[7] = new double[]{45.48348421787171,9.188765287399292}; 
    final SimpleFeatureType TYPE = DataUtilities.createType("Location", 
          "location:Point:srid=3857,"+// <- the geometry attribute: Point type 
          "nome:String," + // <- a String attribute 
          "id:Integer" // a number attribute 
        ); 
    FeatureCollection<SimpleFeatureType, SimpleFeature> collection = new DefaultFeatureCollection(); 
    GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null); 
    SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE); 
    CoordinateReferenceSystem pointSrc = CRS.decode("EPSG:4326"); 
    CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:3857"); 
    MathTransform transform = CRS.findMathTransform(pointSrc, targetCRS); 
    for (int i = 0; i < points.length; i++) 
    { 
    double[] coords = points[i]; 
    Point point = geometryFactory.createPoint(new Coordinate(coords[0], coords[1])); 
    Point converted = (Point) JTS.transform(point, transform); 
    featureBuilder.add(converted); 
    featureBuilder.add("Punto "+i); 
    featureBuilder.add(i); 
    SimpleFeature feature = featureBuilder.buildFeature(""+i); 
    logger.info(""+feature+" feature.getDefaultGeometry() "+feature.getDefaultGeometry()+ " feature.getDefaultGeometryProperty() "+feature.getDefaultGeometryProperty()); 
    ((DefaultFeatureCollection)collection).add(feature);     
    } 
    String wellKnownName = "Circle"; 
    Style style = SLD.createPointStyle(wellKnownName,Color.RED,Color.RED,0f,10f); 
    FeatureLayer fl = new FeatureLayer(collection, style); 
    fl.setVisible(true); 
    fl.setSelected(true); 
    logger.info(""+fl); 
    mapcontent.addLayer((org.geotools.map.Layer)fl);      //"1010177.1917802,5688070.7096562,1029133.5747922,5704122.4855938" 
    ReferencedEnvelope bounds = new ReferencedEnvelope(1010177.1917802,1029133.5747922,5688070.7096562, 5704122.4855938, targetCRS); 
    BufferedImage ret = buildImage(mapcontent, 5000, 5000, bounds, Color.white); 
    ImageIO.write((RenderedImage) ret, "png", new File("/home/angelo/Scrivania/immagineResult.png")); 

Мне кажется, все правильно, но сгенерированное изображение не содержит смысла.

Это сформированный образ enter image description here

Как вы можете видеть, что все белые; Я ожидал только 8 красных кругов на изображении ... Есть ли какие-либо ошибки в моем коде? Я что-то делаю неправильно?

Спасибо Angelo

UPDATE: добавлен метод построения изображения

public BufferedImage buildImage(final MapContent map, final int imageWidth,final int imageHeight,ReferencedEnvelope bounds,Color bgcolor) { 
    GTRenderer renderer = new StreamingRenderer(); 
    renderer.setMapContent(map); 

    renderer.setMapContent(map); 
    Rectangle imageBounds = null; 
    ReferencedEnvelope mapBounds = bounds; 

    try { 
     if(bounds==null) mapBounds = map.getMaxBounds(); 

     imageBounds = new Rectangle(imageWidth, imageHeight); 
    } catch (Exception e) { 
     failed to access map layers 
     throw new RuntimeException(e); 
    } 

    BufferedImage image = new BufferedImage(imageBounds.width, imageBounds.height, BufferedImage.TYPE_4BYTE_ABGR); 

    Graphics2D gr = image.createGraphics(); 
    int type = AlphaComposite.SRC; 
    gr.setComposite(AlphaComposite.getInstance(type)); 

    Color c = new Color(bgcolor.getRed(), bgcolor.getGreen(), bgcolor.getBlue(), 0); 
    gr.setBackground(bgcolor); 
    gr.setColor(c); 
    gr.fillRect(0, 0, image.getWidth(), image.getHeight()); 
    type = AlphaComposite.SRC_OVER; 
    gr.setComposite(AlphaComposite.getInstance(type)); 
    try { 
     renderer.paint(gr, imageBounds, bounds); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    return image; 
} 
+0

Что находится в buildImage? это, кажется, ключевой метод –

+0

@iant Я добавил метод buildImage –

ответ

1

После много играть, я нашел эту проблему :-) Там не ошибка в коде! На самом деле в этом белом изображении есть 8 красных точек, но их очень сложно найти!

enter image description here

Как изображение выше показывает на 2000% увеличении (и панорамирование вдоль верхнего края), вы найдете точку (я предполагаю, что другие есть) - простой ответ либо сделать точек в 10 раз больше (100 пикселей) или изображение намного меньше (500x500), и в обоих случаях точки сразу видны.

+0

OMG :) ну повезло, не было ошибок (это странно :)) Мне нужно играть лучше с границами :) спасибо –

+0

Ваши оценки в порядке - это разрешение изображения, которое убивает вас –

Смежные вопросы