satpal
satpal

Reputation: 71

mapserver with WMS call with openlayers

I scenario is below :

map is shown under from TiledWMS layer from mapserver. It has 2 layers.

  1. TiledWMS layer for OSM world map.

  2. TiledWMS layer for layers defined in kml file placed in mapserver through .map file. This map file contains many layers.

Now , when user click on map : it got 2 layers as above.

But since 2nd layer is made up of different layers as given in .map file , i am not able to uniquely identify these layers. I want that since 2 nd layer is made up of different layers in kml file i should be able to uniquely identify them on mouse click or hower.

Thanks Satpal

Upvotes: 0

Views: 411

Answers (1)

satpal
satpal

Reputation: 71

I am able to get it : below is samaple code for others.

    var coord = evt.coordinate;
    var pixel = $scope.map.getPixelFromCoordinate(coord);
    var viewProjection = $scope.map.getView().getProjection();
    var viewResolution = $scope.map.getView().getResolution();
    var numberOfLayersOnMap = $scope.map.getLayers();
    var feature = $scope.map.forEachFeatureAtPixel(pixel, function(feature, layer){return feature;}, null, function(layer) {return true;});
    if(feature === undefined)
    {
        $scope.map.forEachLayerAtPixel(pixel, function (layer) 
        {
            if(!layer)
            {
                return ;
            }
            var urlWMSGetFeatureInfo = layer.getSource().getGetFeatureInfoUrl(coord, viewResolution, viewProjection, {
                    'INFO_FORMAT': 'application/vnd.ogc.gml'
            });
            if(urlWMSGetFeatureInfo.indexOf("osm-google.map")<0)
            {
                $http({
                    method: 'GET',
                    url: urlWMSGetFeatureInfo,
                }).success(function(data){
                    var parser = new ol.format.WMSGetFeatureInfo();
                    var features = parser.readFeatures(data);
                    if(features.length>0)
                    {                               
                        var featureName = features[0].n.Name;
                        topOverlayElement.innerHTML = featureName;
                        $scope.highlightOverlay.setFeatures(new ol.Collection());
                        if($scope.flagLinkage == true)
                        {
                            var xmlObj = utility.StringToXML(data);
                            var xmlDocumnet = xmlObj.childNodes[0];
                            var layerNode = xmlDocumnet.children[0];
                            var gmlLayerNode = layerNode.children[0];
                            var layerName = gmlLayerNode.textContent;
                            var layerInfoObject = {};
                            layerInfoObject.layerName = layerName;
                            //layerInfoObject.placemarkName = featureName;
                            $scope.placemarksSelectedObject.push(layerInfoObject);
                            $scope.placemarksSelectedFeatureObject.push(features[0]);
                        }
                        else
                        {
                            $scope.placemarksSelectedFeatureObject.length = 0;
                            $scope.placemarksSelectedFeatureObject.push(features[0]);
                        }
                        $scope.highlightOverlay.setFeatures(new ol.Collection($scope.placemarksSelectedFeatureObject));
                        var featureDescription = features[0].n.description;
                        middleOverlayElement.innerHTML = (featureDescription === undefined) ? '' : featureDescription;
                        $scope.showOverlay(coord);
                    }
                }).error(function (data) {
                    console.log("Not able to get capabilty data.");         
                });
            }
            else
            {
                $scope.closeOverlay(evt);
            }
        });

Upvotes: 1

Related Questions