/**
   * Adds a map to the catalog into the right Mapset.
   *
   * <p>Note: this doesn't add the file. The file adding has to be done separately
   *
   * @param locationPath the path to the Location folder.
   * @param mapsetName the name of the Mapset into which to put the map.
   * @param mapName the name of the map to add.
   * @param mapType the format of the map to add.
   * @return the resource that has been added.
   */
  public static synchronized JGrassMapGeoResource addMapToCatalog(
      String locationPath, String mapsetName, String mapName, String mapType) {
    // URL mapsetId = JGrassMapsetGeoResource.createId(locationPath, mapsetName);

    JGrassMapsetGeoResource mapset = null;
    try {
      File locationFile = new File(locationPath);

      ID locationId = new ID(locationFile.toURI().toURL());
      URL mapsetUrl = JGrassMapsetGeoResource.createId(locationFile.getAbsolutePath(), mapsetName);
      ID mapsetId = new ID(mapsetUrl);
      ICatalog localCatalog = CatalogPlugin.getDefault().getLocalCatalog();
      mapset =
          localCatalog.getById(
              JGrassMapsetGeoResource.class, mapsetId, ProgressManager.instance().get());
      if (mapset == null) {
        // try with the service
        // URL locationId = JGrassService.createId(locationPath);
        JGrassService locationService =
            localCatalog.getById(JGrassService.class, locationId, ProgressManager.instance().get());
        mapset = locationService.getMapsetGeoresourceByName(mapsetName);
      }
    } catch (MalformedURLException e) {
      e.printStackTrace();
      String message = "An error occurred while adding the map to the catalog";
      ExceptionDetailsDialog.openError(null, message, IStatus.ERROR, JGrassPlugin.PLUGIN_ID, e);
    }
    if (mapset == null) return null;
    return mapset.addMap(mapName, mapType);
  }
  /**
   * Remove a map from the mapset in the catalog.
   *
   * <p>Note: this doesn't remove the file. The file removal has to be done separately
   *
   * @param locationPath the path to the Location folder.
   * @param mapsetName the name of the Mapset from which to remove the map.
   * @param mapName the name of the map to remove.
   * @param mapType the format of the map to remove.
   */
  public static synchronized void removeMapFromCatalog(
      String locationPath, String mapsetName, String mapName, String mapType) {
    // URL mapsetId = JGrassMapsetGeoResource.createId(locationPath, mapsetName);
    File locationFile = new File(locationPath);
    URL mapsetUrl = JGrassMapsetGeoResource.createId(locationFile.getAbsolutePath(), mapsetName);
    ID mapsetId = new ID(mapsetUrl);

    JGrassMapsetGeoResource mapset =
        CatalogPlugin.getDefault()
            .getLocalCatalog()
            .getById(JGrassMapsetGeoResource.class, mapsetId, ProgressManager.instance().get());
    mapset.removeMap(mapName, mapType);
  }
  /**
   * Extract mapset path and mapname from a georesource containing a JGrassMapGeoResource
   *
   * @param resource
   * @return a String array with mapset path and map name
   */
  public static synchronized String[] getMapsetpathAndMapnameFromJGrassMapGeoResource(
      IGeoResource resource) {
    String[] mapsetPathAndMapName = new String[2];

    // check that the underlying resource is a propertyservice
    if (resource == null || !resource.canResolve(JGrassMapGeoResource.class)) {
      return null;
    }
    JGrassMapGeoResource mapResource = null;
    try {
      mapResource = resource.resolve(JGrassMapGeoResource.class, null);
      // String tmp = jg.getInfo(null).getDescription();
      // if (!tmp.equals(JGrassConstants.GRASSBINARYRASTERMAP))
      // return null;
    } catch (IOException e) {
      JGrassPlugin.log(
          "JGrassPlugin problem: eu.hydrologis.udig.catalog.utils#JGrassCatalogUtilities#getMapsetpathAndMapnameFromJGrassMapGeoResource",
          e); //$NON-NLS-1$

      e.printStackTrace();
      return null;
    }

    JGrassMapsetGeoResource mapsetResource = null;
    try {
      mapsetResource = (JGrassMapsetGeoResource) mapResource.parent(null);
      mapsetPathAndMapName[0] = mapsetResource.getFile().getAbsolutePath();
      mapsetPathAndMapName[1] = mapResource.getTitle();
    } catch (IOException e) {
      JGrassPlugin.log(
          "JGrassPlugin problem: eu.hydrologis.udig.catalog.utils#JGrassCatalogUtilities#getMapsetpathAndMapnameFromJGrassMapGeoResource",
          e); //$NON-NLS-1$
      e.printStackTrace();
    }
    return mapsetPathAndMapName;
  }
示例#4
0
  public void render(Graphics2D g2d, IProgressMonitor monitor) throws RenderException {
    try {
      final IRenderContext currentContext = getContext();
      currentContext.setStatus(ILayer.WAIT);
      CoordinateReferenceSystem destinationCRS = currentContext.getCRS();

      // the bounds of the visible area in world coordinates
      // get the envelope and the screen extent
      Envelope envelope = getRenderBounds();
      if (envelope == null || envelope.isNull()) {
        envelope = context.getImageBounds();
      }

      Point upperLeft =
          currentContext.worldToPixel(new Coordinate(envelope.getMinX(), envelope.getMinY()));
      Point bottomRight =
          currentContext.worldToPixel(new Coordinate(envelope.getMaxX(), envelope.getMaxY()));
      Rectangle screenSize = new Rectangle(upperLeft);
      screenSize.add(bottomRight);

      final IGeoResource resource = getContext().getGeoResource();
      if (resource == null || !resource.canResolve(JGrassMapGeoResource.class)) {
        return;
      }
      JGrassMapGeoResource grassMapGeoResource =
          resource.resolve(JGrassMapGeoResource.class, monitor);

      JGrassRegion fileWindow = new JGrassRegion(grassMapGeoResource.getFileWindow());
      JGrassMapsetGeoResource parent =
          (JGrassMapsetGeoResource) grassMapGeoResource.parent(new NullProgressMonitor());
      CoordinateReferenceSystem grassCrs = parent.getLocationCrs();
      JGrassRegion screenDrawWindow =
          new JGrassRegion(
              envelope.getMinX(),
              envelope.getMaxX(),
              envelope.getMinY(),
              envelope.getMaxY(),
              fileWindow.getRows(),
              fileWindow.getCols());

      // to intersect with the data window, we transform the screen window
      JGrassRegion reprojectedScreenDrawWindow = screenDrawWindow;
      if (!CRS.equalsIgnoreMetadata(destinationCRS, grassCrs)) {
        reprojectedScreenDrawWindow = screenDrawWindow.reproject(destinationCRS, grassCrs, true);
      }

      /*
       * if the map is not visible, do not render it
       */
      // JGrassRegion fileWindow = grassMapGeoResource.getFileWindow();
      Rectangle2D.Double fileRectDouble = fileWindow.getRectangle();
      Double reprojScreenRectangle = reprojectedScreenDrawWindow.getRectangle();
      if (!reprojScreenRectangle.intersects(fileRectDouble)) {
        getContext().setStatus(ILayer.DONE);
        getContext().setStatusMessage(THE_MAP_IS_OUTSIDE_OF_THE_VISIBLE_REGION);
        System.out.println(THE_MAP_IS_OUTSIDE_OF_THE_VISIBLE_REGION);
        return;
      }
      /*
       * we will draw only the intersection of the map in the display system = part of visible map
       */
      Rectangle2D drawMapRectangle =
          reprojectedScreenDrawWindow.getRectangle().createIntersection(fileRectDouble);
      // Rectangle2D drawMapRectangle = fileRectDouble.getBounds2D();
      // resolution is that of the file window
      double ewRes = fileWindow.getWEResolution();
      double nsRes = fileWindow.getNSResolution();
      if (fileRectDouble.getWidth() < ewRes || fileRectDouble.getHeight() < nsRes) {
        getContext().setStatus(ILayer.DONE);
        getContext().setStatusMessage(THE_MAP_IS_OUTSIDE_OF_THE_VISIBLE_REGION);
        System.out.println(THE_MAP_IS_OUTSIDE_OF_THE_VISIBLE_REGION);
        return;
      }
      MathTransform transform = CRS.findMathTransform(destinationCRS, grassCrs, true);
      Coordinate pixelSize = getContext().getPixelSize();

      Coordinate c1 = new Coordinate(envelope.getMinX(), envelope.getMinY());
      Coordinate c2 =
          new Coordinate(envelope.getMinX() + pixelSize.x, envelope.getMinY() + pixelSize.y);
      Envelope envy = new Envelope(c1, c2);
      Envelope envyTrans = JTS.transform(envy, transform);

      pixelSize = new Coordinate(envyTrans.getWidth(), envyTrans.getHeight());
      /*
       * if the resolution is higher of that of the screen, it doesn't make much sense to draw it
       * all. So for visualization we just use the screen resolution to do things faster.
       */
      if (ewRes < pixelSize.x) {
        ewRes = pixelSize.x;
      }
      if (nsRes < pixelSize.y) {
        nsRes = pixelSize.y;
      }
      fileWindow.setNSResolution(nsRes);
      fileWindow.setWEResolution(ewRes);
      nsRes = fileWindow.getNSResolution();
      ewRes = fileWindow.getWEResolution();
      /*
       * redefine the region of the map to be drawn
       */
      /*
       * snap the screen to fit into the active region grid. This is mandatory for the exactness
       * of the query of the pixels (ex. d.what.rast).
       */
      JGrassRegion activeWindow = grassMapGeoResource.getActiveWindow();
      Coordinate minXY =
          JGrassRegion.snapToNextHigherInRegionResolution(
              drawMapRectangle.getMinX(), drawMapRectangle.getMinY(), activeWindow);
      Coordinate maxXY =
          JGrassRegion.snapToNextHigherInRegionResolution(
              drawMapRectangle.getMaxX(), drawMapRectangle.getMaxY(), activeWindow);

      JGrassRegion drawMapRegion =
          new JGrassRegion(minXY.x, maxXY.x, minXY.y, maxXY.y, ewRes, nsRes);
      // JGrassRegion drawMapRegion = new JGrassRegion(drawMapRectangle.getMinX(),
      // drawMapRectangle.getMaxX(), drawMapRectangle.getMinY(), drawMapRectangle
      // .getMaxY(), ewRes, nsRes);
      JGrassMapEnvironment grassMapEnvironment = grassMapGeoResource.getjGrassMapEnvironment();
      GridCoverage2D coverage =
          JGrassCatalogUtilities.getGridcoverageFromGrassraster(grassMapEnvironment, drawMapRegion);
      coverage = coverage.view(ViewType.RENDERED);
      if (coverage != null) {

        // setting rendering hints
        RenderingHints hints = new RenderingHints(Collections.EMPTY_MAP);
        hints.add(
            new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED));
        hints.add(
            new RenderingHints(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE));
        hints.add(
            new RenderingHints(
                RenderingHints.KEY_ALPHA_INTERPOLATION,
                RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED));
        hints.add(
            new RenderingHints(
                RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED));
        hints.add(
            new RenderingHints(
                RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR));
        hints.add(
            new RenderingHints(
                RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE));
        hints.add(
            new RenderingHints(
                RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF));
        hints.add(new RenderingHints(JAI.KEY_INTERPOLATION, new InterpolationNearest()));
        g2d.addRenderingHints(hints);
        final TileCache tempCache = JAI.createTileCache();
        tempCache.setMemoryCapacity(16 * 1024 * 1024);
        tempCache.setMemoryThreshold(1.0f);
        hints.add(new RenderingHints(JAI.KEY_TILE_CACHE, tempCache));

        // draw

        AffineTransform worldToScreen =
            RendererUtilities.worldToScreenTransform(envelope, screenSize, destinationCRS);
        final GridCoverageRenderer paint =
            new GridCoverageRenderer(destinationCRS, envelope, screenSize, worldToScreen, hints);
        RasterSymbolizer rasterSymbolizer =
            CommonFactoryFinder.getStyleFactory(null).createRasterSymbolizer();

        paint.paint(g2d, coverage, rasterSymbolizer);

        tempCache.flush();

        // IBlackboard blackboard = context.getMap().getBlackboard();
        // String legendString = coverageReader.getLegendString();
        // String name = grassMapGeoResource.getTitle();
        // blackboard.putString(JGrassMapGeoResource.READERID + "#" + name, legendString);

      }

    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      getContext().setStatus(ILayer.DONE);
      getContext().setStatusMessage(null);
    }
  }
  @Override
  protected void refresh() {
    try {
      IBlackboard blackboard = getLayer().getMap().getBlackboard();

      style = (ActiveRegionStyle) blackboard.get(ActiveregionStyleContent.ID);

      if (style == null) {
        style = ActiveregionStyleContent.createDefault();
        blackboard.put(ActiveregionStyleContent.ID, style);
        // ((StyleBlackboard) styleBlackboard).setSelected(new
        // String[]{ActiveregionStyleContent.ID});
      }

      // first time choose the mapset
      if (style.windPath == null) {
        CatalogJGrassMapsetTreeViewerDialog mapsetDialog =
            new CatalogJGrassMapsetTreeViewerDialog();
        mapsetDialog.open(parent.getShell());
        jGrassMapsetGeoResource = mapsetDialog.getSelectedLayers().get(0);

        JGrassRegion activeRegionWindow = jGrassMapsetGeoResource.getActiveRegionWindow();
        style.windPath = jGrassMapsetGeoResource.getActiveRegionWindowPath();
        style.north = (float) activeRegionWindow.getNorth();
        style.south = (float) activeRegionWindow.getSouth();
        style.west = (float) activeRegionWindow.getWest();
        style.east = (float) activeRegionWindow.getEast();
        style.rows = activeRegionWindow.getRows();
        style.cols = activeRegionWindow.getCols();

        CoordinateReferenceSystem jGrassCrs = jGrassMapsetGeoResource.getLocationCrs();
        try {
          Integer epsg = CRS.lookupEpsgCode(jGrassCrs, true);
          style.crsString = "EPSG:" + epsg;
        } catch (Exception e) {
          // try non epsg
          style.crsString = CRS.lookupIdentifier(jGrassCrs, true);
        }
      }
      windPathText.setText(style.windPath);

      JGrassRegion tmp =
          new JGrassRegion(
              style.west, style.east, style.south, style.north, style.rows, style.cols);
      // set initial values
      isWorking = true;
      northText.setText(String.valueOf(style.north));
      southText.setText(String.valueOf(style.south));
      westText.setText(String.valueOf(style.west));
      eastText.setText(String.valueOf(style.east));
      xresText.setText(String.valueOf(tmp.getWEResolution()));
      yresText.setText(String.valueOf(tmp.getNSResolution()));
      colsText.setText(String.valueOf(style.cols));
      rowsText.setText(String.valueOf(style.rows));
      isWorking = false;

      forgroundAlphaText.setText(Float.toString(style.fAlpha));
      backgroundAlphaText.setText(Float.toString(style.bAlpha));
      foregroundColor.setColorValue(
          new RGB(
              style.foregroundColor.getRed(),
              style.foregroundColor.getGreen(),
              style.foregroundColor.getBlue()));
      backgroundColour.setColorValue(
          new RGB(
              style.backgroundColor.getRed(),
              style.backgroundColor.getGreen(),
              style.backgroundColor.getBlue()));

      CoordinateReferenceSystem crs = CRS.decode(style.crsString);
      commitToBlackboards(tmp, crs, style.windPath);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }