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
A library to access OpenStreetMap related services

OSMPythonTools The python package OSMPythonTools provides easy access to OpenStreetMap (OSM) related services, among them an Overpass endpoint, Nomina

Franz-Benjamin Mocnik 342 Dec 31, 2022
A Python package for delineating nested surface depressions from digital elevation data.

Welcome to the lidar package lidar is Python package for delineating the nested hierarchy of surface depressions in digital elevation models (DEMs). I

Qiusheng Wu 166 Jan 03, 2023
Minimum Bounding Box of Geospatial data

BBOX Problem definition: The spatial data users often are required to obtain the coordinates of the minimum bounding box of vector and raster data in

Ali Khosravi Kazazi 1 Sep 08, 2022
:earth_asia: Python Geocoder

Python Geocoder Simple and consistent geocoding library written in Python. Table of content Overview A glimpse at the API Forward Multiple results Rev

Denis 1.5k Jan 02, 2023
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 02, 2023
Daily social mapping project in November 2021. Maps made using PyGMT whenever possible.

Daily social mapping project in November 2021. Maps made using PyGMT whenever possible.

Wei Ji 20 Nov 24, 2022
Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.

django-rest-framework-gis Geographic add-ons for Django Rest Framework - Mailing List. Install last stable version from pypi pip install djangorestfra

OpenWISP 981 Jan 03, 2023
Use Mapbox GL JS to visualize data in a Python Jupyter notebook

Location Data Visualization library for Jupyter Notebooks Library documentation at https://mapbox-mapboxgl-jupyter.readthedocs-hosted.com/en/latest/.

Mapbox 620 Dec 15, 2022
geemap - A Python package for interactive mapping with Google Earth Engine, ipyleaflet, and ipywidgets.

A Python package for interactive mapping with Google Earth Engine, ipyleaflet, and folium

Qiusheng Wu 2.4k Dec 30, 2022
A toolbox for processing earth observation data with Python.

eo-box eobox is a Python package with a small collection of tools for working with Remote Sensing / Earth Observation data. Package Overview So far, t

13 Jan 06, 2022
Open GeoJSON data on geojson.io

geojsonio.py Open GeoJSON data on geojson.io from Python. geojsonio.py also contains a command line utility that is a Python port of geojsonio-cli. Us

Jacob Wasserman 114 Dec 21, 2022
Simple CLI for Google Earth Engine Uploads

geeup: Simple CLI for Earth Engine Uploads with Selenium Support This tool came of the simple need to handle batch uploads of both image assets to col

Samapriya Roy 79 Nov 26, 2022
a Geolocator made in python

Geolocator A Geolocator made in python ✨ Features locates ur location using ur ip thats it! 💁‍♀️ How to use first download the locator.py file instal

Portgas D Ace 1 Oct 27, 2021
Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.

Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.

OpenWISP 982 Jan 06, 2023
Client library for interfacing with USGS datasets

USGS API USGS is a python module for interfacing with the US Geological Survey's API. It provides submodules to interact with various endpoints, and c

Amit Kapadia 104 Dec 30, 2022
Creates 3D geometries from 2D vector graphics, for use in geodynamic models

geomIO - creating 3D geometries from 2D input This is the Julia and Python version of geomIO, a free open source software to generate 3D volumes and s

3 Feb 01, 2022
QLUSTER is a relative orbit design tool for formation flying satellite missions and space rendezvous scenarios

QLUSTER is a relative orbit design tool for formation flying satellite missions and space rendezvous scenarios, that I wrote in Python 3 for my own research and visualisation. It is currently unfinis

Samuel Low 9 Aug 23, 2022
Build, deploy and extract satellite public constellations with one command line.

SatExtractor Build, deploy and extract satellite public constellations with one command line. Table of Contents About The Project Getting Started Stru

Frontier Development Lab 70 Nov 18, 2022
Python 台灣行政區地圖 (2021)

Python 台灣行政區地圖 (2021) 以 python 讀取政府開放平台的 ShapeFile 地圖資訊。歡迎引用或是協作 另有縣市資訊、村里資訊與各種行政地圖資訊 例如: 直轄市、縣市界線(TWD97經緯度) 鄉鎮市區界線(TWD97經緯度) | 政府資料開放平臺: https://data

WeselyOng 12 Sep 27, 2022
Pure Python NetCDF file reader and writer

Pyncf Pure Python NetCDF file reading and writing. Introduction Inspired by the pyshp library, which provides simple pythonic and dependency free data

Karim Bahgat 14 Sep 30, 2022