Skip to main content

Tools for working with data from the Planet Four Zooniverse project.

Project description

p4tools

PyPI version

Installation

pip install p4tools

Features

  • Provide easy access to the Planet Four catalog data.
    • Data will be automatically downloaded and cached by the pooch library.
    • The first time it will take a few seconds to download the data, the next time it will be using the cache.
  • Provide automatic downloading of the png tiles of the catalog.
  • Provide plotting tools

Note: The original data for input to the Planet Four projects were these _COLOR products like this one: https://hirise-pds.lpl.arizona.edu/PDS/EXTRAS/RDR/ESP/ORB_011400_011499/ESP_011486_0980/ESP_011486_0980_IRB.NOMAP.browse.jpg (not the browse product though, but the full size of course)

Paper

The underlying paper for this work is:

Aye, K.-M., Schwamb, M.E., Portyankina, G., Hansen, C.J., McMaster, A., Miller, G.R.M., Carstensen, B., Snyder, C., Parrish, M., Lynn, S., Mai, C., Miller, D., Simpson, R.J., Smith, A.M., 2019. Planet Four: Probing springtime winds on Mars by mapping the southern polar CO2 jet deposits. Icarus 319, 558–598. https://doi.org/10.1016/j.icarus.2018.08.018

from p4tools import io
# get the catalogs
fans = io.get_fan_catalog()
blotches = io.get_blotch_catalog()
fans.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style>
marking_id angle distance tile_id image_x image_y n_votes obsid spread version ... y_angle l_s map_scale north_azimuth BodyFixedCoordinateX BodyFixedCoordinateY BodyFixedCoordinateZ PlanetocentricLatitude PlanetographicLatitude Longitude
0 F000000 205.56 179.71 APF0000ci9 2270.76 24336.16 35 ESP_012079_0945 88.03 1 ... -0.43 214.785 0.25 126.856883 -65.804336 261.407884 -3370.504345 -85.427383 -85.480829 104.129523
1 F000001 185.39 179.62 APF0000cia 3391.21 5640.60 15 ESP_012079_0945 21.35 1 ... -0.09 214.785 0.25 126.856883 -67.219114 257.011589 -3370.631413 -85.493546 -85.546226 104.656897
2 F000002 184.98 500.27 APF0000cia 3509.96 5876.70 10 ESP_012079_0945 18.91 1 ... -0.09 214.785 0.25 126.856883 -67.170611 257.055226 -3370.630794 -85.493039 -85.545725 104.644396
3 F000004 184.29 105.43 APF0000cia 3716.27 5824.50 6 ESP_012079_0945 26.41 1 ... -0.07 214.785 0.25 126.856883 -67.127761 257.024926 -3370.635002 -85.493723 -85.546401 104.637107
4 F000005 189.42 109.50 APF0000cia 3452.17 6033.00 3 ESP_012079_0945 22.58 1 ... -0.16 214.785 0.25 126.856883 -67.169940 257.096267 -3370.628302 -85.492368 -85.545061 104.642019

5 rows × 24 columns

# get fans for a given tile_id
fans_for_tile = io.get_fans_for_tile("APF0000cro")
fans_for_tile.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style>
marking_id angle distance tile_id image_x image_y n_votes obsid spread version ... y_angle l_s map_scale north_azimuth BodyFixedCoordinateX BodyFixedCoordinateY BodyFixedCoordinateZ PlanetocentricLatitude PlanetographicLatitude Longitude
639 F00028e 176.82 357.51 APF0000cro 1904.17 469.07 30 ESP_012079_0945 29.52 1 ... 0.06 214.785 0.25 126.856883 -68.025795 255.956937 -3370.658673 -85.507336 -85.559856 104.883467
640 F00028f 177.09 122.21 APF0000cro 1948.37 602.24 25 ESP_012079_0945 22.86 1 ... 0.05 214.785 0.25 126.856883 -68.003644 255.983513 -3370.657733 -85.506997 -85.559521 104.877359
641 F000290 177.02 137.73 APF0000cro 1666.29 290.83 24 ESP_012079_0945 19.18 1 ... 0.05 214.785 0.25 126.856883 -68.096623 255.937481 -3370.658914 -85.507347 -85.559867 104.899357
642 F000291 178.83 97.55 APF0000cro 1875.95 400.38 16 ESP_012079_0945 35.51 1 ... 0.02 214.785 0.25 126.856883 -68.038458 255.943748 -3370.659367 -85.507498 -85.560016 104.886848
643 F000292 178.56 108.57 APF0000cro 2316.12 491.00 4 ESP_012079_0945 52.76 1 ... 0.03 214.785 0.25 126.856883 -67.928961 255.925385 -3370.666710 -85.508282 -85.560791 104.864970

5 rows × 24 columns

Metadata

Metadata for the HiRISE observions that were used for the input data to the project:

# get the metadata of the HiRISE images
metadata = io.get_meta_data()
metadata.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style>
OBSERVATION_ID IMAGE_CENTER_LATITUDE IMAGE_CENTER_LONGITUDE SOLAR_LONGITUDE START_TIME map_scale north_azimuth # of tiles
0 ESP_011296_0975 -82.1965 225.2530 178.833 2008-12-23 16:15:26 1.0 110.600107 91
1 ESP_011341_0980 -81.7969 76.1304 180.809 2008-12-27 04:25:02 0.5 110.208923 126
2 ESP_011348_0950 -85.0427 259.0940 181.117 2008-12-27 17:29:17 1.0 123.624057 91
3 ESP_011350_0945 -85.2160 181.4150 181.205 2008-12-27 21:14:01 0.5 99.672793 126
4 ESP_011351_0945 -85.2157 181.5480 181.249 2008-12-27 23:05:54 1.0 127.960688 91
# get the lat/lon or BodyFixedcoordinates of the tiles
coords = io.get_tile_coords()
coords.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style>
x_tile y_tile x_hirise y_hirise PlanetocentricLatitude PlanetographicLatitude PositiveEast360Longitude BodyFixedCoordinateX BodyFixedCoordinateY BodyFixedCoordinateZ tile_id obsid
0 1 1 420.0 324.0 -85.504144 -85.556701 104.952104 -68.380674 256.056147 -3370.636698 APF0000cwz ESP_012079_0945
1 1 2 420.0 872.0 -85.502300 -85.554878 104.934805 -68.331337 256.181661 -3370.628630 APF0000ck9 ESP_012079_0945
2 1 3 420.0 1420.0 -85.500454 -85.553054 104.917486 -68.281853 256.307249 -3370.620295 APF0000cty ESP_012079_0945
3 1 4 420.0 1968.0 -85.498607 -85.551228 104.900198 -68.232522 256.433112 -3370.615690 APF0000ciy ESP_012079_0945
4 1 5 420.0 2516.0 -85.496762 -85.549404 104.882968 -68.183281 256.558509 -3370.606455 APF0000cwp ESP_012079_0945

Image tiles

The png tiles of the HiRISE images are automatically downloaded and cached by the pooch library.

# get the urls of the tiles
tile_urls = io.get_tile_urls()
tile_urls.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style>
tile_id tile_url
0 APF0000coq http://www.planetfour.org/subjects/standard/50...
1 APF0000cro http://www.planetfour.org/subjects/standard/50...
2 APF0000cs6 http://www.planetfour.org/subjects/standard/50...
3 APF0000co1 http://www.planetfour.org/subjects/standard/50...
4 APF0000cpd http://www.planetfour.org/subjects/standard/50...
# or get the url for a tile id
io.get_url_for_tile("APF0000cro")
'http://www.planetfour.org/subjects/standard/50e742bf5e2ed212400040a4.jpg'
# get the png as numpy array:
img = io.get_subframe_for_tile("APF0000cro")
img
array([[[146,   1,   8],
        [146,   1,   6],
        [145,   0,   5],
        ...,
        [116,   3,   0],
        [115,   1,   0],
        [115,   3,   1]],

       [[147,   2,   7],
        [146,   1,   6],
        [145,   0,   2],
        ...,
        [119,   1,   0],
        [119,   1,   0],
        [117,   2,   0]],

       [[145,   3,   2],
        [145,   1,   1],
        [147,   0,   0],
        ...,
        [125,   0,   0],
        [124,   0,   0],
        [125,   0,   0]],

       ...,

       [[121,  96,  76],
        [126,  99,  80],
        [127,  99,  78],
        ...,
        [125,  93,  72],
        [124,  92,  71],
        [130,  98,  77]],

       [[118,  91,  70],
        [124,  97,  76],
        [123,  95,  74],
        ...,
        [130,  98,  77],
        [125,  93,  72],
        [130,  98,  75]],

       [[111,  84,  63],
        [116,  89,  68],
        [114,  83,  63],
        ...,
        [132, 100,  79],
        [127,  95,  72],
        [133, 101,  78]]], dtype=uint8)
io.get_hirise_id_for_tile("APF0000cro")
'ESP_012079_0945'

License

MIT license

Credits

Developer and Maintainer

Contributors

  • Some ideas and concepts came from Meg Schwamb

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

p4tools-0.16.7.tar.gz (1.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

p4tools-0.16.7-py3-none-any.whl (71.5 kB view details)

Uploaded Python 3

File details

Details for the file p4tools-0.16.7.tar.gz.

File metadata

  • Download URL: p4tools-0.16.7.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for p4tools-0.16.7.tar.gz
Algorithm Hash digest
SHA256 3962f8988396053370dec0dda3f4c067411af312d7c94ad86af3925cccc451c8
MD5 294ffe8554af51ea8a2b126f652202f5
BLAKE2b-256 a0c8008e7afec89b16182d88b253a64faae3f29d28361d84722fa41528b63cd7

See more details on using hashes here.

File details

Details for the file p4tools-0.16.7-py3-none-any.whl.

File metadata

  • Download URL: p4tools-0.16.7-py3-none-any.whl
  • Upload date:
  • Size: 71.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for p4tools-0.16.7-py3-none-any.whl
Algorithm Hash digest
SHA256 2c14f454fa7996c21ef286c78a617714e07b968268eae048244ffd4eeaca81e4
MD5 e6b29b1d1981da8fe1514d24eab4ff0f
BLAKE2b-256 a29de8f891dcae9ed76d5f1e034709eb9f13c434321e8a136d3b243944804a4d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page