Search code examples
javascriptangularjsarcgisesriarcgis-js-api

How do i use ArcGIS Maps in Angular-Js?


How do i use ArcGIS Maps in Angular-Js easily with manipulating the;

  • zoom
  • locate
  • adding markers
  • search my places by Geo coordinates and Place name
  • loading markers lazily and the like?

Can some one Give me a sample please.


Solution

  • I came across a very simple way of adding all the mentioned features and be able to control them in this way.

     angular.module('eBlood').directive('esriPointRenderersMap', ['$q', 'appConfig', 'esriLoader', 'esriRegistry', function($q, appConfig, esriLoader, esriRegistry) {
        return {
            // element only directive
            restict: 'E',
    
            // isolate the scope
            scope: {
                // 1-way string binding
                rendererActive: '@',
                // 2-way object binding
                basemapActive: '=',
                clusterTolerance: '=',
                heatmapRendererParams: '='
            },
    
            compile: function($element, $attrs) {
                // remove the id attribute from the main element
                $element.removeAttr('id');
                // append a new div inside this element, this is where we will create our map
                $element.append('<div id=' + $attrs.id + '></div>');
                // since we are using compile we need to return our linker function
                // the 'link' function handles how our directive responds to changes in $scope
                // jshint unused: false
                return function(scope, element, attrs, controller) {};
            },
    
            controller: function($scope, $element, $attrs) {
                var mapDeferred = $q.defer();
                var esriApp = {};
    
                // add this map to the registry
                if ($attrs.registerAs) {
                    var deregister = esriRegistry._register($attrs.registerAs, mapDeferred.promise);
                    // remove this from the registry when the scope is destroyed
                    $scope.$on('$destroy', deregister);
                }
    
                esriApp.createGeoCordFinder = coords => {
                    return esriLoader.require([
                        'esri/geometry/Point',
                        'esri/tasks/Locator'
                    ]).then(x => {
                        var Point = x[0];
                        if (!esriApp.mapLocator) {
                            var Locator = x[1];
                            esriApp.mapLocator = new Locator('https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer');
                        }
                        return esriApp.mapLocator.locationToAddress(new Point(coords)).then(res => {
                            return res.address.Match_addr;
                        });
                    });
                };
    
    
                esriApp.zoomToLocation = mapOptions => {
                    if (mapOptions.view) {
                        mapOptions.zoom = mapOptions.zoom || appConfig.pointRenderers.mapOptions.zoom;
                        mapOptions.view.goTo({
                            target: [mapOptions.coordinates.longitude, mapOptions.coordinates.latitude],
                            zoom: mapOptions.zoom
                        });
    
                        // change the marker to the current Geo.
                        var promise = (!mapOptions.address) ? esriApp.createGeoCordFinder(mapOptions.coordinates) : $q.when(mapOptions.address);
    
                        promise.then(location => {
                            esriApp.changeLocationMarker({
                                view: mapOptions.view,
                                attributes: {
                                    address: location
                                },
                                geometry: {
                                    longitude: mapOptions.coordinates.longitude,
                                    latitude: mapOptions.coordinates.latitude
                                }
                            });
                        });
    
                    }
                };
    
    
                esriApp.createLocateIcon = mapOptions => {
                    var container;
    
                    if (!mapOptions || !mapOptions.view)
                        return $q.reject('Our MapView is setYet');
    
                    container = mapOptions.container |"map";
    
                    mapOptions.container = undefined;
                    mapOptions.goToLocationEnabled = appConfig.goToLocationEnabled;
                    mapOptions.graphic = null;
    
                    return esriLoader.require([
                        'esri/widgets/Locate'
                    ]).then(x => {
    
                        var Locate = x[0];
                        esriApp.locateWidget = new Locate(mapOptions, container);
                        esriApp.locateWidget.startup();
    
                        if (!container)
                            mapOptions.view.ui.add(esriApp.locateWidget, 'top-left');
    
                        esriApp.locateWidget.on('locate', data => {
                            esriApp.zoomToLocation({
                                view: mapOptions.view,
                                coordinates: data.position.coords
                            });
                        });
    
                        return esriApp.locateWidget;
                    });
    
                };
    
                function setSearchWidget(opts) {
                    var srcNodeRef;
    
                    if (!opts || !opts.view) {
                        return $q.reject('MapView is undefined');
                    }
    
    
    
                    srcNodeRef = opts.container;
    
                    opts.container = undefined;
                    opts.showPopupOnSelect = false;
                    opts.autoSelect = false;
    
                    return esriLoader.require([
                        'esri/widgets/Search'
                    ]).then(x => {
                        var Search = x[0];
    
                        var searchWidget = new Search(opts, srcNodeRef);
                        searchWidget.startup();
    
                        if (!srcNodeRef) {
                            opts.view.ui.add(searchWidget, 'top-right');
                        }
    
                        searchWidget.on('search-complete', e => {
                            if (e.results.length > 0 && e.results[0].results.length > 0) {
                                var res = e.results[0].results[0];
                                var coords = {
                                    longitude: res.feature.geometry.longitude,
                                    latitude: res.feature.geometry.latitude
                                };
    
                                esriApp.zoomToLocation({
                                    view: opts.view,
                                    coordinates: coords,
                                    address: res.name
                                });
                            }
                        });
    
                        return searchWidget;
    
                    });
                }
    
    
                var mapoption = {
                    map: esriApp.map,
                    container: 'map',
                    zoom: 3,
                    padding: {
                        top: 65
                    },
                    view: esriApp.mapView
                };
    
    
    
                esriApp.buildmap = (mapViewDiv) => {
                    return esriApp.creatMap({
                        basemap: $scope.basemapActive
                    })
                        .then(map => {
                            mapoption.map = map;
                            mapoption.container = mapViewDiv;
                            return esriApp.createMapView(mapoption);
                        });
                };
    
                esriApp.creatMap = properties => {
                    return esriLoader.require(['esri/Map'])
                        .then(esriModules => {
                            var Map = esriModules[0];
                            return new Map(properties);
                        });
                };
    
                esriApp.createMapView = config => {
                    return esriLoader.require(['esri/views/MapView'])
                        .then(x => {
                            var MapView = x[0];
                            esriApp.mapView = new MapView(config);
                            mapDeferred.resolve({
                                view: esriApp.mapView
                            });
                            return mapDeferred.promise;
                        });
                };
    
                esriApp.map = esriApp.buildmap($attrs.id);
    
    
                mapoption.view = esriApp.mapView;
                esriApp.createLocateIcon(mapoption);
                setSearchWidget(mapoption);
    
    
                mapDeferred.promise.then(function(esriApp) {
    
                    // clean up
                    $scope.$on('$destroy', function() {
                        esriApp.map.destroy();
                    });
                });
                // });
    
    
    
    
            }
        };
    }]);
    

    The simple directive will be very use full. More so now that it updates the 'appConfig' global config object with the map features. This worked very well for me.

    Thanks Guys for you contributions.