/*
* JGrass - Free Open Source Java GIS http://www.jgrass.org
* (C) HydroloGIS - www.hydrologis.com
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Library General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option) any
* later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
* details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; if not, write to the Free Foundation, Inc., 59
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.jgrasstools.gears.modules.v.contourlabels;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_AUTHORCONTACTS;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_AUTHORNAMES;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_DOCUMENTATION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_KEYWORDS;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_LABEL;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_LICENSE;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_NAME;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_STATUS;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_BUFFER_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_F_ELEVATION_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_IN_CONTOUR_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_INLINES_DESCRIPTION;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSCONTOURLINESLABELER_OUTPOINTS_DESCRIPTION;
import oms3.annotations.Author;
import oms3.annotations.Description;
import oms3.annotations.Documentation;
import oms3.annotations.Execute;
import oms3.annotations.In;
import oms3.annotations.Keywords;
import oms3.annotations.Label;
import oms3.annotations.License;
import oms3.annotations.Name;
import oms3.annotations.Out;
import oms3.annotations.Status;
import org.geotools.data.memory.MemoryDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.feature.DefaultFeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.jgrasstools.gears.libs.modules.JGTModel;
import org.jgrasstools.gears.utils.features.FilterUtilities;
import org.jgrasstools.gears.utils.geometry.GeometryUtilities;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.filter.Filter;
import org.opengis.geometry.BoundingBox;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
@Description(OMSCONTOURLINESLABELER_DESCRIPTION)
@Documentation(OMSCONTOURLINESLABELER_DOCUMENTATION)
@Author(name = OMSCONTOURLINESLABELER_AUTHORNAMES, contact = OMSCONTOURLINESLABELER_AUTHORCONTACTS)
@Keywords(OMSCONTOURLINESLABELER_KEYWORDS)
@Label(OMSCONTOURLINESLABELER_LABEL)
@Name(OMSCONTOURLINESLABELER_NAME)
@Status(OMSCONTOURLINESLABELER_STATUS)
@License(OMSCONTOURLINESLABELER_LICENSE)
public class OmsContourLinesLabeler extends JGTModel {
@Description(OMSCONTOURLINESLABELER_IN_CONTOUR_DESCRIPTION)
@In
public SimpleFeatureCollection inContour;
@Description(OMSCONTOURLINESLABELER_F_ELEVATION_DESCRIPTION)
@In
public String fElevation;
@Description(OMSCONTOURLINESLABELER_INLINES_DESCRIPTION)
@In
public SimpleFeatureCollection inLines;
@Description(OMSCONTOURLINESLABELER_BUFFER_DESCRIPTION)
@In
public double buffer;
@Description(OMSCONTOURLINESLABELER_OUTPOINTS_DESCRIPTION)
@Out
public SimpleFeatureCollection outPoints = null;
@SuppressWarnings("nls")
@Execute
public void process() throws Exception {
if (!concatOr(outPoints == null, doReset)) {
return;
}
SimpleFeatureType inSchema = inContour.getSchema();
MemoryDataStore memDatastore = new MemoryDataStore(inContour);
SimpleFeatureSource contourSource = memDatastore.getFeatureSource(memDatastore.getTypeNames()[0]);
CoordinateReferenceSystem crs = inSchema.getCoordinateReferenceSystem();
outPoints = new DefaultFeatureCollection();
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName("labelpoints");
b.setCRS(crs);
b.add("the_geom", Point.class);
b.add("elevation", Double.class);
b.add("azimuth", Double.class);
b.add("minus90", Double.class);
SimpleFeatureType outType = b.buildFeatureType();
int count = 0;
FeatureIterator<SimpleFeature> lineFeatureIterator = inLines.features();
while( lineFeatureIterator.hasNext() ) {
SimpleFeature line = lineFeatureIterator.next();
Geometry lineGeom = (Geometry) line.getDefaultGeometry();
Geometry lineBuffer = lineGeom.buffer(buffer);
BoundingBox lineBounds = line.getBounds();
Filter bboxFilter = FilterUtilities.getBboxFilter("the_geom", lineBounds);
SimpleFeatureCollection filteredContours = contourSource.getFeatures(bboxFilter);
FeatureIterator<SimpleFeature> contourIterator = filteredContours.features();
while( contourIterator.hasNext() ) {
SimpleFeature contour = contourIterator.next();
Geometry contourGeom = (Geometry) contour.getDefaultGeometry();
if (lineBuffer.intersects(contourGeom)) {
Geometry intersection = lineBuffer.intersection(contourGeom);
Coordinate[] coordinates = intersection.getCoordinates();
Coordinate first = coordinates[0];
Coordinate second = coordinates[1];
double azimuth = GeometryUtilities.azimuth(first, second);
double azimuthFrom90 = azimuth - 90.0;
if (azimuthFrom90 < 0) {
azimuthFrom90 = 360.0 + azimuthFrom90;
}
double elevation = ((Number) contour.getAttribute(fElevation)).doubleValue();
Point labelPoint = GeometryUtilities.gf().createPoint(first);
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(outType);
Object[] values = new Object[]{labelPoint, elevation, azimuth, azimuthFrom90};
builder.addAll(values);
SimpleFeature pointFeature = builder.buildFeature(outType.getTypeName() + "." + count++);
((DefaultFeatureCollection) outPoints).add(pointFeature);
}
}
}
}
}