Implementation of Trajectory classes and functions built on top of GeoPandas

Overview

MovingPandas

Project Status: Active – The project has reached a stable, usable state and is being actively developed. build status docs status codecov DOI pyOpenSci

MovingPandas implements a Trajectory class and corresponding methods based on GeoPandas.

Visit movingpandas.org for details!

You can run MovingPandas examples on MyBinder - no installation required: Binder (These examples use the latest MovingPandas release version.)

To try the cutting-edge dev version, use this MyBinder link.

Documentation

The official documentation is hosted on ReadTheDocs

Examples

Trajectory plots

movingpandas_animated

Stop detection

movingpandas_stop_detection_clip

Trajectory aggregation

movingpandas_ais

Installation

MovingPandas for Python >= 3.7 and all it's dependencies are available from conda-forge and can be installed using conda install -c conda-forge movingpandas.

Conda status

Conda Recipe Conda Downloads Conda Version Conda Platforms

Note that it is NOT recommended to install MovingPandas from PyPI! If you're on Windows or Mac, many GeoPandas / MovingPandas dependencies cannot be pip installed (for details see the corresponding notes in the GeoPandas documentation). On Ubuntu, pip install fails on cartopy with "Proj 4.9.0 must be installed".

Development Installation

Use the following steps to run the notebooks using the current development version:

Using conda

Linux/Mac:

conda env create -f environment.yml

Windows:

conda config --add channels conda-forge
conda config --add channels defaults
conda config --set channel_priority strict
conda env create -f environment.yml

On Windows, because conda-forge relies on some package built with defaults blas (like scipy) one must use the defaults channel on top of conda-forge and activate conda's new strict channel feature. Source: https://github.com/conda-forge/gdal-feedstock/issues/269#issuecomment-473661530

Using Anaconda

  1. Install Anaconda
  2. Clone the movingpandas repository
  3. In Anaconda Navigator | Environments | Import select the movingpandas environment.yml from the cloned directory:

image

  1. Wait until the environment is ready, then change to the Home tab and install Jupyter notebooks into the movingpandas environment
  2. Launch Jupyter notebooks and navigate to the movingpandas/tutorials directory to execute them
  3. Now you can run the notebooks, experiment with the code and adjust it to your own data

Known issues:

  • On Windows, importing rasterio can lead to DLL errors. If this happens, downgrade the rasterio version to 1.0.13.

Develop mode

To install MovingPandas in "develop" or "editable" mode you may use:

python setup.py develop

Contributing to MovingPandas GitHub contributors

All contributions, bug reports, bug fixes, documentation improvements, enhancements and ideas are welcome.

A detailed overview on how to contribute can be found in the contributing guide on GitHub.

Related Python Packages

scikit-mobility is a similar package which also deals with movement data. It implements TrajectoryDataFrames and FlowDataFrames on top of Pandas instead of GeoPandas. There is little overlap in the covered use cases and implemented functionality (comparing MovingPandas tutorials and scikit-mobility tutorials). MovingPandas focuses on spatio-temporal data exploration with corresponding functions for data manipulation and analysis. scikit-mobility on the other hand focuses on computing human mobility metrics, generating synthetic trajectories and assessing privacy risks. Plotting is based on Folium.

Traja extends the capabilitis of Pandas DataFrames specific for animal trajectory analysis in 2D. Plots (static) are based on seaborn.

PyMove provides functionality similar to MovingPandas. It implements PandasMoveDataFrames and DaskMoveDataFrame on top of Pandas and Dask DataFrames. Plotting is based on Folium.

Tracktable is a related Python package with its core data structures and algorithms implemented in C++, i.e. it is not based on Pandas. Plotting is based on Cartopy (for still images) and Folium (for interactive rendering).

Citation information

Please cite [0] when using MovingPandas in your research and reference the appropriate release version. All releases of MovingPandas are listed on Zenodo where you will find citation information, including DOIs.

Publications

About MovingPandas

[0] Graser, A. (2019). MovingPandas: Efficient Structures for Movement Data in Python. GI_Forum ‒ Journal of Geographic Information Science 2019, 1-2019, 54-68. doi:10.1553/giscience2019_01_s54.

[1] Graser, A. & Dragaschnig, M. (2020). Exploring movement data in notebook environments. Presented at MoVIS 2020, IEEE VIS 2020.

Referencing MovingPandas

Full Google Scholar list

Workshop Videos

WorkshopVideo

Comments
  • WIP: Add Trajectory Smoother class

    WIP: Add Trajectory Smoother class

    Following up on discussions from #15, this is a first attempt at implementing a Kalman Filter/Smoother using Stone Soup.

    This PR aims to contribute the following:

    • A TrajectorySmoother base class, which (as advised) is conceptually similar to TrajectoryGeneralisers;
    • A KalmanSmootherCV smoother, which employs a linear Kalman Filter/Smoother with the assumption of a Constant Velocity model (other models also exist in Stone Soup, but for now the CV model has been used as a starting point);
    • A tutorial notebook which showcases how the above class can be used

    This PR is work in progress and is open to modifications based on the thoughts and suggestions of the maintainer(s). Its main purpose is to demonstrate basic capabilities and motivate discussions.

    enhancement 
    opened by sglvladi 17
  • Problem working from postgis to geopandas to trajectory

    Problem working from postgis to geopandas to trajectory

    I'm trying to use moving pandas to process GPS data stored on a PostGIS database. I'm connecting to PostGIS with psycopg2 I load a table to a geodataframe with geopandas. I loaded the geodataframe to trajectories and if I print the collection I get TrajectoryCollection with 34 trajectories so it seems to be ok I get the first trajectory with my_traj = traj_collection.trajectories[1]

    Problem 1) If I print (my_traj) I get an error AttributeError: 'DataFrameGroupBy' object has no attribute 'geometry'

    On PostGIS my geometry column is named geom, I tried to rename the geom to geometry on the geodataframe prior to creating the TrajectoryCollection, It seems to work but then I get two geomemetry fields, geom and geometry

    If I print the trajectory again, I get this error. AttributeError: 'numpy.int64' object has no attribute 'to_pydatetime'

    Problem 2) If I try to store speed with traj_collection.add_speed(overwrite=True) I get an error message, the last line is AttributeError: 'float' object has no attribute 'total_seconds'

    Could you help me to solve this problem? Thanks!

    opened by bigcarto 14
  • Issues using TrajectoryCollection on my csv dataframe.

    Issues using TrajectoryCollection on my csv dataframe.

    Hi,

    I have been following the tutorials with no issues, however, after finishing them all, I have tried to use hvplot to plot the TrajectoryCollection made from my dataframe, however I found that it was not returning any sort of graph: image Using len(traj_collection) shows it has a length of 0, so no trajectories are being made for some reason but I am not sure why, I have followed exactly as is shown in the tutorials?

    Thanks, Jacob

    opened by Jharkins123 13
  • Clip with Polygon causes IndexError: list index out of range

    Clip with Polygon causes IndexError: list index out of range

    I am trying to add the clip approach in the 2-ship-data.ipynb notebook by adding below the get_intersecting chunk the following:

    all_trajectories = traj_collection.trajectories
    arrivals = [ traj.clip(area_of_interest) for traj in all_trajectories ] 
    

    And I am getting the following error & I cannot understand why ?

     15        if type(row['spatial_intersection']) == LineString:
     16         -> pt0 = Point(row['spatial_intersection'].coords[0])
     17             ptn = Point(row['spatial_intersection'].coords[-1])
     18             t = row['prev_t']
    

    IndexError: list index out of range

    bug 
    opened by kostastheocharoulis 13
  • Move the `hvplot` visualisation requirements to be optional installs.

    Move the `hvplot` visualisation requirements to be optional installs.

    Closes #78

    Finalise the work on separating the plotting libraries to make them optional. This includes:

    1. Remove references to cartopy which isn't used
    2. Update setup.py to parse requirements.txt files
    3. Have a base requirements.txt, a via-requirements.txt and a dev-requirements.txt which install
      1. The base libraries required for movingpandas (requirements.txt)
      2. The additional visualisation libraries for the hvplot function (viz-requirements.txt)
      3. The libraries required for development, specifically unit testing libraries (dev-requirements.txt)
    4. Include optional installs in setup.py so you can:
      • pip install movingpandas
      • pip install "movingpandas[viz]"
      • pip install "movingpandas[dev]"
    5. Update the unit tests so that testing the hvplot function is skipped when holoviews is not installed
    6. Create a tox test script to test Python 3.7 and 3.8 with and without the visualisation libraries
      • This uses the tox-conda library to use conda for installs rather than the standard venv
    7. Update the travis configuration (including tox-travis) to use tox for testing and to combine the coverage report
      • Unit tests should be run with tox from the command line, and you should end up with 6 skipped tests - 3 each from the 3.7 and 3.8 environments. Be warned - this can take a while to set up the environmnents the first time around! And travis will take 10 - 12 minutes to run!
    help wanted 
    opened by om-henners 11
  • Installation instructions

    Installation instructions

    Hi, this is a part of https://github.com/pyOpenSci/software-review/issues/18.

    Naive installation As a naive user, if I make a new python environment and do pip install movingpandas, the installation fails on Mac.

    Collecting movingpandas
      Downloading movingpandas-0.2rc1.tar.gz (20 kB)
    Collecting numpy
      Downloading numpy-1.18.1-cp38-cp38-macosx_10_9_x86_64.whl (15.2 MB)
         |████████████████████████████████| 15.2 MB 5.2 MB/s 
    Collecting matplotlib
      Downloading matplotlib-3.1.2-cp38-cp38-macosx_10_9_x86_64.whl (13.2 MB)
         |████████████████████████████████| 13.2 MB 4.1 MB/s 
    Collecting shapely
      Using cached Shapely-1.6.4.post2.tar.gz (225 kB)
    Collecting pandas
      Using cached pandas-0.25.3-cp38-cp38-macosx_10_9_x86_64.whl (10.3 MB)
    Collecting geopandas
      Using cached geopandas-0.6.2-py2.py3-none-any.whl (919 kB)
    Collecting hvplot
      Downloading hvplot-0.5.2-py2.py3-none-any.whl (2.5 MB)
         |████████████████████████████████| 2.5 MB 4.5 MB/s 
    Collecting cartopy
      Using cached Cartopy-0.17.0.tar.gz (8.9 MB)
      Installing build dependencies ... done
      Getting requirements to build wheel ... error
      ERROR: Command errored out with exit status 1:
       command: /Users/martin/anaconda3/envs/movingpandas/bin/python /Users/martin/anaconda3/envs/movingpandas/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py get_requires_for_build_wheel /var/folders/d0/qyf0yvzd0n9ctn2wr3r4l1vw0000gn/T/tmpcf10m5i7
           cwd: /private/var/folders/d0/qyf0yvzd0n9ctn2wr3r4l1vw0000gn/T/pip-install-9up68k4a/cartopy
      Complete output (1 lines):
      Proj 4.9.0 must be installed in Conda environment "movingpandas".
      ----------------------------------------
    ERROR: Command errored out with exit status 1: /Users/martin/anaconda3/envs/movingpandas/bin/python /Users/martin/anaconda3/envs/movingpandas/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py get_requires_for_build_wheel /var/folders/d0/qyf0yvzd0n9ctn2wr3r4l1vw0000gn/T/tmpcf10m5i7 Check the logs for full command output.
    

    Using conda install -c anitagraser movingpandas works, but you'll get a mixture of channels (conda-forge and defaults), which is known to cause issues. Moreover, you get geopandas from defaults in older version that is on conda-forge.

    It is worth documenting possible issues and workarounds (strict channel priority) as the default installation instructions do not follow GeoPandas recommendations.

    Dev installation

    Current dev installation instructions expect using Anaconda. I'd say that most dev people will just make a new environment using conda env create -f environment.yml, but it has to be derived from the Aanconda instructions. I'd just add a sentence saying that dev env should use environment.yml and keep Anaconda instructions as one of the options only.

    Minor question - conda installs movingpandas 0.1.dev2, while the review issue says Version submitted: 0.2. Should I assume that 0.2 will be released after the review?

    tasks 
    opened by martinfleis 10
  • Does 0.1.dev2 from conda-forge include TrajectoryManager?

    Does 0.1.dev2 from conda-forge include TrajectoryManager?

    Sad error here. Clean install into dedicated environment on Windows 10. environment.yml records version as

    movingpandas=0.1.dev2=py37h39e3cac_0

    When trying to use the TrajectoryManager class from the tutorial it fails saying the module has no such attribute.

    I can't see any releases on github so wondered if conda has lagged behind github?

    question 
    opened by jonititan 10
  • [pyopensci-review] Pip installation issue

    [pyopensci-review] Pip installation issue

    Currently the pip installation is raising the follow error:

    21:09 $ pip install movingpandas
    ERROR: Could not find a version that satisfies the requirement movingpandas (from versions: none)
    ERROR: No matching distribution found for movingpandas
    
    opened by xmnlab 8
  • formatting and linting?

    formatting and linting?

    Could apply tools such as black and flake8 on the repo. This can then be added to as a hooks before a commit is made e.g. https://github.com/geopandas/geopandas/blob/master/.pre-commit-config.yaml. Can also have checks on PRs.

    More info: https://docs.geopandas.org/en/latest/community/contributing.html#style-guide-linting

    tasks 
    opened by raybellwaves 7
  • Single Point Trajectories

    Single Point Trajectories

    The application for which I'm using movingpandas sometimes requires me to handle Trajectorys having a single point, but movingpandas requires each Trajectory to have at least two points.

    What are your thoughts about this? I'm happy to submit a PR if you are amenable to the idea.

    I think the following plan could work:

    • Define a TrajectoryCollection.allow_single_point_trajectory flag that defaults to False
    • Define a Trajectory.allow_single_point flag that defaults to False
    • Update relevant methods to handle single point Trajectorys

    I think the biggest issues would be places where multiple points are assumed, such as calculating speed. I'm not sure what the best behavior in that situation would be (None, 0, infinite, raise error, something else?).

    What are your thoughts/concerns? If I'm alone on this, I'm happy to just inherit from the Trajectory and TrajectoryCollection classes inside my application.

    Thank you!

    question wontfix 
    opened by stevemarin 7
  • TopDownTimeRatioGeneralizer does not support custom geometry column names

    TopDownTimeRatioGeneralizer does not support custom geometry column names

    Hi,

    Unlike other generalization functions, TopDownTimeRatioGeneralizer returns an error message : AttributeError: The 'Series' object does not have a 'geometry' attribute. No matter that I use a trajectory or a trajectorycollection.

    topDownGener=mpd.TopDownTimeRatioGeneralizer(collection).generalize(tolerance=0.0001)

    `--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_39264/2560778543.py in ----> 1 topDownGener=mpd.TopDownTimeRatioGeneralizer(collection).generalize(tolerance=0.0001)

    ~\anaconda3\envs\MovingPandas\lib\site-packages\movingpandas\trajectory_generalizer.py in generalize(self, tolerance) 42 return self._generalize_traj(self.traj, tolerance) 43 elif isinstance(self.traj, TrajectoryCollection): ---> 44 return self._generalize_traj_collection(tolerance) 45 else: 46 raise TypeError

    ~\anaconda3\envs\MovingPandas\lib\site-packages\movingpandas\trajectory_generalizer.py in _generalize_traj_collection(self, tolerance) 49 generalized = [] 50 for traj in self.traj: ---> 51 generalized.append(self._generalize_traj(traj, tolerance)) 52 result = copy(self.traj) 53 result.trajectories = generalized

    ~\anaconda3\envs\MovingPandas\lib\site-packages\movingpandas\trajectory_generalizer.py in _generalize_traj(self, traj, tolerance) 239 240 def _generalize_traj(self, traj, tolerance): --> 241 return Trajectory(self.td_tr(traj.df.copy(), tolerance), traj.id) 242 243 def td_tr(self, df, tolerance):

    ~\anaconda3\envs\MovingPandas\lib\site-packages\movingpandas\trajectory_generalizer.py in td_tr(self, df, tolerance) 252 dy = df.geometry.iloc[-1].y - df.geometry.iloc[0].y 253 --> 254 dists = df.apply( 255 lambda rec: self._dist_from_calced( 256 rec, df.index.min().to_pydatetime(), df.geometry.iloc[0], de, dx, dy

    ~\anaconda3\envs\MovingPandas\lib\site-packages\geopandas\geodataframe.py in apply(self, func, axis, raw, result_type, args, **kwargs) 1388 @doc(pd.DataFrame) 1389 def apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwargs): -> 1390 result = super().apply( 1391 func, axis=axis, raw=raw, result_type=result_type, args=args, **kwargs 1392 )

    ~\anaconda3\envs\MovingPandas\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, raw, result_type, args, **kwargs) 8831 kwargs=kwargs, 8832 ) -> 8833 return op.apply().finalize(self, method="apply") 8834 8835 def applymap(

    ~\anaconda3\envs\MovingPandas\lib\site-packages\pandas\core\apply.py in apply(self) 725 return self.apply_raw() 726 --> 727 return self.apply_standard() 728 729 def agg(self):

    ~\anaconda3\envs\MovingPandas\lib\site-packages\pandas\core\apply.py in apply_standard(self) 849 850 def apply_standard(self): --> 851 results, res_index = self.apply_series_generator() 852 853 # wrap results

    ~\anaconda3\envs\MovingPandas\lib\site-packages\pandas\core\apply.py in apply_series_generator(self) 865 for i, v in enumerate(series_gen): 866 # ignore SettingWithCopy here in case the user mutates --> 867 results[i] = self.f(v) 868 if isinstance(results[i], ABCSeries): 869 # If we have a view on v, we need to make a copy because

    ~\anaconda3\envs\MovingPandas\lib\site-packages\movingpandas\trajectory_generalizer.py in (rec) 253 254 dists = df.apply( --> 255 lambda rec: self._dist_from_calced( 256 rec, df.index.min().to_pydatetime(), df.geometry.iloc[0], de, dx, dy 257 ),

    ~\anaconda3\envs\MovingPandas\lib\site-packages\movingpandas\trajectory_generalizer.py in _dist_from_calced(self, rec, start_t, start_geom, de, dx, dy) 276 di = (rec.name - start_t).total_seconds() 277 calced = Point(start_geom.x + dx * di / de, start_geom.y + dy * di / de) --> 278 return rec.geometry.distance(calced)

    ~\anaconda3\envs\MovingPandas\lib\site-packages\pandas\core\generic.py in getattr(self, name) 5581 ): 5582 return self[name] -> 5583 return object.getattribute(self, name) 5584 5585 def setattr(self, name: str, value) -> None:

    AttributeError: 'Series' object has no attribute 'geometry'`

    bug 
    opened by kntrdzs 6
  • Interpolation at antimeridian

    Interpolation at antimeridian

    Hi, first of all thanks a lot for this awesome project ! I've recently encountered a problem that I wanted to share.

    Problem description

    When working across the antimeridian, the interpolate_position_at function returns a unexpected value. This is due to the fact that the shapely.geometry Linestring object is considered as going across Greenwich meridian, despite the extremities of the line being very close.


    One possible fix would be, if two positions are close and separated by the antimeridian, to add 360° to the negative longitude and subtract back the 360° to the interpolated longitude if it is above 180°.

    bug 
    opened by olivierwelcomme 1
  • remove matplotlib from deps

    remove matplotlib from deps

    Following on from https://github.com/anitagraser/movingpandas/pull/260 we could also remove matploblib as a dependency. For example, it's not a dependency in geopandas https://github.com/geopandas/geopandas/blob/main/pyproject.toml#L43

    enhancement 
    opened by raybellwaves 1
  • unpin doc packages

    unpin doc packages

    Seeing some doc failures with https://github.com/anitagraser/movingpandas/blob/main/docs/environment.yml e.g. https://readthedocs.org/projects/movingpandas/builds/18774152/

    The pinning of versions in the doc env may be able to be removed.

    bug 
    opened by raybellwaves 0
  • Rename _measure_distance parameter spherical to geodesic

    Rename _measure_distance parameter spherical to geodesic

    Since geodesic distance measurements have replaced spherical ones, the parameter name now is misleading:

    https://github.com/anitagraser/movingpandas/blob/81ebf4f749376f3d43ff330d7b70a25a6db7913a/movingpandas/geometry_utils.py#L77-L85

    enhancement 
    opened by anitagraser 0
Releases(v0.14.rc1)
  • v0.14.rc1(Dec 20, 2022)

    New features:

    • https://github.com/anitagraser/movingpandas/pull/268 New add_angular_difference method

    Includes fixes and enhancements for:

    • https://github.com/anitagraser/movingpandas/pull/267 Note that direction values are [0, 360) in documentation

    Behind the scenes:

    • https://github.com/anitagraser/movingpandas/pull/269 Fixed python dependencies
    • https://github.com/anitagraser/movingpandas/pull/269 Fixed read the docs build
    Source code(tar.gz)
    Source code(zip)
    movingpandas-0.14rc1.tar.gz(56.14 KB)
  • v0.13(Dec 2, 2022)

  • v0.12(Nov 15, 2022)

  • v0.11(Aug 12, 2022)

    Published at https://anaconda.org/conda-forge/movingpandas

    New features:

    • #37 New minimum and Hausdorff distance measures
    • #233 New functions to add a timedelta column and get the trajectory sampling interval

    Includes fixes and enhancements for:

    Behind the scenes:

    Source code(tar.gz)
    Source code(zip)
  • v0.10(Jun 19, 2022)

    Published at https://anaconda.org/conda-forge/movingpandas

    New features:

    Includes fixes and enhancements for:

    • #178 Exposed StoneSoup import warning to user if this optional dependency is missing
    • #183 Addressed FutureWarnings
    • #186 Optimized stop point detection by avoiding re-creating shapely objects
    • #189 Support for custom geometry column names
    • #196 Ensured that add_direction doesn't add extra columns
    • Proper geo=False handling to improve working with local non-geographic coordinates

    Behind the scenes:

    • The repo now has bug report and feature request templates
    • We have activated the discussions forum at https://github.com/anitagraser/movingpandas/discussions
    Source code(tar.gz)
    Source code(zip)
  • v0.9(Jan 11, 2022)

    Published at https://anaconda.org/conda-forge/movingpandas

    New features:

    • #15 First trajectory smoothing algorithm: Kalman filter with constant velocity model based on StoneSoup
    • #128 First spatiotemporal trajectory generalization algorithm: Top-Down Time Ratio algorithm proposed by Meratnia & de By (2004) ported from MovinPy
    • #129 First trajectory cleaning algorithm: Outlier cleaner ported from MovinPy
    • #165 New convenience function showing library versions

    Includes fixes and enhancements for:

    • #152 Faster length of the diagonal of the minimum rotated rectangle
    • #151 Customizable speed column name
    • #147 Filter TrajectoryCollection by trajectory duration
    • #124 Add option for splitting trajectories by hour
    • #160 Faster TrajectoryCollection aggregation

    Behind the scenes:

    • #168 We have moved testing from Travis to Github Actions
    • #143 Sources are now linted using flake8 and black
    Source code(tar.gz)
    Source code(zip)
  • v0.8rc1(Oct 30, 2021)

    Published at https://anaconda.org/conda-forge/movingpandas

    Includes fixes and enhancements for:

    • #118 Handle get_linestring_between "ValueError: cannot set a single element with an array"
    • #112 Remove hard-coded geometry col name
    • #119 Raise an error if the input GeoDataFrame doesn't have a datetime index
    • #121 Fix TrajectoryStopDetector.get_stop_points to check if len(stops) > 0
    • #137 Improve file reading convenience
    • #133 Document units for TrajectorySplitter args
    Source code(tar.gz)
    Source code(zip)
  • v0.7rc1(Jun 3, 2021)

    Published at https://anaconda.org/conda-forge/movingpandas

    Includes fixes and enhancements for:

    • #114 Add conversions to GeoDataFrame
    • #115 Warning & wrong min/max values in TrajectoryCollection.plot
    • #117 Clip and intersection should return TrajectoryCollection
    Source code(tar.gz)
    Source code(zip)
  • v0.6rc1(May 8, 2021)

    Published at https://anaconda.org/conda-forge/movingpandas

    Includes fixes for:

    • #104 Clip with Polygon causes IndexError: list index out of range
    • #101 StopSplitter Error
    • #90 TrajectoryCollection plotter alters speed column
    Source code(tar.gz)
    Source code(zip)
  • v0.5rc1(Sep 26, 2020)

  • v0.4rc1(Aug 15, 2020)

  • v0.3.rc1(Mar 14, 2020)

Owner
Anita Graser
Spatial data analysis with a focus on mobility topics
Anita Graser
Interactive Maps with Geopandas

Create Interactive maps ??️ with your geodataframe Geopatra extends geopandas for interactive mapping and attempts to wrap the goodness of amazing map

sangarshanan 46 Aug 16, 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
Calculate & view the trajectory and live position of any earth-orbiting satellite

satellite-visualization A cross-platform application to calculate & view the trajectory and live position of any earth-orbiting satellite in 3D. This

Space Technology and Astronomy Cell - Open Source Society 3 Jan 8, 2022
Wraps GEOS geometry functions in numpy ufuncs.

PyGEOS PyGEOS is a C/Python library with vectorized geometry functions. The geometry operations are done in the open-source geometry library GEOS. PyG

null 362 Dec 23, 2022
A light-weight, versatile XYZ tile server, built with Flask and Rasterio :earth_africa:

Terracotta is a pure Python tile server that runs as a WSGI app on a dedicated webserver or as a serverless app on AWS Lambda. It is built on a modern

DHI GRAS 531 Dec 28, 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
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
OSMnx: Python for street networks. Retrieve, model, analyze, and visualize street networks and other spatial data from OpenStreetMap.

OSMnx OSMnx is a Python package that lets you download geospatial data from OpenStreetMap and model, project, visualize, and analyze real-world street

Geoff Boeing 4k Jan 8, 2023
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
Location field and widget for Django. It supports Google Maps, OpenStreetMap and Mapbox

django-location-field Let users pick locations using a map widget and store its latitude and longitude. Stable version: django-location-field==2.1.0 D

Caio Ariede 481 Dec 29, 2022
Deal with Bing Maps Tiles and Pixels / WGS 84 coordinates conversions, and generate grid Shapefiles

PyBingTiles This is a small toolkit in order to deal with Bing Tiles, used i.e. by Facebook for their Data for Good datasets. Install Clone this repos

Shoichi 1 Dec 8, 2021
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
This repository contains the scripts to derivate the ENU and ECEF coordinates from the longitude, latitude, and altitude values encoded in the NAD83 coordinates.

This repository contains the scripts to derivate the ENU and ECEF coordinates from the longitude, latitude, and altitude values encoded in the NAD83 coordinates.

Luigi Cruz 1 Feb 7, 2022
A Django application that provides country choices for use with forms, flag icons static files, and a country field for models.

Django Countries A Django application that provides country choices for use with forms, flag icons static files, and a country field for models. Insta

Chris Beaven 1.2k Jan 3, 2023
Python bindings and utilities for GeoJSON

geojson This Python library contains: Functions for encoding and decoding GeoJSON formatted data Classes for all GeoJSON Objects An implementation of

Jazzband 765 Jan 6, 2023
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
Python interface to PROJ (cartographic projections and coordinate transformations library)

pyproj Python interface to PROJ (cartographic projections and coordinate transformations library). Documentation Stable: http://pyproj4.github.io/pypr

null 832 Dec 31, 2022
Rasterio reads and writes geospatial raster datasets

Rasterio Rasterio reads and writes geospatial raster data. Geographic information systems use GeoTIFF and other formats to organize and store gridded,

Mapbox 1.9k Jan 7, 2023