use of org.activityinfo.shared.report.content.Point in project activityinfo by bedatadriven.
the class BubbleLayerGenerator method generatePoints.
public void generatePoints(List<SiteDTO> sites, TiledMap map, BubbleMapLayer layer, Clusterer clusterer, List<PointValue> mapped, List<PointValue> unmapped) {
for (SiteDTO site : sites) {
if (hasValue(site, layer.getIndicatorIds())) {
Point px = null;
if (site.hasLatLong()) {
px = map.fromLatLngToPixel(new AiLatLng(site.getLatitude(), site.getLongitude()));
}
Double value = getValue(site, layer.getIndicatorIds());
if (value != null && value != 0) {
PointValue pv = new PointValue(site, createSymbol(site, layer.getColorDimensions()), value, px);
// TODO: add AdminLevel to pointvalue
if (clusterer.isMapped(site)) {
mapped.add(pv);
} else {
unmapped.add(pv);
}
}
}
}
}
use of org.activityinfo.shared.report.content.Point in project activityinfo by bedatadriven.
the class IconLayerGenerator method generate.
@Override
public void generate(TiledMap map, MapContent content) {
List<PointValue> points = new ArrayList<PointValue>();
IconRectCalculator rectCalculator = new IconRectCalculator(icon);
IntersectionCalculator intersectionCalculator = new IntersectionCalculator() {
@Override
public boolean intersects(Node a, Node b) {
return a.getPointValue().getIconRect().intersects(b.getPointValue().getIconRect());
}
};
Clusterer clusterer = ClustererFactory.fromClustering(layer.getClustering(), rectCalculator, intersectionCalculator);
for (SiteDTO site : sites) {
if (meetsCriteria(site)) {
if (clusterer.isMapped(site)) {
Point point = null;
if (site.hasLatLong()) {
point = map.fromLatLngToPixel(new AiLatLng(site.getLatitude(), site.getLongitude()));
}
points.add(new PointValue(site, point, point == null ? null : rectCalculator.iconRect(point), getValue(site, layer.getIndicatorIds())));
} else {
content.getUnmappedSites().add(site.getId());
}
}
}
List<Cluster> clusters = clusterer.cluster(map, points);
createMarkersFrom(clusters, map, content);
IconLayerLegend legend = new IconLayerLegend();
legend.setDefinition(layer);
content.addLegend(legend);
}
use of org.activityinfo.shared.report.content.Point in project activityinfo by bedatadriven.
the class PiechartLayerGenerator method generate.
@Override
public void generate(TiledMap map, MapContent content) {
// create the list of input point values
List<PointValue> points = new ArrayList<PointValue>();
List<PointValue> unmapped = new ArrayList<PointValue>();
// define our symbol scaling
RadiiCalculator radiiCalculator;
if (layer.getScaling() == ScalingType.None || layer.getMinRadius() == layer.getMaxRadius()) {
radiiCalculator = new FixedRadiiCalculator(layer.getMinRadius());
} else if (layer.getScaling() == ScalingType.Graduated) {
radiiCalculator = new GsLogCalculator(layer.getMinRadius(), layer.getMaxRadius());
} else {
radiiCalculator = new FixedRadiiCalculator(layer.getMinRadius());
}
Clusterer clusterer = ClustererFactory.fromClustering(layer.getClustering(), radiiCalculator, new BubbleIntersectionCalculator(layer.getMaxRadius()));
generatePoints(map, layer, clusterer, points, unmapped);
// add unmapped sites
for (PointValue pv : unmapped) {
content.getUnmappedSites().add(pv.getSite().getId());
}
List<Cluster> clusters = clusterer.cluster(map, points);
// create the markers
List<BubbleMapMarker> markers = new ArrayList<BubbleMapMarker>();
for (Cluster cluster : clusters) {
Point px = cluster.getPoint();
AiLatLng latlng = map.fromPixelToLatLng(px);
BubbleMapMarker marker = new PieMapMarker();
sumSlices((PieMapMarker) marker, cluster.getPointValues());
for (PointValue pv : cluster.getPointValues()) {
marker.getSiteIds().add(pv.getSite().getId());
}
marker.setX(px.getX());
marker.setY(px.getY());
marker.setValue(cluster.sumValues());
marker.setRadius((int) cluster.getRadius());
marker.setLat(latlng.getLat());
marker.setLng(latlng.getLng());
marker.setAlpha(layer.getAlpha());
marker.setIndicatorIds(new HashSet<Integer>(layer.getIndicatorIds()));
marker.setClusterAmount(cluster.getPointValues().size());
marker.setClustering(layer.getClustering());
markers.add(marker);
}
// number markers if applicable
if (layer.getLabelSequence() != null) {
numberMarkers(markers);
}
PieChartLegend legend = new PieChartLegend();
legend.setDefinition(layer);
content.getMarkers().addAll(markers);
content.addLegend(legend);
}
use of org.activityinfo.shared.report.content.Point in project activityinfo by bedatadriven.
the class AdminLevelClusterer method updateCenter.
private void updateCenter(Cluster cluster) {
double count = 0;
double sumX = 0;
double sumY = 0;
for (PointValue pv : cluster.getPointValues()) {
if (pv.hasPoint()) {
count++;
sumX += pv.getPoint().getDoubleX();
sumY += pv.getPoint().getDoubleY();
}
}
if (count > 0) {
cluster.setPoint(new Point(sumX / count, sumY / count));
}
}
use of org.activityinfo.shared.report.content.Point in project activityinfo by bedatadriven.
the class KMeans method assignClosest.
/**
* Updates the membership array by assigning each node to its closest
* cluster
*
* @param nodes
* @param centers
* @param membership
* @return True if cluster membership has changed
*/
private static boolean assignClosest(List<MarkerGraph.Node> nodes, Point[] centers, int[] membership) {
boolean changed = false;
for (int i = 0; i != nodes.size(); ++i) {
// for this node, find the closest
// cluster center
double minDist = Double.MAX_VALUE;
int closest = 0;
for (int j = 0; j != centers.length; ++j) {
double dist = nodes.get(i).getPoint().distance(centers[j]);
if (dist < minDist) {
minDist = dist;
closest = j;
}
}
if (membership[i] != closest) {
membership[i] = closest;
changed = true;
}
}
return changed;
}
Aggregations