AngularJS directive to embed an interact with maps managed by Leaflet library

Overview

Angular Leaflet

Why the fork?

While we are grateful for all the original work at tombatossals/angular-leaflet-directive. We need to be able to operate as an organization to respond to issues, pull-requests and other various items quicker. We need to be able to add other developers as admins easier via group permissions via github orgs. Lastly this project needs to be more credible via being a group / org.

Master Branch State

Please note the master branch is currently in a "in-progress state" and is not suitable for use at this point. We are trying break up the library to be more unix / plugin like. This will reduce the burden of constant changes to the core repo (this repo) for each and every unforseeable plugin that leaflet has. Therefore, the new usage plugins will require developers (angular-ui or not) to create specific angular directives, services, factories, and etc to extend the main ui-leaflet directive. Where ui-leaflet would be the main dependency.

Examples:

How to extend: Create new directives, factories, and services specific to plugins. Use the decorator pattern to extend existing services, factories and directives. Specifically see ui-leaflet-draw as it decorates ui-leaflet.

More about decorators:

Goal

AngularJS directive for the Leaflet Javascript Library. This software aims to easily embed maps managed by Leaflet on your project.

Join the chat at https://gitter.im/angular-ui/ui-leaflet CDNJS

Build Status Dependencies  Dependencies Coverage Status

Examples

Browse all the examples added by the community to learn about the directive and its possibilities.

Documentation

See https://angular-ui.github.com/ui-leaflet

How to use it

Include angular-simple-logger before Angular-Leaflet js files. Logger gets installed as a requirement of Angular-Leaflet with bower install or npm install. Note that if you're using the browser to load it without CommonJS (browserify, webpack) please use angular-simple-logger.js (not index.js).

Include the ui-leaflet dependency on your Angular module:

var app = angular.module('demoapp', ['nemLogging','ui-leaflet']);

After that, you can change the default values of the directive on your angular controller. For example, you can change the tiles source, the maxzoom on the Leaflet map or the polyline path properties.

angular.extend($scope, {
    defaults: {
        tileLayer: 'http://{s}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png',
        maxZoom: 14,
        path: {
            weight: 10,
            color: '#800000',
            opacity: 1
        }
    }
});

If you want to set the start of the map to a precise position, you can define the "center" property of the scope (lat, lng, zoom). It will be updated interacting on the scope and on the leaflet map in two-way binding. Example:

angular.extend($scope, {
    center: {
        lat: 51.505,
        lng: -0.09,
        zoom: 8
    }
});

If you need to run any method on the map object, use leafletData as following (notice the map object is returned in a form of a promise):

angular.module('myModule').controller('MapController', ['$scope', 'leafletData',
    function($scope, leafletData) {
        leafletData.getMap().then(function(map) {
            L.GeoIP.centerMapOnPosition(map, 15);
        });
    }
]);

Finally, you must include the markup directive on your HTML page:

<leaflet defaults="defaults" lf-center="center" height="480px" width="640px"></leaflet>

If you want to have more than one map on the page and access their respective map objects, add an id attribute to your leaflet directive in HTML:

<leaflet id="mymap" defaults="defaults" lf-center="center" height="480px" width="640px"></leaflet>

And then you can use this id in getMap():

angular.module('myModule').controller('MapController', ['$scope', 'leafletData',
    function($scope, leafletData) {
        leafletData.getMap('mymap').then(function(map) {
            L.GeoIP.centerMapOnPosition(map, 15);
        });
    }
]);
Comments
  • Latency using markercluster with 15K points

    Latency using markercluster with 15K points

    From @vadvv on May 19, 2014 15:12

    I'm having a problem clustering a large number of points (my current set is 40K+ points, but I've even gone down to about 15K points). It takes very long to cluster, and then when zooming in/out it takes similar time for the layer to render. Most of the time the browser (in my case Chrome) asks to kill the tab.

    I should add that to overcome this, I had decided to show the data as a heat map until a zoom level is reached, after which I thought I could show the cluster, but that didn't seem to help either and resulted in the same delay.

    These are my layerOptions: layerOptions: { "chunkedLoading": true, "showCoverageOnHover": false, "removeOutsideVisibleBounds": true, "chunkProgress": updateProgressBar }

    I see that there's a leafletjs example that clusters 50K points pretty gracefully: http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.50000.html

    Here's a fiddle demonstrating the behavior: http://jsfiddle.net/redgis/BLW4p/

    Copied from original issue: tombatossals/angular-leaflet-directive#371

    opened by nmccready 39
  • clustering geojson markers

    clustering geojson markers

    From @jessertaylor on May 6, 2015 10:13

    Hi,

    Cannot find an example of clustering geojson markers, is it possible in this directive? (I know how to do it using L.geoJson etc)

    @nmccready - I know you use geojson a lot, have you done this?

    Thanks

    Copied from original issue: tombatossals/angular-leaflet-directive#744

    duplicate enhancement 
    opened by nmccready 15
  • feat(markers,paths,geojson,watchOptions): More flexible watch options…

    feat(markers,paths,geojson,watchOptions): More flexible watch options…

    … and more

    watch-options has been expanded to include paths and redesigned to handle more types of watching. markersWatchOptions and geojsonWatchOptions are no longer supported. Instead, this direcitve now supports the watch-options attribute, which takes an object that contains the watch options for each map element type:

    watchOptions = {
        markers: <markerWatchOptions>,
        geojson: <geojsonWatchOptions>,
        paths: <pathsWatchOptions>
    }
    

    The watch options for these map element types looks like:

    {
        type: <watchTypes>,
        individual: {
            type: <watchTypes>
        }
    }
    

    <watchTypes> can be one of: -watch: $scope.$watch with no deep watch on the object -watchDeep: $scope.$watch with a deep watch on the object -watchCollection: $scope.$watchCollection on the object -null: Do not watch the collection

    I've removed support for the directive attributes watch-markers and watch-paths. While these make sense when set to false, it's ambiguous how they should function when set to true, especially when combined with watch-options.

    There are some other minor fixes in this commit (fixing breaking examples, and another small bug).

    BREAKING CHANGE: markersWatchOptions, geojsonWatchOptions, watch-markers, and watch-paths are no longer supported. The format of the watch options has also changed.

    Before:

    <leaflet defaults='defaults' markers-watch-options='markerWatchOptions'>
    

    After:

    <leaflet defaults='defaults' watch-options='watchOptions'>
    
    <script>
        $scope.watchOptions = {
            markers: <watchOptions>
        }
    </script>
    

    The same can be said for geojson.

    WatchOptions. shouldWatch and isDeep are no longer supported, but the same behaviour can be achieved:

    shouldWatch: true, isDeep: true == type: 'watchDeep' shouldWatch: true, isDeep: false == type: 'watch' shouldWatch: false, isDeep: false == type: null shouldWatch: false, isDeep: true == type: null

    Furthermore,

    Before:

    <leaflet watch-markers='false'>
    

    After:

    <leaflet watch-options='watchOptions'>
    
    <script>
    $scope.watchOptions = {
        markers: {
            type: null,
            individual: {
                type: null
            }
        }
    };
    </script>
    

    watch-paths='false' can be achieved in a similar manner.

    opened by cgat 15
  • fix(Markers): fix marker icon broken with latest Leaflet version (1.0)

    fix(Markers): fix marker icon broken with latest Leaflet version (1.0)

    Leaflet now tries to auto-detect the path for the icons, but when using a base64 one, it breaks. Thus, we need to force the imagePath to be ' '. See this line in Leaflet source: https://github.com/Leaflet/Leaflet/blob/master/src/layer/marker/Icon.Default.js#L36

    Broken demo: http://jsfiddle.net/ar2bo629/ Fixed Demo: http://jsfiddle.net/f7bq9v6b/

    opened by ValentinH 14
  • Marker clustering and controller reset

    Marker clustering and controller reset

    I use the directive in a big single page application where the navigation between the pages is handled using angular ui-router, so the controllers are destoyed/created each time. I noticed that my markers were correctly loaded on the first map page visualisation but not on the subsequent page visualisations.

    It seems that it is related to clustering. Indeed I add a 'group' property to my markers to create different clusters. Removing this property solved my issue. I suspect some data structures are not correctly cleaned when destroying the scope using marker clustering.

    I started to jump into the source code trying to fix it but I raise this issue waiting to be more comfortable with the directive source code...

    MISSING MCVE (Example) 
    opened by claustres 14
  • Debugging failure to render GeoJSON

    Debugging failure to render GeoJSON

    I've got a very bizarre issue. I am building a website off of MEAN.js (private repo currently, because of client) and I've added a number of modules for displaying data and graphs and such, and I'm getting into displaying maps now.

    I've been trying to make ui-leaflet work with the GeoJSON data and it is failing to render the polygons in the browser, and does not generate an error on the browser's console. I can look at the scopes using Batarang and see that they're correctly populated, but they just don't show.

    When I make an example using a pristine instance of MEAN.js the polygons do render, so I'm unable to duplicate the problem. I've added the additional JS libraries that are called in other parts of the project to my pristine MEAN.js instance and that seems to have no impact. I've overwrittent the module in my problem project with the module from my pristine project and there is still no impact.

    I'm out of ideas for how to find out what is causing this issue. Here's my example where I fail to reproduce the issue: https://github.com/jjcad/leaflet_meanjs_example I'm open to any and all ideas about how to solve this.

    MISSING MCVE (Example) 
    opened by jjcad 14
  • Marker base64 Image Src is prepended with path to leaflet images

    Marker base64 Image Src is prepended with path to leaflet images

    I have installed the leaflet and ui-leaflet via bower. This is the line in my html: <leaflet id="mapid" lf-center="ctrl.courtOnMap" markers="ctrl.courtMarkers"></leaflet>

    When I look in the browser debug console at the source code this is what I find for the source of the marker: <div class="leaflet-pane leaflet-marker-pane"><img tabindex="0" class="leaflet-marker-icon leaflet-zoom-animated leaflet-interactive" style="width: 25px; height: 41px; margin-top: -41px; margin-left: -12px; z-index: 125; transform: translate3d(278px, 125px, 0px);" src="http://localhost:9000/bower_components/leaflet/dist/images/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAGmklEQVRYw7VXeUyTZxjvNnfELFuyIzOabermMZEeQC

    I have temporarily fixed this issue by pointing the icon images to the leaflet image name. Starting at line 2092: if (!isDefined(iconData) || !isDefined(iconData.iconUrl)) { return new L.Icon.Default({ iconUrl: "marker-icon.png",//base64icon, shadowUrl: "marker-shadow.png",//base64shadow, iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41] }); }

    opened by ctwoolsey 12
  • leaflet.label compiling only onclick

    leaflet.label compiling only onclick

    From @lleoooell on March 28, 2015 18:30

    Hello,

    First, thanks for this awesome directive !

    I'm running something strange and i cannot find a solution.

    I'm running angular-leaflet in a MEAN stack app and everything work perfectly.

    I have 4 markers with option "getMessageScope: function() {return $scope; }," to let me use a ng-click directive in popup and its ok. by default, focus is set on false.

    I want also have a leaflet.label with "nohide:true" and a custom class on the right of the marker and bind some content in the label.

    Problem is, on page load, my labels are visible but the data content seems to be binded only when i click on the marker... Il i want it to be compiled on page load, i have to set my popup option focus to true. and i don't want that.

    I want my popup hidden by default and my label visible with data binding by deflault...can someone knows how can i solve this ?

     m4: {
                            lat: 48.180913,
                            lng: 6.445758,
                             message: '<button style="width:100%" class=\'btn btn-tech\' ng-click="createAlert(\'input\')">Clic me ! </button>',
                            getMessageScope: function() {return $scope; },
                            focus: false,
                            icon: local_icons.myicon,
                            label: {
                                message: '<div> <p data-ng-bind="array.length"></p></div>',
                                options: {
                                    noHide: true,
                                    className : "customClass"
                                }
                            }
                        },
    

    Copied from original issue: tombatossals/angular-leaflet-directive#666

    opened by nmccready 11
  • Google maps and Overlays out of sync while zooming

    Google maps and Overlays out of sync while zooming

    From @robotnic on November 27, 2014 16:42

    When the map is zoomed first the Overlay animation appears and after that the google maps animation starts.

    Openlayers has a nicer zoom animation I think - no idea how they do it. http://openlayers.org/en/v3.0.0/examples/google-map.html

    But it's also not in sync.

    Copied from original issue: tombatossals/angular-leaflet-directive#552

    opened by nmccready 10
  • Help adding geoJson data

    Help adding geoJson data

    From @carrbrpoa on October 27, 2015 16:45

    Hello,

    I'm trying to add some geoJson data (coming from geoserver) to a map but nothing happens, no errors too. The way I'm trying:

    var highlightedFeatures = L.geoJson(features, {
            style : function () {
                return {
                    color : 'blue'
                };
            }
        });
    
    leafletData.getMap().then(function (map) {
        highlightedFeatures.addTo(map);
        ctrl.highlightedFeatures.push(highlightedFeatures);
    });
    

    Where features, in this case, is:

    {
        "type" : "FeatureCollection",
        "totalFeatures" : 1,
        "features" : [{
                "type" : "Feature",
                "id" : "bairros_vigentes_3857.17",
                "geometry" : {
                    "type" : "MultiPolygon",
                    "coordinates" : [[[[-5700570.791406423, -3510054.724027851], [-5700500.552303476, -3510162.455164274], [-5700522.24922982, -3510151.8295360254], [-5700563.888861348, -3510339.556086567], [-5700759.703553896, -3510324.553000353], [-5700766.594001001, -3510444.6188690006], [-5700870.0157592995, -3510433.9878755454], [-5700861.886291982, -3510447.1991742603], [-5700841.512881324, -3510491.034246855], [-5700819.037297369, -3510539.803349839], [-5700812.786642194, -3510554.3171530166], [-5700709.37127552, -3510798.87340189], [-5700693.89682202, -3510833.418497298], [-5700942.2481434, -3510975.961715056], [-5701038.549523072, -3511034.5209689154], [-5701054.357670219, -3511008.9665814443], [-5701082.636045532, -3511026.172967495], [-5701204.07668303, -3511091.0658768346], [-5701369.84237563, -3511178.209878858], [-5701373.954992444, -3511178.2021789732], [-5701385.20004292, -3511172.5248109004], [-5701402.893846139, -3511191.2006702097], [-5701444.431395652, -3511150.513958259], [-5701505.984170947, -3511086.8752346276], [-5701535.269197187, -3511043.4569768473], [-5701550.97087914, -3511009.635476624], [-5701558.303939491, -3510986.2712462973], [-5701571.231954351, -3510935.4867039374], [-5701576.8005849, -3510913.721406214], [-5701584.582973961, -3510821.759274026], [-5701590.2619994, -3510752.860685064], [-5701604.29139628, -3510596.9318224047], [-5701609.635944826, -3510532.2408801126], [-5701608.425912271, -3510445.0841155173], [-5701606.414379966, -3510382.1479682727], [-5701600.186894282, -3510292.9716556054], [-5701590.618566236, -3510143.6189028737], [-5701582.719112358, -3509989.624090637], [-5701584.618006582, -3509770.6455351734], [-5701593.739884744, -3509710.5920860544], [-5701598.591813305, -3509679.2106437194], [-5701614.298672342, -3509580.7794641135], [-5701623.357396592, -3509538.839918061], [-5701656.648601553, -3509451.0444596154], [-5701703.19148251, -3509371.3446171973], [-5701768.969110557, -3509295.959437128], [-5701778.545893647, -3509286.5156263714], [-5701816.803572826, -3509250.5350005548], [-5701883.411138347, -3509195.9745235923], [-5701877.959731396, -3509174.378524411], [-5701871.400831146, -3509167.865729685], [-5701768.309206971, -3509099.038639376], [-5701533.547685612, -3508943.7459998596], [-5701382.91849116, -3508844.555476925], [-5701296.751386759, -3508972.466597662], [-5701241.864319092, -3509056.3829003563], [-5701218.046826576, -3509093.487460025], [-5701188.651742937, -3509139.281296378], [-5701162.378096308, -3509180.367462007], [-5701106.605737978, -3509254.570772405], [-5701028.9068742655, -3509371.0124677443], [-5700971.78402489, -3509457.2544636563], [-5700902.984737577, -3509559.614763658], [-5700886.077574642, -3509585.1680223816], [-5700866.8139100615, -3509614.0610106564], [-5700814.148657003, -3509693.0451260707], [-5700745.580072195, -3509794.6809396776], [-5700673.5540296, -3509900.0937751466], [-5700649.056126722, -3509937.4076903514], [-5700570.791406423, -3510054.724027851]]]]
                },
                "geometry_name" : "geom",
                "properties" : {
                    "objectid" : 138,
                    "codigo" : 106,
                    "nome" : "AZENHA",
                    "editor" : null,
                    "data_edica" : null
                }
            }
        ],
        "crs" : {
            "type" : "name",
            "properties" : {
                "name" : "urn:ogc:def:crs:EPSG::3857"
            }
        }
    }
    

    The leaflet directive:

    <leaflet center="center" controls="controls" layers="layers" width="100%" height="100%" defaults="defaults"></leaflet>
    

    Any ideas?

    Thanks in advance

    Copied from original issue: tombatossals/angular-leaflet-directive#1007

    opened by nmccready 10
  • Typescript

    Typescript

    From @chughk1 on October 8, 2015 15:24

    Are there any plans to convert angular-leaflet directive in typescript?

    Copied from original issue: tombatossals/angular-leaflet-directive#985

    question 
    opened by nmccready 9
  • Issue with Clickable Marker Content

    Issue with Clickable Marker Content

    Hello,

    I've trying to allow users to be able to navigate through a link (ng-click calls a redirect function).

    I've tried available method to compile and attach the ng-click to the link but it doesn't seem to work.

    I believe this should be valid, but the clicks are not registered and doesn't call the function.

    image

    opened by raxIsBlur 0
  • Disable auto center adjust after change marker coordinates programmatically

    Disable auto center adjust after change marker coordinates programmatically

    Hi everyone after change marker coordinates programatically leflet auto adust the center map. My app track device location but user can focus in other markers.

    My map losses the marker focus each time user moves.

    How disable this behavior?

    Example: http://angular-ui.github.io/ui-leaflet/#!/examples/dragging-markers

    Edit: message attribute in marker makes auto center. Remove message.

    opened by ckristhoff 0
  • Could anyone propagate this commit to the 2.0.x tag version?

    Could anyone propagate this commit to the 2.0.x tag version?

    I've found a bug in the 2.0.0 tag that has been solved in 1.0.3/master branch. Could anyone propagate this solution to the 2.0.0 tag?

    Here it is the commit: https://github.com/angular-ui/ui-leaflet/commit/78d64f5a5a677927f8aa1da90cbb4f17892f8a31#diff-bf3f09a49bf8f9d1a1bc0625da2b235f

    opened by jousepo 0
  • Popup closes when changing marker icon

    Popup closes when changing marker icon

    Hi,

    When I update the icon of a (div) marker as follows:

    _marker.icon.html = "some html";
    

    The popup, if open, closes. This makes the popup unusable if the icon changes every few seconds.

    I've tracked the problem down to the following code on line 2361 of ui-leaflet.js:

    marker.closePopup();
    marker.unbindPopup();
    if (isString(markerData.message)) {
        marker.bindPopup(markerData.message, markerData.popupOptions);
        // if marker has been already focused, reopen popup
        if (map.hasLayer(marker) && markerData.focus === true) {
            marker.openPopup();
        }
    }
    

    When I comment this code the popup stays open when changing the icon. Is there any way to prevent the popup from closing? If not, I propose to add some kind of flag to the marker defining if the popup should close on icon change. Something like:

    _marker = {
        ...
        closePopupOnIconChange: false
        ...
    }
    

    or

    _marker = {
        ...
        popupOptions: {
            closeOnIconChange: false
        }
        ...
    }
    

    Thanks!

    opened by luukrijnbende 0
  • Marker in not updating its position on the map, when its value is updated

    Marker in not updating its position on the map, when its value is updated

    I am using ui-leaflet in Cordova mobile app. I have a simple marker, initially shown on the map. However, when I change either marker's lat or lng, this is not shown on the map. In case of user action on the map, however e.g. touch, click, drag, the marker position on the map updates properly.

    opened by angel1st 0
React components for Leaflet maps

React Leaflet React components for Leaflet maps. Documentation Getting started API reference Changes See the CHANGELOG file. Contributing See the CONT

Paul Le Cam 4.4k Jan 3, 2023
Vue 2 components for Leaflet maps

Vue2Leaflet Vue2Leaflet is a JavaScript library for the Vue framework that wraps Leaflet making it easy to create reactive maps. How to install npm in

Vue Leaflet 1.9k Dec 29, 2022
Mapbox JavaScript API, a Leaflet Plugin

mapbox.js A Mapbox plugin for Leaflet, a lightweight JavaScript library for traditional raster maps. For the state-of-the-art Mapbox vector maps libra

Mapbox 1.9k Dec 23, 2022
This is the leaflet plugin for GeoServer. Using this plugin user can have access to wms and wfs request easily.

Documentation leaflet-geoserver-request This is the plugin for Geoserver various kind of requests. Using this plugin, we can make WMS, WFS, getLegendG

Tek Kshetri 127 Dec 15, 2022
Add time dimension capabilities on a Leaflet map.

Leaflet TimeDimension Add time dimension capabilities on a Leaflet map. Examples and basic usage API L.Map L.TimeDimension L.TimeDimension.Layer L.Tim

SOCIB public code 379 Dec 23, 2022
This map is tracking the position of ISS(international space setallite) at every 1 second. I use Nasa's "where the iss" API and "Leaflet.js" for the map.

ISS-tracking-map About This map is tracking the position of ISS(international space setallite) at every 1 second. I use Nasa's "where the iss" API and

Waz.sheeran 2 Oct 25, 2021
Simple location picker on Leaflet map

Leaflet Location Picker Simple location picker with Leaflet map Usage: <label>Insert a Geo Location <input id="geoloc" type="text" value="" /> </lab

Stefano Cudini 37 Nov 17, 2022
:leaves: JavaScript library for mobile-friendly interactive maps

Leaflet is the leading open-source JavaScript library for mobile-friendly interactive maps. Weighing just about 39 KB of gzipped JS plus 4 KB of gzipp

Leaflet 36.5k Jan 1, 2023
An open-source JavaScript library for world-class 3D globes and maps :earth_americas:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin. It uses WebGL for hardware-accelerated graphics

Cesium 9.7k Dec 26, 2022
Polymaps is a free JavaScript library for making dynamic, interactive maps in modern web browsers.

Polymaps Polymaps is a free JavaScript library for making dynamic, interactive maps in modern web browsers. See http://polymaps.org for more details.

Urban Airship 1.6k Dec 23, 2022
An open-source JavaScript library for world-class 3D globes and maps :earth_americas:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin. It uses WebGL for hardware-accelerated graphics

Cesium 9.7k Jan 3, 2023
the easiest way to use Google Maps

Important If you're developer, I'm moving gmaps.js to NPM, you can give your opinion and check the migration progress in Issue #404 gmaps.js - A Javas

Gustavo Leon 7.1k Dec 28, 2022
UNMAINTAINED Open source JavaScript renderer for Kartograph SVG maps

This project is not maintained anymore. Here are a few reasons why I stopped working on kartograph.js: there's no need to support non-SVG browsers any

null 1.5k Dec 11, 2022
the easiest way to use Google Maps

Important If you're developer, I'm moving gmaps.js to NPM, you can give your opinion and check the migration progress in Issue #404 gmaps.js - A Javas

Gustavo Leon 7.1k Apr 7, 2021
This is a collection of over two hundred code samples an growing for the Bing Maps V8 web control.

Bing Maps V8 Code Samples This is a collection of over a hundred code samples for the Bing Maps V8 web control. These samples have been collected from

Microsoft 130 Dec 8, 2022
This project contains the TypeScript definitions for the Bing Maps V8 Web Control.

Bing Maps V8 TypeScript Definitions These are the official TypeScript definitions for the Bing Maps V8 Web Control. These can be used to provide intel

Microsoft 35 Nov 23, 2022
Converts geojson to svg string given svg viewport size and maps extent.

geojson2svg Converts geojson to svg string given svg viewport size and maps extent. Check world map, SVG scaled map and color coded map examples to de

Gagan Bansal 163 Dec 17, 2022
Downloads satellite images from Google Maps, only slightly illegal.

Google Maps Satellite Downloader This is a script to download satellite images from Google Maps. The below mentioned optimization system requires that

null 5 Oct 31, 2022
A simple web extension that redirects Twitter, YouTube, Instagram & Google Maps requests to privacy friendly alternatives.

Get Donate FIRO aEyKPU7mwWBYRFGoLiUGeQQybyzD8jzsS8 BTC: 3JZWooswwmmqQKw5iW6AYFfK5gcWTrvueE ETH: 0x90049dc59365dF683451319Aa4632aC61193dFA7 About A web

Simon Brazell 1.6k Dec 29, 2022