Snippets

Piotr Szrajber Geospatial Portal SDK - Fit Layer for PSS and WFS (with disabled DisplayMode->LimitedByMapRange)

Created by Piotr Szrajber last modified
/**
 * Fit Layer zooming in to particular features for PSS and WFS
 * DisplayMode->LimitedByMapRange must be disabled to make it work on WFS
 * Warning: this coded contains private API calls and may not work in other versions than 16 EP02
 * 2017-03-28 Piotr Szrajber <piotr.szrajber@hexagongeospatial.com>
 */
Sys.Application.add_init(function() {
    try {
        Intergraph.WebSolutions.Core.WebClient.Controls.TreeTools.FitLayer.prototype._isFitLayerAvailable = function(mapLayerConfig) {
            var ms = mapLayerConfig.get_mapService();
            var def = ms.get_definition();
            var name = def.name;

            if (name === "WMS" || name === "WFS" || name === "WMTS" || name === "IWS" || name === "PersonalStorage") {
                return true;
            }
            if (name === "MapPublisher") {
                var p = mapLayerConfig.get_firstLegendItemPriority(),
                    li = mapLayerConfig.get_mapState().get_legend().get_flatLegend()[p],
                    lid = li.get_definition();
                return !!lid.get_legendDefinition();
            }
            return false;
        }

        function getMapLayer(mapLayerConfig) {
            var mapLayers = mapLayerConfig.get_mapState().get_mapControl().get_mapLayers();
            for (var i = 0, l = mapLayers.length; i < l; i++) {
                if (mapLayers[i].get_config().get_id() == mapLayerConfig.get_id()) {
                    return mapLayers[i];
                }
            }
            return null;
        }

        function getBounds(layer, featureClassId) {
            // minx, miny, maxx, maxy
            var minx = +Infinity,
                miny = +Infinity,
                maxx = -Infinity,
                maxy = -Infinity;
            var ds = layer.get_featureDataset(),
                featureClasses = ds.get_featureClasses();
            for (var fc in featureClasses) {
                if (typeof featureClassId !== "undefined" && fc !== featureClassId) continue;
                if (!featureClasses.hasOwnProperty(fc)) continue;
                var features = featureClasses[fc].get_features();
                for (var feature in features) {
                    if (!features.hasOwnProperty(feature)) continue;
                    var bounds = features[feature].get_geometry().get_bounds();
                    minx = Math.min(minx, bounds.get_bottomX());
                    miny = Math.min(miny, bounds.get_bottomY());
                    maxx = Math.max(maxx, bounds.get_upperX());
                    maxy = Math.max(maxy, bounds.get_upperY());
                }
            }
            return [minx, miny, maxx, maxy];
        }

        var orig = Intergraph.WebSolutions.Core.WebClient.Controls.TreeTools.FitLayer.prototype.getMapLayerMenuItems;
        Intergraph.WebSolutions.Core.WebClient.Controls.TreeTools.FitLayer.prototype.getMapLayerMenuItems = function(mapLayerConfig) {
            var name = mapLayerConfig.get_mapService().get_definition().name;
            if (name !== "PersonalStorage" && name !== "WFS") return orig.call(this, mapLayerConfig);
            var layer = getMapLayer(mapLayerConfig);
            if (!layer) {
                $log.writeWarning("No mapLayer");
                return [];
            }
            return [{
                xtype: 'button',
                text: Intergraph.WebSolutions.Core.WebClient.Controls.Translate.FitLayer,
                handler: function(b, e) {
                    var bbox = getBounds(layer);
                    $GP.map.zoom({
                        bbox: bbox
                    });
                }
            }];
        }

        var orig2 = Intergraph.WebSolutions.Core.WebClient.Controls.TreeTools.FitLayer.prototype.getLegendItemMenuItems;
        Intergraph.WebSolutions.Core.WebClient.Controls.TreeTools.FitLayer.prototype.getLegendItemMenuItems = function(legendItem) {
            var lid = legendItem.get_definition(),
                priority = legendItem.get_priority();

            try {
                var type = lid.get_mapService().get_definition().name;
                if (type === "WFS" || type === "PersonalStorage") {
                    var mapLayers = $mapStateManager.findMapState("map").get_mapControl().get_mapLayers(),
                        analysis = $analysisManager.findAnalysis(legendItem.get_analysisId()),
                        featureClassId = (analysis && analysis.get_id()) || lid.get_sourceLegendItemDefinition().get_id(),
                        layer = mapLayers.find(function(mapLayer) {
                            var config = mapLayer.get_config(),
                                firstPriority = config.get_firstLegendItemPriority(),
                                lastPriority = config.get_lastLegendItemPriority();
                            return firstPriority <= priority && priority <= lastPriority;
                        });
                    return [{
                        xtype: 'button',
                        text: Intergraph.WebSolutions.Core.WebClient.Controls.Translate.FitLayer,
                        handler: function(b, e) {
                            var bbox = getBounds(layer, featureClassId);
                            $GP.map.zoom({
                                bbox: bbox
                            });
                        }
                    }];
                }
            } catch (e) {
                // do something with error...
            }
            return orig2.call(this, legendItem);
        };
    } catch (e) {
        $log.writeWarning(e);
    }
});

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.