package org.activityinfo.server.report.generator.map; /* * #%L * ActivityInfo Server * %% * Copyright (C) 2009 - 2013 UNICEF * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import org.activityinfo.legacy.shared.command.DimensionType; import org.activityinfo.legacy.shared.command.Filter; import org.activityinfo.legacy.shared.command.GetAdminEntities; import org.activityinfo.legacy.shared.command.PivotSites; import org.activityinfo.legacy.shared.command.PivotSites.PivotResult; import org.activityinfo.legacy.shared.command.result.AdminEntityResult; import org.activityinfo.legacy.shared.command.result.Bucket; import org.activityinfo.legacy.shared.model.AdminEntityDTO; import org.activityinfo.legacy.shared.reports.content.AdminMarker; import org.activityinfo.legacy.shared.reports.content.AdminOverlay; import org.activityinfo.legacy.shared.reports.content.EntityCategory; import org.activityinfo.legacy.shared.reports.content.MapContent; import org.activityinfo.legacy.shared.reports.model.AdminDimension; import org.activityinfo.legacy.shared.reports.model.layers.PolygonMapLayer; import org.activityinfo.legacy.shared.reports.util.mapping.Extents; import org.activityinfo.server.command.DispatcherSync; public class PolygonLayerGenerator implements LayerGenerator { private PolygonMapLayer layer; private PivotResult pivotResult; private MagnitudeScaleBuilder.Scale colorScale; private AdminOverlay overlay; private Jenks breakBuilder = new Jenks(); public PolygonLayerGenerator(PolygonMapLayer layer) { super(); this.layer = layer; this.overlay = new AdminOverlay(layer.getAdminLevelId()); this.overlay.setOutlineColor(layer.getMaxColor()); } @Override public void query(DispatcherSync dispatcher, Filter effectiveFilter) { Filter layerFilter = new Filter(effectiveFilter, layer.getFilter()); layerFilter.addRestriction(DimensionType.Indicator, layer.getIndicatorIds()); queryBounds(dispatcher, layerFilter); queryBuckets(dispatcher, layerFilter); color(); } private void queryBounds(DispatcherSync dispatcher, Filter layerFilter) { GetAdminEntities query = new GetAdminEntities(); query.setLevelId(layer.getAdminLevelId()); AdminEntityResult entities = dispatcher.execute(query); for (AdminEntityDTO entity : entities.getData()) { if (entity.hasBounds()) { AdminMarker marker = new AdminMarker(entity); overlay.addPolygon(marker); } } } private void queryBuckets(DispatcherSync dispatcher, Filter layerFilter) { PivotSites query = new PivotSites(); query.setFilter(layerFilter); AdminDimension adminDimension = new AdminDimension(layer.getAdminLevelId()); query.setDimensions(adminDimension); MagnitudeScaleBuilder scaleBuilder = new MagnitudeScaleBuilder(layer); this.pivotResult = dispatcher.execute(query); for (Bucket bucket : pivotResult.getBuckets()) { EntityCategory category = (EntityCategory) bucket.getCategory(adminDimension); if (category != null) { int adminEntityId = category.getId(); AdminMarker polygon = overlay.getPolygon(adminEntityId); if (polygon != null) { polygon.setValue(bucket.doubleValue()); scaleBuilder.addValue(bucket.doubleValue()); } } } colorScale = scaleBuilder.build(); } private void color() { for (AdminMarker polygon : overlay.getPolygons()) { if (polygon.hasValue()) { polygon.setColor(colorScale.color(polygon.getValue()).toHexString()); } else { polygon.setColor(colorScale.color(null).toHexString()); } } } @Override public Extents calculateExtents() { Extents extents = Extents.emptyExtents(); for (AdminMarker polygon : overlay.getPolygons()) { if (polygon.hasValue()) { extents.grow(polygon.getExtents()); } } return extents; } @Override public Margins calculateMargins() { return new Margins(0); } @Override public void generate(TiledMap map, MapContent content) { content.getAdminOverlays().add(overlay); content.getLegends().add(colorScale.legend()); } }