Skip to content

Instantly share code, notes, and snippets.

@alukach
Last active November 6, 2019 04:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alukach/87044c6ca8cca3eebb73b8351581df93 to your computer and use it in GitHub Desktop.
Save alukach/87044c6ca8cca3eebb73b8351581df93 to your computer and use it in GitHub Desktop.
Convert Planet product bundles description into JSON
{
"bundles": {
"analytic": {
"name": "Analytic Radiance",
"description": "Orthorectified product, calibrated to at-sensor radiance",
"assets": {
"Landsat8L1G": [
"analytic_b1",
"analytic_b2",
"analytic_b3",
"analytic_b4",
"analytic_b5",
"analytic_b6",
"analytic_b7",
"analytic_b8",
"analytic_b9",
"analytic_b10",
"analytic_b11",
"analytic_bqa",
"metadata_txt"
],
"PSOrthoTile": [
"analytic",
"udm",
"analytic_xml"
],
"PSScene3Band": [
"analytic",
"analytic_xml",
"udm"
],
"PSScene4Band": [
"analytic",
"analytic_xml",
"udm"
],
"REOrthoTile": [
"analytic",
"analytic_xml",
"udm"
],
"Sentinel1": [
"ortho_analytic_vv",
"ortho_analytic_vh"
],
"Sentinel2L1C": [
"analytic_b1",
"analytic_b2",
"analytic_b3",
"analytic_b4",
"analytic_b5",
"analytic_b6",
"analytic_b7",
"analytic_b8",
"analytic_b8a",
"analytic_b9",
"analytic_b10",
"analytic_b11",
"analytic_b12",
"metadata_aux"
],
"SkySatScene": [
"ortho_analytic",
"ortho_analytic_udm"
],
"SkySatCollect": [
"ortho_analytic",
"ortho_analytic_udm"
]
}
},
"analytic_udm2": {
"name": "Analytic Radiance with UDM2",
"description": "Orthorectified product, calibrated to at-sensor radiance. Includes udm2.",
"assets": {
"PSOrthoTile": [
"analytic",
"udm",
"udm2",
"analytic_xml"
],
"PSScene4Band": [
"analytic",
"analytic_xml",
"udm",
"udm2"
],
"SkySatScene": [
"ortho_analytic",
"ortho_analytic_udm",
"ortho_analytic_udm2"
],
"SkySatCollect": [
"ortho_analytic",
"ortho_analytic_udm",
"ortho_analytic_udm2"
]
}
},
"visual": {
"name": "Visual",
"description": "Orthorectified product, visually enhanced for optimal appearance",
"assets": {
"Landsat8L1G": [
"visual"
],
"PSOrthoTile": [
"visual",
"visual_xml"
],
"PSScene3Band": [
"visual",
"visual_xml"
],
"REOrthoTile": [
"visual",
"visual_xml"
],
"Sentinel2L1C": [
"visual"
],
"SkySatCollect": [
"ortho_visual"
],
"SkySatScene": [
"ortho_visual"
]
}
},
"uncalibrated_dn": {
"name": "Uncalibrated DN",
"description": "Orthorectified product, non-radiometrically-calibrated, raw digital number",
"assets": {
"PSOrthoTile": [
"analytic_dn",
"udm",
"analytic_dn_xml"
],
"PSScene3Band": [
"analytic_dn",
"analytic_dn_xml",
"udm"
],
"PSScene4Band": [
"analytic_dn",
"analytic_dn_xml",
"udm"
],
"SkySatCollect": [
"ortho_analytic_dn",
"ortho_analytic_udm"
],
"SkySatScene": [
"ortho_analytic_dn",
"ortho_analytic_udm"
]
}
},
"uncalibrated_dn_udm2": {
"name": "Uncalibrated DN with UDM2",
"description": "Orthorectified product, non-radiometrically-calibrated, raw digital number. Includes udm2.",
"assets": {
"PSOrthoTile": [
"analytic_dn",
"analytic_dn_xml",
"udm",
"udm2"
],
"PSScene4Band": [
"analytic_dn",
"analytic_dn_xml",
"udm",
"udm2"
],
"SkySatCollect": [
"ortho_analytic_dn",
"ortho_analytic_udm",
"ortho_analytic_udm2"
],
"SkySatScene": [
"ortho_analytic_dn",
"ortho_analytic_udm",
"ortho_analytic_udm2"
]
}
},
"basic_analytic": {
"name": "Non-Orthorectified Analytic Radiance",
"description": "Non-orthorectified, calibrated to at-sensor radiance",
"assets": {
"PSScene3Band": [
"basic_analytic",
"basic_udm",
"basic_analytic_rpc",
"basic_analytic_xml"
],
"PSScene4Band": [
"basic_analytic",
"basic_udm",
"basic_analytic_rpc",
"basic_analytic_xml"
],
"REScene": [
"basic_analytic_b1",
"basic_analytic_b2",
"basic_analytic_b3",
"basic_analytic_b4",
"basic_analytic_b5",
"basic_analytic_xml",
"basic_analytic_rpc",
"basic_udm",
"basic_analytic_sci",
"browse"
],
"SkySatScene": [
"basic_analytic",
"basic_analytic_rpc"
]
}
},
"basic_analytic_udm2": {
"name": "Non-Orthorectified Analytic Radiance with UDM2",
"description": "Non-orthorectified, calibrated to at-sensor radiance. Includes udm2.",
"assets": {
"PSScene4Band": [
"basic_analytic",
"basic_udm",
"basic_udm2",
"basic_analytic_rpc",
"basic_analytic_xml"
],
"SkySatScene": [
"basic_analytic",
"basic_analytic_rpc"
]
}
},
"basic_uncalibrated_dn": {
"name": "Non-Orthorectified, Uncalibrated DN",
"description": "Non-orthorectified, non-radiometrically-calibrated, raw digital number",
"assets": {
"PSScene3Band": [
"basic_analytic_dn",
"basic_analytic_dn_xml",
"basic_udm",
"basic_analytic_dn_rpc"
],
"PSScene4Band": [
"basic_analytic_dn",
"basic_analytic_dn_xml",
"basic_udm",
"basic_analytic_rpc"
],
"SkySatScene": [
"basic_analytic_dn",
"basic_analytic_dn_rpc"
]
}
},
"basic_uncalibrated_dn_udm2": {
"name": "Non-Orthorectified, Uncalibrated DN with UDM2",
"description": "Non-orthorectified, non-radiometrically-calibrated, raw digital number. Includes udm2.",
"assets": {
"PSScene4Band": [
"basic_analytic_dn",
"basic_analytic_dn_xml",
"basic_udm",
"basic_udm2",
"basic_analytic_rpc"
],
"SkySatScene": [
"basic_analytic_dn",
"basic_analytic_dn_rpc"
]
}
},
"analytic_sr": {
"name": "Analytic Surface Reflectance",
"description": "Orthorectified product, radiometrically calibrated and atmospherically corrected to surface reflectance",
"assets": {
"PSScene4Band": [
"analytic_sr",
"udm",
"analytic_xml"
],
"MOD09GQ": [
"analytic_num_observations",
"analytic_orbit_pnt",
"analytic_granule_pnt",
"analytic_sur_refl_b01",
"analytic_sur_refl_b02",
"analytic_qc_250m",
"analytic_obscov",
"analytic_iobs_res"
],
"MYD09GQ": [
"analytic_num_observations",
"analytic_orbit_pnt",
"analytic_granule_pnt",
"analytic_sur_refl_b01",
"analytic_sur_refl_b02",
"analytic_qc_250m",
"analytic_obscov",
"analytic_iobs_res"
],
"MOD09GA": [
"analytic_num_observations_500m",
"analytic_num_observations_1km",
"analytic_state_1km",
"analytic_sensor_zenith",
"analytic_sensor_azimuth",
"analytic_range",
"analytic_solar_zenith",
"analytic_solar_azimuth",
"analytic_gflags",
"analytic_orbit_pnt",
"analytic_granule_pnt",
"analytic_sur_refl_b01",
"analytic_sur_refl_b02",
"analytic_sur_refl_b03",
"analytic_sur_refl_b04",
"analytic_sur_refl_b05",
"analytic_sur_refl_b06",
"analytic_sur_refl_b07",
"analytic_qc_500m",
"analytic_obscov_500m",
"analytic_iobs_res",
"analytic_q_scan"
],
"MYD09GA": [
"analytic_num_observations_500m",
"analytic_num_observations_1km",
"analytic_state_1km",
"analytic_sensor_zenith",
"analytic_sensor_azimuth",
"analytic_range",
"analytic_solar_zenith",
"analytic_solar_azimuth",
"analytic_gflags",
"analytic_orbit_pnt",
"analytic_granule_pnt",
"analytic_sur_refl_b01",
"analytic_sur_refl_b02",
"analytic_sur_refl_b03",
"analytic_sur_refl_b04",
"analytic_sur_refl_b05",
"analytic_sur_refl_b06",
"analytic_sur_refl_b07",
"analytic_qc_500m",
"analytic_obscov_500m",
"analytic_iobs_res",
"analytic_q_scan"
]
}
},
"analytic_sr_udm2": {
"name": "Analytic Surface Reflectance with UDM2",
"description": "Orthorectified product, radiometrically calibrated and atmospherically corrected to surface reflectance. Includes udm2.",
"assets": {
"PSScene4Band": [
"analytic_sr",
"analytic_xml",
"udm",
"udm2"
]
}
},
"basic_uncalibrated_dn_nitf": {
"name": "Non-Orthorectified, Uncalibrated DN NITF",
"description": "Non-orthorectified, non-radiometrically-calibrated, raw digital number in NITF format",
"assets": {
"PSScene4Band": [
"basic_analytic_dn_nitf",
"basic_analytic_dn_xml_nitf",
"basic_analytic_dn_rpc_nitf",
"basic_udm"
]
}
},
"basic_uncalibrated_dn_nitf_udm2": {
"name": "Non-Orthorectified, Uncalibrated DN NITF with UDM2",
"description": "Non-orthorectified, non-radiometrically-calibrated, raw digital number in NITF format. Includes udm2.",
"assets": {
"PSScene4Band": [
"basic_analytic_dn_nitf",
"basic_analytic_dn_xml_nitf",
"basic_analytic_dn_rpc_nitf",
"basic_udm",
"basic_udm2"
]
}
},
"basic_analytic_nitf": {
"name": "Non-Orthorectified Analytic Radiance NITF",
"description": "Non-orthorectified, calibrated to at-sensor radiance, in NITF format",
"assets": {
"PSScene4Band": [
"basic_analytic_nitf",
"basic_analytic_rpc_nitf",
"basic_analytic_xml_nitf",
"basic_udm"
],
"REScene": [
"basic_analytic_b1_nitf",
"basic_analytic_b2_nitf",
"basic_analytic_b3_nitf",
"basic_analytic_b4_nitf",
"basic_analytic_b5_nitf",
"basic_analytic_xml_nitf",
"basic_analytic_rpc",
"basic_udm",
"basic_analytic_sci",
"browse"
]
}
},
"basic_analytic_nitf_udm2": {
"name": "Non-Orthorectified Analytic Radiance NITF with UDM2",
"description": "Non-orthorectified, calibrated to at-sensor radiance, in NITF format. Includes udm2.",
"assets": {
"PSScene4Band": [
"basic_analytic_nitf",
"basic_analytic_rpc_nitf",
"basic_analytic_xml_nitf",
"basic_udm",
"basic_udm2"
]
}
},
"basic_panchromatic": {
"name": "Non-orthorectified, scaled radiance image",
"description": "Non-orthorectified radiometrically-calibrated panchromatic imagery",
"assets": {
"SkySatScene": [
"basic_panchromatic",
"basic_panchromatic_rpc"
]
}
},
"basic_panchromatic_dn": {
"name": "Non-orthorectified panchromatic imagery, non-radiometrically calibrated, raw digital number",
"description": "Unorthorectified panchromatic imagery, non-radiometrically calibrated, raw digital number",
"assets": {
"SkySatScene": [
"basic_panchromatic_dn",
"basic_panchromatic_dn_rpc"
]
}
},
"panchromatic": {
"name": "Panchromatic",
"description": "Orthorectified radiometrically-calibrated panchromatic image stored as 16-bit scaled radiance",
"assets": {
"SkySatCollect": [
"ortho_panchromatic",
"ortho_panchromatic_udm"
],
"SkySatScene": [
"ortho_panchromatic",
"ortho_panchromatic_udm"
]
}
},
"panchromatic_dn": {
"name": "Panchromatic DN",
"description": "Orthorectified panchromatic imagery, non-radiometrically calibrated, raw digital number",
"assets": {
"SkySatCollect": [
"ortho_panchromatic_dn",
"ortho_panchromatic_udm"
],
"SkySatScene": [
"ortho_panchromatic_dn",
"ortho_panchromatic_udm"
]
}
},
"panchromatic_dn_udm2": {
"name": "Panchromatic DN with UDM2",
"description": "Orthorectified panchromatic imagery, non-radiometrically calibrated, raw digital number",
"assets": {
"SkySatCollect": [
"ortho_panchromatic_dn",
"ortho_panchromatic_udm",
"ortho_panchromatic_udm2"
],
"SkySatScene": [
"ortho_panchromatic_dn",
"ortho_panchromatic_udm",
"ortho_panchromatic_udm2"
]
}
},
"pansharpened": {
"name": "Pansharpened",
"description": "Orthorectifed, pan-sharpened imagery, non-radiometrically calibrated, raw digital number",
"assets": {
"SkySatCollect": [
"ortho_pansharpened",
"ortho_pansharpened_udm"
],
"SkySatScene": [
"ortho_pansharpened",
"ortho_pansharpened_udm"
]
}
},
"pansharpened_udm2": {
"name": "Pansharpened with UDM2",
"description": "Orthorectifed, pan-sharpened imagery, non-radiometrically calibrated, raw digital number",
"assets": {
"SkySatCollect": [
"ortho_pansharpened",
"ortho_pansharpened_udm",
"ortho_pansharpened_udm2"
],
"SkySatScene": [
"ortho_pansharpened",
"ortho_pansharpened_udm",
"ortho_pansharpened_udm2"
]
}
},
"basic_l1a_dn": {
"name": "Non-Orthorectified, Level 1A Uncalibrated DN",
"description": "Non-orthorectified, non-radiometrically-calibrated, raw digital number, Level 1A",
"assets": {
"SkySatScene": [
"basic_l1a_panchromatic_dn",
"basic_l1a_panchromatic_dn_rpc"
]
}
},
"all": {
"name": "All assets",
"description": "All assets that can be produced for an item",
"assets": {
"Landsat8L1G": [
"analytic_b1",
"analytic_b2",
"analytic_b3",
"analytic_b4",
"analytic_b5",
"analytic_b6",
"analytic_b7",
"analytic_b8",
"analytic_b9",
"analytic_b10",
"analytic_b11",
"analytic_bqa",
"metadata_txt",
"visual"
],
"MOD09GA": [
"analytic_num_observations_500m",
"analytic_num_observations_1km",
"analytic_state_1km",
"analytic_sensor_zenith",
"analytic_sensor_azimuth",
"analytic_range",
"analytic_solar_zenith",
"analytic_solar_azimuth",
"analytic_gflags",
"analytic_orbit_pnt",
"analytic_granule_pnt",
"analytic_sur_refl_b01",
"analytic_sur_refl_b02",
"analytic_sur_refl_b03",
"analytic_sur_refl_b04",
"analytic_sur_refl_b05",
"analytic_sur_refl_b06",
"analytic_sur_refl_b07",
"analytic_qc_500m",
"analytic_obscov_500m",
"analytic_iobs_res",
"analytic_q_scan"
],
"MOD09GQ": [
"analytic_num_observations",
"analytic_orbit_pnt",
"analytic_granule_pnt",
"analytic_sur_refl_b01",
"analytic_sur_refl_b02",
"analytic_qc_250m",
"analytic_obscov",
"analytic_iobs_res"
],
"MYD09GA": [
"analytic_num_observations_500m",
"analytic_num_observations_1km",
"analytic_state_1km",
"analytic_sensor_zenith",
"analytic_sensor_azimuth",
"analytic_range",
"analytic_solar_zenith",
"analytic_solar_azimuth",
"analytic_gflags",
"analytic_orbit_pnt",
"analytic_granule_pnt",
"analytic_sur_refl_b01",
"analytic_sur_refl_b02",
"analytic_sur_refl_b03",
"analytic_sur_refl_b04",
"analytic_sur_refl_b05",
"analytic_sur_refl_b06",
"analytic_sur_refl_b07",
"analytic_qc_500m",
"analytic_obscov_500m",
"analytic_iobs_res",
"analytic_q_scan"
],
"MYD09GQ": [
"analytic_num_observations",
"analytic_orbit_pnt",
"analytic_granule_pnt",
"analytic_sur_refl_b01",
"analytic_sur_refl_b02",
"analytic_qc_250m",
"analytic_obscov",
"analytic_iobs_res"
],
"PSOrthoTile": [
"analytic_dn",
"analytic_dn_xml",
"udm",
"analytic",
"analytic_xml",
"visual",
"visual_xml"
],
"PSScene3Band": [
"analytic_dn",
"analytic_dn_xml",
"udm",
"analytic",
"analytic_xml",
"basic_analytic",
"basic_udm",
"basic_analytic_rpc",
"basic_analytic_xml",
"visual",
"visual_xml",
"basic_analytic_dn",
"basic_analytic_dn_rpc",
"basic_analytic_dn_xml"
],
"PSScene4Band": [
"basic_udm",
"analytic_dn",
"analytic_dn_xml",
"udm",
"analytic",
"analytic_xml",
"basic_analytic",
"basic_analytic_rpc",
"basic_analytic_xml",
"basic_analytic_dn",
"basic_analytic_dn_xml",
"analytic_sr"
],
"REOrthoTile": [
"analytic",
"analytic_xml",
"udm",
"visual",
"visual_xml"
],
"REScene": [
"basic_analytic_rpc",
"basic_udm",
"basic_analytic_sci",
"browse",
"basic_analytic_b1",
"basic_analytic_b2",
"basic_analytic_b3",
"basic_analytic_b4",
"basic_analytic_b5",
"basic_analytic_xml"
],
"Sentinel1": [
"ortho_analytic_vv",
"ortho_analytic_vh"
],
"Sentinel2L1C": [
"analytic_b1",
"analytic_b2",
"analytic_b3",
"analytic_b4",
"analytic_b5",
"analytic_b6",
"analytic_b7",
"analytic_b8",
"analytic_b8a",
"analytic_b9",
"analytic_b10",
"analytic_b11",
"analytic_b12",
"metadata_aux",
"visual"
],
"SkySatCollect": [
"ortho_analytic_dn",
"ortho_analytic_udm",
"ortho_panchromatic",
"ortho_panchromatic_dn",
"ortho_panchromatic_udm",
"ortho_visual",
"ortho_pansharpened",
"ortho_pansharpened_udm",
"ortho_analytic"
],
"SkySatScene": [
"ortho_analytic",
"ortho_analytic_udm",
"ortho_visual",
"ortho_analytic_dn",
"ortho_panchromatic",
"ortho_panchromatic_dn",
"ortho_panchromatic_udm",
"basic_panchromatic",
"basic_panchromatic_dn",
"basic_panchromatic_dn_rpc",
"basic_analytic",
"basic_analytic_dn",
"basic_analytic_dn_rpc",
"ortho_pansharpened",
"ortho_pansharpened_udm"
]
}
},
"all_udm2": {
"name": "All assets with UDM2",
"description": "All assets that can be produced for an item. Includes udm2.",
"assets": {
"PSOrthoTile": [
"analytic_dn",
"analytic_dn_xml",
"udm",
"udm2",
"analytic",
"analytic_xml",
"visual",
"visual_xml"
],
"PSScene4Band": [
"basic_udm",
"basic_udm2",
"analytic_dn",
"analytic_dn_xml",
"udm",
"udm2",
"analytic",
"analytic_xml",
"basic_analytic",
"basic_analytic_rpc",
"basic_analytic_xml",
"basic_analytic_dn",
"basic_analytic_dn_xml",
"analytic_sr"
],
"SkySatCollect": [
"ortho_panchromatic",
"ortho_panchromatic_dn",
"ortho_panchromatic_udm",
"ortho_panchromatic_udm2",
"ortho_pansharpened",
"ortho_pansharpened_udm",
"ortho_pansharpened_udm2",
"ortho_visual",
"ortho_analytic",
"ortho_analytic_dn",
"ortho_analytic_udm",
"ortho_analytic_udm2"
],
"SkySatScene": [
"basic_analytic",
"basic_analytic_dn",
"basic_analytic_dn_rpc",
"basic_panchromatic",
"basic_panchromatic_dn",
"basic_panchromatic_dn_rpc",
"basic_panchromatic_udm2",
"ortho_panchromatic",
"ortho_panchromatic_dn",
"ortho_panchromatic_udm",
"ortho_panchromatic_udm2",
"ortho_pansharpened",
"ortho_pansharpened_udm",
"ortho_pansharpened_udm2",
"ortho_visual",
"ortho_analytic",
"ortho_analytic_dn",
"ortho_analytic_udm",
"ortho_analytic_udm2"
]
}
}
},
"version": "2019-09-25"
}
import json
import re
import requests
from bs4 import BeautifulSoup
if __name__ == "__main__":
url = "https://developers.planet.com/docs/orders/product-bundles-reference/"
html = requests.get(url).text
soup = BeautifulSoup(html, "html.parser")
bundles = {}
for detail in soup.find_all("details"):
bundle_id = detail.find("summary").text
bundle_name = detail.find_next("h4").text
bundle_desc = (
detail.find_next("p").find_next("p").text
) # Ignore first (empty) p-tag
for item_type_node in detail.select("tr td:not([align=right])"):
item_type = item_type_node.text
for asset_type_node in item_type_node.find_next_sibling():
if not isinstance(asset_type_node, str):
continue
bundles.setdefault(
bundle_id,
{"name": bundle_name, "description": bundle_desc, "assets": {}},
)["assets"].setdefault(item_type, []).append(asset_type_node)
print(
json.dumps(
{
"bundles": bundles,
"version": soup.find("em", text=re.compile("last updated: .*"))
.text.split(":")
.pop()
.strip(),
}
)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment