All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.geomajas.gwt2.client.map.feature.ServerFeatureServiceImpl Maven / Gradle / Ivy

There is a newer version: 2.4.3
Show newest version
/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2014 Geosparc nv, http://www.geosparc.com/, Belgium.
 *
 * The program is available in open source according to the GNU Affero
 * General Public License. All contributions in this program are covered
 * by the Geomajas Contributors License Agreement. For full licensing
 * details, see LICENSE.txt in the project root.
 */

package org.geomajas.gwt2.client.map.feature;

import org.geomajas.command.dto.SearchByLocationRequest;
import org.geomajas.command.dto.SearchByLocationResponse;
import org.geomajas.command.dto.SearchFeatureRequest;
import org.geomajas.command.dto.SearchFeatureResponse;
import org.geomajas.geometry.Geometry;
import org.geomajas.gwt.client.command.AbstractCommandCallback;
import org.geomajas.gwt.client.command.GwtCommand;
import org.geomajas.gwt2.client.GeomajasServerExtension;
import org.geomajas.gwt2.client.map.MapPresenter;
import org.geomajas.gwt2.client.map.attribute.Attribute;
import org.geomajas.gwt2.client.map.layer.FeaturesSupported;
import org.geomajas.gwt2.client.map.layer.Layer;
import org.geomajas.gwt2.client.map.layer.VectorServerLayer;
import org.geomajas.layer.feature.SearchCriterion;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 

Service for feature retrieval and manipulation. This service is map specific, and so the methods may assume the * features come from layers within the map's LayersModel.

* * @author Pieter De Graef */ public class ServerFeatureServiceImpl implements ServerFeatureService { // ------------------------------------------------------------------------ // Searching features by attributes: // ------------------------------------------------------------------------ @Override public void search(String crs, final VectorServerLayer layer, SearchCriterion[] criteria, LogicalOperator operator, int maxResultSize, final FeatureMapFunction callback) { SearchFeatureRequest request = new SearchFeatureRequest(); request.setBooleanOperator(operator.getValue()); request.setCriteria(criteria); request.setMax(maxResultSize); request.setLayerId(layer.getServerLayerId()); request.setCrs(crs); request.setFilter(layer.getFilter()); request.setFeatureIncludes(11); GwtCommand command = new GwtCommand(SearchFeatureRequest.COMMAND); command.setCommandRequest(request); GeomajasServerExtension.getInstance().getCommandService().execute(command, new AbstractCommandCallback() { public void execute(SearchFeatureResponse response) { List features = new ArrayList(); for (org.geomajas.layer.feature.Feature feature : response.getFeatures()) { features.add(create(feature, layer)); } Map> mapping = new HashMap>(); mapping.put(layer, features); callback.execute(mapping); } }); } // ------------------------------------------------------------------------ // Public methods: // ------------------------------------------------------------------------ @Override public Feature create(org.geomajas.layer.feature.Feature feature, FeaturesSupported layer) { Map> attributes = new HashMap>(); for (String key : feature.getAttributes().keySet()) { attributes.put(key, new AttributeImpl(feature.getAttributes().get(key))); } return new FeatureImpl(layer, feature.getId(), attributes, feature.getGeometry(), feature.getLabel()); } // ------------------------------------------------------------------------ // Searching features by location: // ------------------------------------------------------------------------ @Override public void search(String crs, final VectorServerLayer layer, Geometry location, double buffer, final FeatureMapFunction callback) { SearchByLocationRequest request = new SearchByLocationRequest(); request.setBuffer(buffer); request.addLayerWithFilter(layer.getServerLayerId(), layer.getServerLayerId(), layer.getFilter()); request.setLocation(location); request.setSearchType(SearchLayerType.SEARCH_ALL_LAYERS.getValue()); request.setCrs(crs); request.setFeatureIncludes(11); GwtCommand command = new GwtCommand(SearchByLocationRequest.COMMAND); command.setCommandRequest(request); GeomajasServerExtension.getInstance().getCommandService().execute(command, new AbstractCommandCallback() { public void execute(SearchByLocationResponse response) { for (List dtos : response.getFeatureMap().values()) { List features = new ArrayList(dtos.size()); for (org.geomajas.layer.feature.Feature feature : dtos) { features.add(create(feature, layer)); } Map> map = new HashMap>(); map.put(layer, features); callback.execute(map); } } }); } @Override public void search(final MapPresenter mapPresenter, Geometry location, double buffer, QueryType queryType, SearchLayerType searchType, float ratio, final FeatureMapFunction callback) { SearchByLocationRequest request = new SearchByLocationRequest(); // Add all FeaturesSupported layers, together with their filters: switch (searchType) { case SEARCH_SELECTED_LAYER: Layer layer = mapPresenter.getLayersModel().getSelectedLayer(); if (layer instanceof VectorServerLayer) { VectorServerLayer serverLayer = (VectorServerLayer) layer; request.addLayerWithFilter(serverLayer.getServerLayerId(), serverLayer.getServerLayerId(), serverLayer.getFilter()); } else { throw new IllegalStateException( "No selected layer, or selected layer is not of the type FeaturesSupported."); } break; default: for (int i = 0; i < mapPresenter.getLayersModel().getLayerCount(); i++) { Layer layer2 = mapPresenter.getLayersModel().getLayer(i); if (layer2 instanceof VectorServerLayer) { VectorServerLayer serverLayer = (VectorServerLayer) layer2; request.addLayerWithFilter(serverLayer.getServerLayerId(), serverLayer.getServerLayerId(), serverLayer.getFilter()); } } } request.setBuffer(buffer); request.setLocation(location); request.setQueryType(queryType.getValue()); request.setSearchType(searchType.getValue()); request.setRatio(ratio); request.setCrs(mapPresenter.getViewPort().getCrs()); request.setFeatureIncludes(11); GwtCommand command = new GwtCommand(SearchByLocationRequest.COMMAND); command.setCommandRequest(request); GeomajasServerExtension.getInstance().getCommandService().execute(command, new AbstractCommandCallback() { public void execute(SearchByLocationResponse response) { Map> mapping = new HashMap>(); for (Entry> entry : response.getFeatureMap() .entrySet()) { VectorServerLayer layer = searchLayer(mapPresenter, entry.getKey()); List features = new ArrayList(entry.getValue().size()); for (org.geomajas.layer.feature.Feature feature : entry.getValue()) { features.add(create(feature, layer)); } mapping.put(layer, features); } callback.execute(mapping); } }); } // ------------------------------------------------------------------------ // Private methods: // ------------------------------------------------------------------------ private VectorServerLayer searchLayer(MapPresenter mapPresenter, String layerId) { if (layerId != null) { for (int i = 0; i < mapPresenter.getLayersModel().getLayerCount(); i++) { Layer layer = mapPresenter.getLayersModel().getLayer(i); if (layer instanceof VectorServerLayer) { VectorServerLayer serverLayer = (VectorServerLayer) layer; if (layerId.equals(serverLayer.getServerLayerId())) { return (VectorServerLayer) layer; } } } } return null; } /** * Default implementation of a feature attribute. * * @author Pieter De Graef */ private final class AttributeImpl implements Attribute { private final T value; private AttributeImpl(T value) { this.value = value; } @Override public T getValue() { return value; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy