Pandas Network Analysis: fast accessibility metrics and shortest paths, using contraction hierarchies :world_map:

Related tags

Geolocation pandana
Overview

Coverage Status

Pandana

Pandana is a Python library for network analysis that uses contraction hierarchies to calculate super-fast travel accessibility metrics and shortest paths. The numerical code is in C++.

New in v0.5 and v0.6 is vectorized, multi-threaded calculation of shortest path routes and distances: network.shortest_paths(), network.shortest_path_lengths().

Documentation: http://udst.github.io/pandana

Installation

As of March 2021, binary installers are provided for Mac, Linux, and Windows through both PyPI and Conda Forge.

  • pip install pandana
  • conda install pandana --channel conda-forge

Pandana is easiest to install in Python 3.6 to 3.9. The last version of Pandana with Python 2.7 binaries is v0.4.4 on Conda Forge. The last version with Python 3.5 binaries is v0.6 on Pip.

See the documentation for information about other installation options.

Demo

Pandana-demo.ipynb

Acknowledgments

Pandana was created by Fletcher Foti, with subsequent contributions from Matt Davis, Federico Fernandez, Sam Maurer, and others. Sam Maurer is currently the lead maintainer. Pandana relies on contraction hierarchy code from Dennis Luxen and his OSRM project.

Academic literature

A paper on Pandana was presented at the Transportation Research Board Annual Conference in 2012. Please cite this paper when referring to the methodology implemented by this library.

Related UDST libraries

Comments
  • Compile libraries under clang on Mac

    Compile libraries under clang on Mac

    With these changes I can run make on my Mac and build ann, sparsehash, and contraction_hierarchies with Apple's clang compiler. I still cannot build the pyaccess extension, though, because clang does not support dllexport and dllimport used there. If we want to be able to build this without GNU gcc we'll have to take those out somehow.

    opened by jiffyclub 22
  • Different results when making multiple calls with nearest_pois

    Different results when making multiple calls with nearest_pois

    Description of the bug

    I am assigning network node_ids a to parcel data set and then running nearest_poi to find all of the parcels within a mile of a set of coordinates. I want to be able to re-run these queries without re-creating the network. However, If I use one set of coordinates, then a different set of coordinates whose buffer intersects with the first set, then run the first set again, I get a different number of parcels returned in the first and third query. Please see the code as it might be easier to understand.

    I am pretty sure that this is not a copy of a reference problem (in my code) because I use df.copy() to make a copy of the original parcel dataframe in the get_nearest_parcels function before any modifications are made to it. Also, the reason I do not want to recreate the network after each query is to save time- I am prototyping a web service that uses pandana to generate geojson isochrones from a passed in set of coordinates. So ideally the network is loaded and the app is listening for coordinates to run the query. I noticed this behavior because the app started generating weird polygons when making multiple calls from the same area. I have added the network files below.

    UPDATE: The parcel DataFrame has nothing to do with the error so I have updated the code for simplicity.

    Thanks,

    Stefan

    Network data (optional)

    https://file.ac/8UQg8JUbhvs/

    Environment

    • Operating system: Windows

    • Python version: 2,7

    • Pandana version: 0.2.0

    • Pandana required packages versions (optional):

    Paste the code that reproduces the issue here:

    import pandana as pdna
    import pandas as pd
    import numpy as np
    
    nodes_file_name = r'D:\Stefan\Isochrone\repository\data\all_streets_nodes_2014.csv'
    links_file_name = r'D:\Stefan\Isochrone\repository\data\all_streets_links_2014.csv'
    
    max_dist = 5280 
    
    # nodes must be indexed by node_id column, which is the first column
    nodes = pd.DataFrame.from_csv(nodes_file_name)
    links = pd.DataFrame.from_csv(links_file_name, index_col = None )
    
    # get rid of circular links
    links = links.loc[(links.from_node_id <> links.to_node_id)]
    
    # assign impedance
    imp = pd.DataFrame(links.Shape_Length)
    imp = imp.rename(columns = {'Shape_Length':'distance'})
    
    # create pandana network
    network = pdna.network.Network(nodes.x, nodes.y, links.from_node_id, links.to_node_id, imp)
    
    network.init_pois(1, max_dist, 1)
    
    def get_nearest_nodes(x,y):
        print 'Getting data'
        x = pd.Series(x)
        y = pd.Series(y)
        #Set as a point of interest on the pandana network
        network.set_pois('tstop', x, y)
        #Find distance to point from all nodes, everything over max_dist gets a value of 99999
        res = network.nearest_pois(max_dist, 'tstop', num_pois=1, max_distance=99999)
        res = (res[res <> 99999]/5280.).astype(res.dtypes) # convert to miles
        return res 
    
    
    #### ****Re-Run above code for each test**** #####
    
    ##### TEST 1 #####
    # Same coordinates, same result
    test1 = get_nearest_nodes(1272010.0, 228327.0)
    print len(test1[(test1[1] > 0)])
    test2 = get_nearest_nodes(1272010.0, 228327.0)
    print len(test2[(test2[1] > 0)])
    
    ##### TEST 2- this shows the potential bug #####
    # First and Third coordinates are the same but give different result. 
    # The second set of coordinates are within the buffer distance of the first/third. 
    test1 = get_nearest_nodes(1272010.0, 228327.0)
    print len(test1[(test1[1] > 0)])
    test2 = get_nearest_nodes(1268830.0, 228417.0)
    print len(test2[(test2[1] > 0)])
    # Same coords as the first call, but yields different results
    test3 = get_nearest_nodes(1272010.0, 228327.0)
    print len(test3[(test3[1] > 0)])
    
    ##### TEST 3 #####
    # First and third coordinates are the same and give the same result. 
    # The second set of coordinates are outside the buffer distance of the first/third.
    test1 = get_nearest_nodes(1272010.0, 228327.0)
    print len(test1[(test1[1] > 0)])
    # These coords are outside the buffered area as the first call. 
    test2 = get_nearest_nodes(1264180.0, 193485.0)
    print len(test2[(test2[1] > 0)])
    # Same coords and same results as the first call.
    test3 = get_nearest_nodes(1272010.0, 228327.0)
    print len(test3[(test3[1] > 0)])
    

    Paste the error message (if applicable):

    # place error message here
    
    opened by stefancoe 19
  • Network.set() fails if network node IDs are not sequentially ordered integers starting at 0

    Network.set() fails if network node IDs are not sequentially ordered integers starting at 0

    I ran into this problem while running an instance of bayarea_urbansim using my own network where the node ids were OSM node IDs. A lot of digging led me to identify net.set() as the source of my problems. Network.set() relies on this class method when relating the node IDs of the network to the node IDs of the variable that is being set. The problem is that this function, self._node_indexes(), in turn relies on a merge of the node IDs from the variable in question with the node indices of this class object, self.node_idx, which for some reason is defined as a NumPy arange(). Thus, if the node IDs of the variable you wish to compute with Network.set() are not themselves sequentially ordered integers a-la a NumPy arange(), the network will not be able to find any matching POI's, which is precisely the problem that I was encountering. I'm sure there is some reason why self.node_idx is defined the way it is, but without knowing the rationale I don't know whether it makes more sense to implement a fix or to instead update the documentation to reflect the requirement that network node IDs be sequentially ordered IDs.

    opened by mxndrwgrdnr 17
  • Extracting node IDs in distances dataframe output by network.nearest_pois()

    Extracting node IDs in distances dataframe output by network.nearest_pois()

    I have applied the .nearest_pois function to find out how well connected nodes within a network are in relation to their nearest hospital. I got positive results so far and stored the results in a data frame and .csv. However, for every poi (1-10) with an output distance, I am also interested in retrieving the ID of the hospital that this corresponds to in the cases where it found a point located within my threshold distance of 2000 m (See relevant bits of my code below). I.e. if this is my current output (data frame):

    node id 1 2 3 [dist] 600 800 2000

    I'd like a corresponding output (data frame) with: node id 1 2 3 hosp1 hosp2 N/A ..

    Would you be able to help? I looked at the function definitions in the network.py file to identify if there is another function or local variable within an existing function that returns such output.


    Relevant bits of the code:

    Initialise the network with the point of interest queries:

    network.init_pois(num_categories=1,max_dist=2000,max_pois=10)

    network.set_pois('hospitals',nodes['lon'],nodes['lat'])

    Perform point of interest queries - I would like to obtain the node_ids

    df = network.nearest_pois(2000,"hospitals",num_pois=10)

    Type: enhancement 
    opened by nuripurswani 16
  • Installing pandana via conda does not install loaders correctly

    Installing pandana via conda does not install loaders correctly

    I am running 64-bit Windows 8.1 with python 2.7 and have installed pandana 0.1.2 with the following code:

    conda config --add channels synthicity conda install pandana

    pandana imports fine with:

    import pandana

    but it seems the loader scripts were not installed correctly. I get the following error running:

    from pandana.loaders import osm ImportError: No module named loaders capture

    Checking the pandana package directory in anaconda: C:\Anaconda\pkgs\pandana-0.1.2-py27_0 there are no loader subfolder or scripts.

    As a work around, I tried installing pandana via the github zipfile and installation gets hung up when building _pyaccess. See below:

    unnamed

    Any ideas on the issue or potential solutions?

    opened by sablanchard 13
  • Python3 support

    Python3 support

    A couple of modifications were done to support Python 3.x. It was tested with Python 3.5 and Python 2.7 for backwards compatibility, running the full set of tests of the library.

    It's difficult to guarantee that no performance differences were introduced, but functionality seems not to be affected.

    opened by federicofernandez 12
  • import pandana on windows results in

    import pandana on windows results in "ImportError: DLL load failed..." error

    I am running 64-bit Windows 7 with python 2.7.11 and have installed pandana 0.2.0 via pip - this is a new install of pandana on a machine that has never had it. When I import pandana I receive the following error, any ideas on what may be wrong here?:

    import pandana as pdna


    ImportError Traceback (most recent call last) in () ----> 1 import pandana as pdna

    C:\Users\samb\Anaconda2\lib\site-packages\pandana__init__.py in () ----> 1 from network import Network 2 3 version = version = '0.2.0'

    C:\Users\samb\Anaconda2\lib\site-packages\pandana\network.py in () 8 import pandas as pd 9 ---> 10 from . import _pyaccess 11 from .loaders import pandash5 as ph5 12

    ImportError: DLL load failed: The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log or use the command-line sxstrace.exe tool for more detail.

    Type: maintenance 
    opened by sablanchard 10
  • Remove the need of POI initialization call

    Remove the need of POI initialization call

    This PR removes the need to create an initial set of POIIndex entries.

    To achieve that, the POIIndex data structure was converted to a std::map with std::string keys.

    The init_pois function is still in place because it's also used to define the max_dist and max_pois parameters. We should decide soon if we want to move those definitions to another method.

    opened by federicofernandez 9
  • Additional OpenStreetMap, ESRI ShapeFile and Geodatabase, and GTFS (General Transit Feed Service) importing

    Additional OpenStreetMap, ESRI ShapeFile and Geodatabase, and GTFS (General Transit Feed Service) importing

    #I read in the documentation that this is already implemented on the C++ side? I was curious what the most current information on shapefile/geodatabase import is? A lot of analysis requires custom edge weights based on prior analysis on the network. I was reviewing NetworkX implementation of the graph network importer, but it is pure Python implementation that has been shown to be slower relative to IGraph/graph-tool. Questions about the implementation: Does the C++ shapefile import functionality allow import of networks that have connections based on vertices along with line end points? Or just end points? What are the dependencies on the C++ implementation on import? Depending on where this was on your priority queue I was thinking about implementing something myself. Any thoughts or updates on this would be great.

    opened by d-wasserman 9
  • Please do not change my matplotlib backend

    Please do not change my matplotlib backend

    Thanks for this package!

    I only have one problem with it: at the top of network.py, you are setting

    matplotlib.use('Agg')
    

    According to the comment, this is to fix Travis. I guess you are switching to a backend that doesn't need an X server. However, this can be very disruptive to anybody importing your library, e.g. in a Jupyter notebook, where plots stop appearing:

    UserWarning: Matplotlib is currently using agg, which is a non-GUI backend,
    so cannot show the figure
    

    It took me quite a while to find out that this line from pandana was the culprit. Please remove it.

    If it's just about testing on Travis, you can just set the display, it works well, I do it too.

    Thanks!

    Type: bug 
    opened by DavidMStraub 8
  • conda out of date

    conda out of date

    attempting to run conda update pandana gives me

    # All requested packages already installed.
    # packages in environment at C:\Anaconda2:
    #
    pandana                   0.1.2                    py27_0    synthicity
    

    Looks like 0.2.0 was never loaded on conda for windows.

    Type: maintenance 
    opened by Eh2406 8
  • Plotting with Pandana does not render title

    Plotting with Pandana does not render title

    Description of the bug

    PLotting with Pandana/UrbanAccess doesn't properly format title when calling .set_title

    GTFS feed or OSM data (optional)

    bbox = [43.435966,-80.682529,43.528884,-80.418858]
    

    Environment

    • Operating system: Windows

    • Python version: 3.9.7

    Paste the code that reproduces the issue here:

    n = 1
    bmap, fig, ax = network.plot(access[n], bbox=bbox, plot_kwargs=plot_kwargs, fig_kwargs=fig_kwargs, 
                                )
    ax.set_axis_bgcolor('k')
    ax.set_title('Walking distance (m) to nearest amenity around Waterloo', fontsize=15)
    

    Paste the error message (if applicable):

    No error but this happens: image

    opened by AdrianaCeric 0
  • incorrect shortest paths solutions when impendance values are particularly small or large

    incorrect shortest paths solutions when impendance values are particularly small or large

    Description of the bug

    I am encountering incorrect shortest path solutions when using the Network.shortest_path (and Network.shortest_paths) method on a network with impedance values of small or large (though still reasonable) orders of magnitude. I have included a very simple toy example below that captures the problem. Essentially, when the impedance values are scaled to a sufficiently small order of magnitude (by experiment seems to be ~1e-4) or large order of magnitude (by experiment seems to be ~1e7), the shortest path solution is no longer correct (and, incidentally, appears to revert to a solution that traverses the least number of nodes, rather than minimizing total impedance, though my example doesn't explore this aspect of the problem).

    Environment

    • Operating system: Windows 10 Enterprise

    • Python version: 3.9.10

    • Pandana version: 0.6.1

    Paste the code that reproduces the issue here:

    import numpy as np
    import pandana as pdna
    import pandas as pd
    
    
    nodes = [1, 2, 3, 4, 5]
    nodes = pd.DataFrame(
        np.random.uniform(size=(5, 2)), columns=["x", "y"], index=nodes
    )
    
    edges = pd.DataFrame(
        [
            [1, 2, 0.001],
            [2, 3, 0.001],
            [3, 4, 0.001],
            [1, 5, 0.002],
            [5, 4, 0.002],
        ],
        columns=["from_node", "to_node", "weight"]
    )
    
    net = pdna.Network(nodes["x"], nodes["y"], edges["from_node"], edges["to_node"], edges[["weight"]], twoway=False)
    
    net.shortest_path(1, 4)
    
    >>> array([1, 2, 3, 4], dtype=int64)
    
    

    The above example produces the expected solution.

    Now, use exactly the same nodes and edges, but scale the impedance values down by a factor of 10:

    net = pdna.Network(nodes["x"], nodes["y"], edges["from_node"], edges["to_node"], edges[["weight"]]  / 10, twoway=False)
    
    net.shortest_path(1, 4)
    
    >>> array([1, 5, 4], dtype=int64)
    

    In the second example, clearly the more expensive and incorrect route has been chosen. The same behavior is observed at the larger end of impedance values also: for example, using the above example, when the impedance values are 1e7 instead .0001, and 2e7 instead of .0002, the same behavior occurs. I'm at a loss as to why this is happening?

    Thank you for your help!

    opened by bonza2 0
  • tables sub-dependency versions conflict with python 3.10 compatibility when installing with pip

    tables sub-dependency versions conflict with python 3.10 compatibility when installing with pip

    Description of the bug

    Attempting to install pandana on python 3.10.x with pip fails because it requires tables>=3.1, <3.7; which is not supported through pip on python 3.10 (see: https://github.com/PyTables/PyTables/issues/909)

    Environment

    • Operating system: Ubuntu 22.04

    • Python version: 3.10.4

    • Pandana version: (attempting to install) 0.6.1

    • Pandana required packages versions (optional): tables==3.6.1

    Paste the code that reproduces the issue here:

    pip install pandana==0.6.1
    

    Paste the error message (if applicable):

    error: legacy-install-failure
    
    × Encountered error while trying to install package.
    ╰─> tables
    
    note: This is an issue with the package mentioned above, not pip.
    hint: See above for output from the failure.
    
    opened by thomastu 1
  • net.shortest_paths doesn't work with multiprocessing

    net.shortest_paths doesn't work with multiprocessing

    Hi,

    I'm having a little of trouble trying to use Pandana with multiprocessing

    Description of the bug

    When I call net.shortest_paths (with an 's') in a multiprocessing process (I use a multiprocessing.Pool object), it doesn't finish like an infinite loop (no error message). I tested to do the same with net.shortest_path (without an 's') and it worked! However I have to use shortest_paths because it is faster in my case. I wanted to know if there is an explanation to this.

    Network data (optional)

    OpenStreetMap Data

    Environment

    Mac OS 11.2.1 Python 3.9.7 Pandana 0.6.1

    Paste the code that reproduces the issue here:

    from multiprocessing import Pool

    n_cores = 3

    def f(n_repet): return [net.shortest_paths([node_0_id], [node_1_id]) for i in tqdm(range(n_repet))]

    p = Pool(n_cores) a = p.map(f, [10 for i in range(10)])

    Thanks for your help!

    opened by lilianmarey 0
  • Pandana network initiation slow for large network

    Pandana network initiation slow for large network

    I am initializing a pandana network for Canada roads network. My hdf5 file is just under 200mb and the number of edges is around 2.2 million. Been running the code below for almost 5 hrs and it's still on going.

    I am quite new to this domain and am wondering if anyone can give me suggestions on speeding up the computation. Would it be possible to implement multiprocessing here? Or should I break the roads network into something smaller like census divisions or provinces and somehow merge them back together, would that make it run faster?

    Thanks in advance !

    Environment

    • Windows 10
    • Operating system: 64-bit operating system, x64-based processor
    • Processor: Intel(R) Core(TM) i5-1035G4 CPU @ 1.10GHz 1.50 GHz
    • 16GB RAM, 4 CPU core
    • Python version: 3.9.7
    • Pandana version: 0.6.1
    network = pdna.Network(nodes.x, nodes.y, edges['from'], edges['to'], edges[['dist']], twoway=False)
    network.precompute(distance + 1)
    
    opened by wendy-ngan 4
  • OSM loader - POIs that are ways in OSM

    OSM loader - POIs that are ways in OSM

    In my city there are many points of interest that are not represented as nodes in OpenStreetMap, but rather ways around a building area. I usually deal with this by taking the centroids of relevant closed ways and treating them as nodes.

    I wrote a simple addition to the OSM loader tonight that uses a "way_query" to download ways using the Overpass output option 'center': "adds the center of the object's boundingbox to the output, not guaranteed to be on the object's area." I think this would work fine for the cases I am looking at. It might introduce inaccuracy for large or oddly shaped POIs (if someone requested parks, for example).

    Is this something wanted in pandana? Should I raise a PR?

    opened by JosephineRoper 1
Releases(v0.6.1)
  • v0.6.1(Mar 19, 2021)

    • Adds support for non-x86 CPUs, including ARM-based Macs
    • Removes accommodations for pre-C++11 compilers
    • Formally ends support for Python 2.7
    Source code(tar.gz)
    Source code(zip)
  • v0.6(Nov 25, 2020)

    • Adds vectorized, multi-threaded calculation of many shortest path routes at once
    • Restores usability of network.plot() by eliminating usage of Matplotlib's deprecated Basemap toolkit
    Source code(tar.gz)
    Source code(zip)
  • v0.5.1(Aug 6, 2020)

  • v0.5(Aug 5, 2020)

    • Adds support for calculating shortest path lengths between arbitrary origins and destinations, with vectorization and multi-threading
    • Restores alternate names for aggregation types, which were inadvertently removed in v0.4
    • Fixes a bug with matplotlib backends
    • Improves compilation in MacOS 10.15 Catalina
    • Eliminates the scikit-learn dependency
    • Makes matplotlib and osmnet dependencies optional
    • Revises the documentation and demo notebook
    Source code(tar.gz)
    Source code(zip)
  • v0.4.4(Dec 11, 2019)

  • v0.4.3(Aug 28, 2019)

  • v0.4.2(Aug 9, 2019)

    • Speed of network aggregations is improved
    • Support for aggregating integer values is restored
    • Thread count and contraction hierarchy status messages are restored
    • All code written for v0.3 now runs in v0.4, raising deprecation warnings when appropriate
    • Compilation improvements for Mac
    Source code(tar.gz)
    Source code(zip)
  • v0.4.1(Jan 29, 2019)

    • Documentation fixes.
    • Replaced uses of std::map::at() since it's not supported in pre-C++11 compilers.
    • Replaced initialization lists due to the same reason as above.
    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Jun 27, 2017)

    • Major rewrite of the layer between Python and C++, which was previously written using the numpy C++ API, and now is written in cython.
    • The C++ that remains has been cleaned up a bit and formatted.
    • The major functionality change is that global memory is no longer used, so reserve_num_graphs no longer needs to be called and Network objects can be created and destroyed at the user's pleasure.
    • The change in global memory made the calls to init_pois no longer necessary. Then, that method has been removed and the max_items and max_distance parameters were relocated in the set_pois call.
    • The nearest neighbor queries are now resolved with Scipy instead of libANN. That removed additional global memory.
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Apr 5, 2017)

    • Python 3 compatibility.
    • The “network.nearest_pois()” method can now return the labels of the pois rather than just the distances
    • OSM data loading is now done via the osmnet package.
    • Changes to support multiple graphs.
    • Added reindex functions.
    • Updated documentation.
    • Switched code style checker in Travis CI to “pycodestyle”, which has replaced the “pep8” package.
    Source code(tar.gz)
    Source code(zip)
Owner
Urban Data Science Toolkit
Open source projects supporting urban spatial analysis, simulation, and visualization
Urban Data Science Toolkit
peartree: A library for converting transit data into a directed graph for sketch network analysis.

peartree ?? ?? peartree is a library for converting GTFS feed schedules into a representative directed network graph. The tool uses Partridge to conve

Kuan Butts 183 Dec 29, 2022
Manipulation and analysis of geometric objects

Shapely Manipulation and analysis of geometric objects in the Cartesian plane. Shapely is a BSD-licensed Python package for manipulation and analysis

null 3.1k Jan 3, 2023
scalable analysis of images and time series

thunder scalable analysis of image and time series analysis in python Thunder is an ecosystem of tools for the analysis of image and time series data

thunder-project 813 Dec 29, 2022
leafmap - A Python package for geospatial analysis and interactive mapping in a Jupyter environment.

A Python package for geospatial analysis and interactive mapping with minimal coding in a Jupyter environment

Qiusheng Wu 1.4k Jan 2, 2023
Python bindings to libpostal for fast international address parsing/normalization

pypostal These are the official Python bindings to https://github.com/openvenues/libpostal, a fast statistical parser/normalizer for street addresses

openvenues 651 Dec 16, 2022
Mmdb-server - An open source fast API server to lookup IP addresses for their geographic location

mmdb-server mmdb-server is an open source fast API server to lookup IP addresses

Alexandre Dulaunoy 67 Nov 25, 2022
PySAL: Python Spatial Analysis Library Meta-Package

Python Spatial Analysis Library PySAL, the Python spatial analysis library, is an open source cross-platform library for geospatial data science with

Python Spatial Analysis Library 1.1k Dec 18, 2022
Raster-based Spatial Analysis for Python

?? xarray-spatial: Raster-Based Spatial Analysis in Python ?? Fast, Accurate Python library for Raster Operations ⚡ Extensible with Numba ⏩ Scalable w

makepath 649 Jan 1, 2023
Tools for the extraction of OpenStreetMap street network data

OSMnet Tools for the extraction of OpenStreetMap (OSM) street network data. Intended to be used in tandem with Pandana and UrbanAccess libraries to ex

Urban Data Science Toolkit 47 Sep 21, 2022
Read and write rasters in parallel using Rasterio and Dask

dask-rasterio dask-rasterio provides some methods for reading and writing rasters in parallel using Rasterio and Dask arrays. Usage Read a multiband r

Dymaxion Labs 85 Aug 30, 2022
A short term landscape evolution using a path sampling method to solve water and sediment flow continuity equations and model mass flows over complex topographies.

r.sim.terrain A short-term landscape evolution model that simulates topographic change for both steady state and dynamic flow regimes across a range o

Brendan Harmon 7 Oct 21, 2022
Using Global fishing watch's data to build a machine learning model that can identify illegal fishing and poaching activities through satellite and geo-location data.

Using Global fishing watch's data to build a machine learning model that can identify illegal fishing and poaching activities through satellite and geo-location data.

Ayush Mishra 3 May 6, 2022
Download and process satellite imagery in Python using Sentinel Hub services.

Description The sentinelhub Python package allows users to make OGC (WMS and WCS) web requests to download and process satellite images within your Py

Sentinel Hub 659 Dec 23, 2022
An API built to format given addresses using Python and Flask.

An API built to format given addresses using Python and Flask. About The API returns properly formatted data, i.e. removing duplicate fields, distingu

null 1 Feb 27, 2022
This is a simple python code to get IP address and its location using python

IP address & Location finder @DEV/ED : Pavan Ananth Sharma Dependencies: ip2geotools Note: use pip install ip2geotools to install this in your termin

Pavan Ananth Sharma 2 Jul 5, 2022
A package built to support working with spatial data using open source python

EarthPy EarthPy makes it easier to plot and manipulate spatial data in Python. Why EarthPy? Python is a generic programming language designed to suppo

Earth Lab 414 Dec 23, 2022
Using SQLAlchemy with spatial databases

GeoAlchemy GIS Support for SQLAlchemy. Introduction GeoAlchemy is an extension of SQLAlchemy. It provides support for Geospatial data types at the ORM

null 109 Dec 1, 2022
Solving the Traveling Salesman Problem using Self-Organizing Maps

Solving the Traveling Salesman Problem using Self-Organizing Maps This repository contains an implementation of a Self Organizing Map that can be used

Diego Vicente 3.1k Dec 31, 2022
Example of animated maps in matplotlib + geopandas using entire time series of congressional district maps from UCLA archive. rendered, interactive version below

Example of animated maps in matplotlib + geopandas using entire time series of congressional district maps from UCLA archive. rendered, interactive version below

Apoorva Lal 5 May 18, 2022