use of org.activityinfo.model.type.geo.AiLatLng in project activityinfo by bedatadriven.
the class MapEditorMapView method updateModelFromMap.
private void updateModelFromMap() {
model.setZoomLevel(map.getMap().getZoom());
LatLng center = map.getMap().getBounds().getCenter();
model.setCenter(new AiLatLng(center.lat(), center.lng()));
}
use of org.activityinfo.model.type.geo.AiLatLng in project activityinfo by bedatadriven.
the class LocationMap method createNewLocationMarker.
private void createNewLocationMarker() {
DivIcon icon = createIcon("");
Options markerOptions = new Options();
markerOptions.setProperty("icon", icon);
markerOptions.setProperty("draggable", true);
newLocationMarker = new Marker(newLatLng(newLocationPresenter.getLatLng()), markerOptions);
EventHandlerManager.addEventHandler(newLocationMarker, org.discotools.gwt.leaflet.client.events.handler.EventHandler.Events.dragend, new EventHandler<Event>() {
@Override
public void handle(Event event) {
newLocationPresenter.setLatLng(new AiLatLng(newLocationMarker.getLatLng().lat(), newLocationMarker.getLatLng().lng()));
}
});
map.addLayer(newLocationMarker);
}
use of org.activityinfo.model.type.geo.AiLatLng in project activityinfo by bedatadriven.
the class TileMath method zoomLevelForExtents.
/**
* Returns the maximum zoom level at which the given extents will fit inside
* the map of the given size
*
* @param extent
* @param mapWidth
* @param mapHeight
* @return
*/
public static int zoomLevelForExtents(Extents extent, int mapWidth, int mapHeight) {
int zoomLevel = 1;
do {
Point upperLeft = fromLatLngToPixel(new AiLatLng(extent.getMaxLat(), extent.getMinLon()), zoomLevel);
Point lowerRight = fromLatLngToPixel(new AiLatLng(extent.getMinLat(), extent.getMaxLon()), zoomLevel);
int extentWidth = lowerRight.getX() - upperLeft.getX();
if (extentWidth > mapWidth) {
return zoomLevel - 1;
}
int extentHeight = lowerRight.getY() - upperLeft.getY();
if (extentHeight > mapHeight) {
return zoomLevel - 1;
}
zoomLevel++;
} while (zoomLevel < MAX_ZOOM);
return zoomLevel;
}
use of org.activityinfo.model.type.geo.AiLatLng in project activityinfo by bedatadriven.
the class MapGenerator method generate.
@Override
public void generate(User user, MapReportElement element, Filter inheritedFilter, DateRange dateRange) {
Filter filter = GeneratorUtils.resolveElementFilter(element, dateRange);
Filter effectiveFilter = inheritedFilter == null ? filter : new Filter(inheritedFilter, filter);
MapContent content = new MapContent();
content.setFilterDescriptions(generateFilterDescriptions(filter, Collections.<DimensionType>emptySet(), user));
Map<Integer, Indicator> indicators = queryIndicators(element);
// Set up layer generators
List<LayerGenerator> layerGenerators = new ArrayList<LayerGenerator>();
for (MapLayer layer : element.getLayers()) {
if (layer.isVisible()) {
LayerGenerator layerGtor = createGenerator(layer, indicators);
layerGtor.query(getDispatcher(), effectiveFilter);
layerGenerators.add(layerGtor);
}
}
// FIRST PASS: calculate extents and margins
int width = element.getWidth();
int height = element.getHeight();
AiLatLng center;
int zoom;
Extents extents = Extents.emptyExtents();
Margins margins = new Margins(0);
for (LayerGenerator layerGtor : layerGenerators) {
extents.grow(layerGtor.calculateExtents());
margins.grow(layerGtor.calculateMargins());
}
content.setExtents(extents);
if (element.getCenter() == null) {
// Now we're ready to calculate the zoom level
// and the projection
zoom = TileMath.zoomLevelForExtents(extents, width, height);
center = extents.center();
} else {
center = element.getCenter();
zoom = element.getZoomLevel();
}
content.setCenter(center);
// Retrieve the basemap and clamp zoom level
BaseMap baseMap = findBaseMap(element, indicators.values());
if (zoom < baseMap.getMinZoom()) {
zoom = baseMap.getMinZoom();
}
if (zoom > baseMap.getMaxZoom()) {
zoom = baseMap.getMaxZoom();
}
if (zoom > element.getMaximumZoomLevel()) {
zoom = element.getMaximumZoomLevel();
}
TiledMap map = new TiledMap(width, height, center, zoom);
content.setBaseMap(baseMap);
content.setZoomLevel(zoom);
// Generate the actual content
for (LayerGenerator layerGtor : layerGenerators) {
layerGtor.generate(map, content);
}
content.setIndicators(toDTOs(indicators.values()));
element.setContent(content);
}
use of org.activityinfo.model.type.geo.AiLatLng in project activityinfo by bedatadriven.
the class BubbleLayerGenerator method generate.
@Override
public void generate(TiledMap map, MapContent content) {
// 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());
}
BubbleIntersectionCalculator intersectionCalculator = new BubbleIntersectionCalculator(layer.getMaxRadius());
Clusterer clusterer = ClustererFactory.fromClustering(layer.getClustering(), radiiCalculator, intersectionCalculator);
// create the list of input point values
List<PointValue> points = new ArrayList<PointValue>();
List<PointValue> unmapped = new ArrayList<PointValue>();
generatePoints(sites, map, layer, clusterer, points, unmapped);
// Cluster points by the clustering algorithm set in the layer
List<Cluster> clusters = clusterer.cluster(map, points);
// add unmapped sites
for (PointValue pv : unmapped) {
content.getUnmappedSites().add(pv.getSite().getId());
}
BubbleLayerLegend legend = new BubbleLayerLegend();
legend.setDefinition(layer);
// 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 BubbleMapMarker();
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.setTitle(formatTitle(cluster));
marker.setIndicatorIds(new HashSet<Integer>(layer.getIndicatorIds()));
marker.setClusterAmount(cluster.getPointValues().size());
marker.setClustering(layer.getClustering());
marker.setColor(layer.getBubbleColor());
if (marker.getValue() < legend.getMinValue()) {
legend.setMinValue(marker.getValue());
}
if (marker.getValue() > legend.getMaxValue()) {
legend.setMaxValue(marker.getValue());
}
markers.add(marker);
}
// sort order by symbol radius descending
// (this assures that smaller symbols are drawn on
// top of larger ones)
Collections.sort(markers, new Comparator<MapMarker>() {
@Override
public int compare(MapMarker o1, MapMarker o2) {
if (o1.getSize() > o2.getSize()) {
return -1;
} else if (o1.getSize() < o2.getSize()) {
return 1;
}
return 0;
}
});
// number markers if applicable
if (layer.getLabelSequence() != null) {
numberMarkers(markers);
}
content.addLegend(legend);
content.getMarkers().addAll(markers);
}
Aggregations