/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2010, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * 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 * Lesser General Public License for more details. */ package org.geotools.renderer.chart; import java.util.Arrays; import java.util.List; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.data.xy.AbstractXYDataset; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Point; /** * A dataset for plotting Geometry objects . * <pre> * Geometry g1 = ... * Geometry g2 = ... * * GeometryDataset data = new GeometryDataset(g1,g2); * GeometryRenderer renderer = new GeometryRenderer(); * * XYPlot plot = new XYPlot(dataset, dataset.getDomain(), dataset.getRange(), renderer); * ... * </pre> * @author Justin Deoliveira, OpenGeo * * * @source $URL: http://svn.osgeo.org/geotools/trunk/modules/plugin/charts/src/main/java/org/geotools/renderer/chart/GeometryDataset.java $ */ public class GeometryDataset extends AbstractXYDataset { double buffer; double buf; List<Geometry> geometries; Envelope bounds; public GeometryDataset(Geometry... geometries) { this.geometries = Arrays.asList(geometries); this.bounds = new Envelope(); for (Geometry g : geometries) { bounds.expandToInclude(g.getEnvelopeInternal()); } setBuffer(0.1d); } public List<Geometry> getGeometries() { return geometries; } public void setBuffer(double buffer) { this.buffer = buffer; this.buf = Math.max(buffer, Math.max(bounds.getWidth()*buffer, bounds.getHeight()*buffer)); } @Override public int getSeriesCount() { return geometries.size(); } @Override public Comparable getSeriesKey(int series) { Geometry g = geometries.get(series); String wkt = g.toText(); if (g instanceof Point) { return wkt; } else { int i = wkt.indexOf(','); int j = wkt.lastIndexOf(','); return wkt.substring(0, i) + " ... " + wkt.substring(j+1); } } public int getItemCount(int series) { return 1; } public Number getX(int series, int item) { //TODO: return the centroid return geometries.get(series).getCoordinate().x; } public Number getY(int series, int item) { return geometries.get(series).getCoordinate().x; } public ValueAxis getDomain() { NumberAxis domain = new NumberAxis(); domain.setRange(bounds.getMinX()-buf, bounds.getMaxX()+buf); return domain; } public ValueAxis getRange() { NumberAxis range = new NumberAxis(); range.setRange(bounds.getMinY()-buf, bounds.getMaxY()+buf); return range; } }