/**
   * Salva BufferedImage no arquivo informado na prop<br>
   *
   * <p><b>Exemplo:><br>
   * <code>salvarImagem(img)</code>
   *
   * @param img BufferedImage a ser salva
   * @author roberto
   */
  private void salvarImagem(BufferedImage img) {

    ImageWriter writer = null;
    Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName(formatoImagem);

    if (iter.hasNext()) {

      writer = (ImageWriter) iter.next();
    }

    ImageOutputStream ios;
    try {

      ios = ImageIO.createImageOutputStream(new File(prop.getProp("dirImg")));
      writer.setOutput(ios);

      ImageWriteParam param = new JPEGImageWriteParam(java.util.Locale.getDefault());
      param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
      param.setCompressionQuality(1);

      writer.write(null, new IIOImage(img, null, null), param);

    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /**
   * Gera imagem PNG tranparente com os pontos da collection do MongoDB<br>
   *
   * <p><b>Exemplo:><br>
   * <code>gerarImagemMongoDB(60)</code>
   *
   * @param nivelRio nivel atual do rio
   * @author roberto
   */
  public void gerarImagemMongoDB(Leitura leitura) throws UnknownHostException {

    int x, y = 0;

    // Tamanho dos blocos a serem preenchidos
    int tamBloco = 1;

    // Conecta ao MongoDB
    MongoClient mongoClient =
        new MongoClient(prop.getProp("mongoHost"), Integer.parseInt(prop.getProp("mongoPorta")));

    // Conecta ao banco selecionado
    DB db = mongoClient.getDB(prop.getProp("mongoDB"));

    // Conecta à collection
    DBCollection coll = db.getCollection("pontosMapa");
    DBCollection collAlturaRio = db.getCollection("alturaRio");

    // Pega altura 0 do rio
    DBCursor cursor = collAlturaRio.find();
    double alturaRioZero = 0;
    while (cursor.hasNext()) {
      DBObject doc = cursor.next();
      alturaRioZero = Double.parseDouble(doc.get("alturaRio") + "");
    }

    // Captura quantidade de pontos de latitude
    // Comando no MongoDB = db.pontosMapa.distinct('lat').length
    List<?> listaLat = coll.distinct("lat");
    int sizeLat = listaLat.size();

    // Captura quantidade de pontos de latitude
    // Comando no MongoDB = db.pontosMapa.distinct('lng').length
    List<?> listaLng = coll.distinct("lng");
    int sizeLng = listaLng.size();

    // Prepara tamanho do arquivo
    int X = sizeLng;
    int Y = sizeLat;

    double[] elevacoes = new double[X * Y];

    // Preenche um array com as elevações
    cursor = coll.find();
    int cont = 0;
    while (cursor.hasNext()) {
      DBObject doc = cursor.next();
      elevacoes[cont] = Double.parseDouble(doc.get("elevacao") + "");

      cont++;
    }

    // Prepara imagem de saida
    BufferedImage image =
        new BufferedImage(tamBloco * X, tamBloco * Y, BufferedImage.TYPE_INT_ARGB);
    Graphics g = image.getGraphics();

    // Varre o array de elevacoes preenchendo o mapa
    cont = 0;
    for (int i = 0; i < Y; i++) {

      for (int j = 0; j < X; j++) {

        x = i * tamBloco;
        y = j * tamBloco;

        // Define cor do bloco
        if (elevacoes[cont] > (alturaRioZero + leitura.getNivelRio())) {

          g.setColor(new Color(0, 0, 0, 0));
        } else {

          g.setColor(new Color(0, 0, 1, opacidadeBloco));
        }

        // Pinta bloco
        g.fillRect(y, x, tamBloco, tamBloco);

        cont++;
      }
    }

    g.dispose();

    salvarImagem(image);
  }