MAAP AWS Access in R

Authors: Sheyenne Kirkland (UAH), Harshini Girish (UAH), Alex Mandel (DevSeed), Chuck Daniels (DevSeed), Henry Rodman (DevSeed), Zac Deziel (DevSeed)

Date: February 24, 2025

Description: In this tutorial, we walk through accessing MAAP data in S3 buckets (maap-ops-workspace and nasa-maap-data-store) in R. We’ll also demonstrate opening a raster, vector, and text file.

Run This Notebook

To access and run this tutorial within MAAP’s Algorithm Development Environment (ADE), please refer to the “Getting started with the MAAP” section of our documentation.

Disclaimer: it is highly recommended to run a tutorial within MAAP’s ADE, which already includes packages specific to MAAP, such as maap-py. Running the tutorial outside of the MAAP ADE may lead to errors. Users should work within an “R/Python” workspace.

Additional Resources

Install/Load Packages

Let’s install and load packages needed for this tutorial.

[ ]:
install.packages("rstac")

library("rstac")
library("sf")
library("reticulate")
library("paws")

Set up Access

While we don’t need the code to get temporary credentials (the paws package handles this for us), the default region needs to be set to “us-west-2”.

[2]:
s3 <- paws::s3(region = "us-west-2")

Let’s also set up maap-py since this will be used to get our username.

[3]:
maap_py <- import("maap.maap")
maap <- maap_py$MAAP()

Explore Buckets

Now that we have access to MAAP buckets, we can get data available in AWS. Users will potentially use two buckets:

  1. maap-ops-workspace

  2. nasa-maap-data-store

“maap-ops-workspace” holds user shared and private buckets, while “nasa-maap-data-store” holds our datasets that are ingested into the MAAP STAC.

User Shared Buckets

To access objects stored within a shared bucket, run the following cell. Update the prefix path following shared/ as necessary.

[4]:
bucket <- "maap-ops-workspace"
[5]:
s3_response <- s3$list_objects_v2(Bucket = bucket, Prefix = "shared/alexdevseed/cog-tests/")

To grab the identifier for each object within your bucket, run the following cell.

[6]:
shared_objects <- sapply(s3_response$Contents, function(s3_object) s3_object$Key)
shared_objects <- shared_objects[grep("\\.tif$", shared_objects)] #list tiff files
shared_objects
  1. 'shared/alexdevseed/cog-tests/Landsat8_275_comp_cog_2015-2020_dps.tif'
  2. 'shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog-ovr3.tif'
  3. 'shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog-ovr4.tif'
  4. 'shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog-ovr6.tif'
  5. 'shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog-ovr8.tif'
  6. 'shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog-s3o8.tif'
  7. 'shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog.tif'

User Private Buckets

To access data within your private bucket, we’ll use code similar to above but update the prefix. Before updating our prefix, we’ll get our username.

[7]:
username <- maap$profile$account_info()$username
username
'smk0033'

Now we can use the username variable in our prefix. Be sure to update the path as necessary to access the files within your desired bucket.

[8]:
s3_response <- s3$list_objects_v2(Bucket = bucket, Prefix = paste(username, "CONUSbiohex2020", sep = "/"))
[9]:
s3_object_keys <- sapply(s3_response$Contents, function(s3_object) s3_object$Key)
s3_object_keys
  1. 'smk0033/CONUSbiohex2020/'
  2. 'smk0033/CONUSbiohex2020/.ipynb_checkpoints/'
  3. 'smk0033/CONUSbiohex2020/CONUSbiohex2020.dbf'
  4. 'smk0033/CONUSbiohex2020/CONUSbiohex2020.prj'
  5. 'smk0033/CONUSbiohex2020/CONUSbiohex2020.sbn'
  6. 'smk0033/CONUSbiohex2020/CONUSbiohex2020.sbx'
  7. 'smk0033/CONUSbiohex2020/CONUSbiohex2020.shp'
  8. 'smk0033/CONUSbiohex2020/CONUSbiohex2020.shx'
  9. 'smk0033/CONUSbiohex2020/biohex.gpkg'

Note: while we do not demonstrate accessing data from a private bucket in the following examples, accessing data in a private bucket works the same as accessing data in a shared bucket - the only difference will be the paths.

nasa-maap-data-store Buckets

To get access to the nasa-maap-data-store bucket, we’ll do an rstac query to get a path to items we need. Users can then pass that path into the tool needed to open it.

For this example, we’ll use the “icesat2-boreal” dataset.

[10]:
# Define the MAAP STAC endpoint
stac_endpoint <- stac("https://stac.maap-project.org/")
[11]:
# Define the collection
collection <- "icesat2-boreal"

# Fetch items
stac_url <- stac_endpoint[[2]]

stac_items <- stac(stac_url) |>
  stac_search(collections = collection) |>
  get_request()

print(stac_items)
###Items
- features (10 item(s)):
  - boreal_agb_202302151676439579_1326
  - boreal_agb_202302151676435792_3402
  - boreal_agb_202302151676435665_3417
  - boreal_agb_202302151676434536_3215
  - boreal_agb_202302151676434460_3035
  - boreal_agb_202302151676432986_2782
  - boreal_agb_202302151676430990_1278
  - boreal_agb_202302151676430794_26340
  - boreal_agb_202302151676430633_40664
  - boreal_agb_202302151676430594_0611
- assets: csv, tif
- item's fields:
assets, bbox, collection, geometry, id, links, properties, stac_extensions, stac_version, type

Now that we have defined our collection and retrieved some items, let’s get the S3 URL associated with the first item.

[12]:
item = stac_items$features[[1]]$assets[[1]]$href
item
's3://nasa-maap-data-store/file-staging/nasa-map/icesat2-boreal/boreal_agb_202302151676439579_1326_train_data.csv'

Accessing an Item

TIFF

For this example, we’ll access a TIFF file from the shared bucket query using the sf package. To read an item from S3 directly, /vsis3/ needs to precede the path. To do this with an object from our shared bucket query, we’ll use paste to combine vsis3 with our bucket and our key.

[13]:
tiff_path <- paste("/vsis3", bucket, shared_objects[7], sep = "/")
print(tiff_path)
[1] "/vsis3/maap-ops-workspace/shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog.tif"

As a best practice, drivers should be used for speed. There are specific drivers for different data formats. To list drivers for raster data, run the following cell. For vector data, update “raster” to “vector”. For a full list, remove “head” or see the GDAL Documentation site.

[14]:
head(st_drivers(what = "raster"))
A data.frame: 6 × 7
namelong_namewritecopyis_rasteris_vectorvsi
<chr><chr><lgl><lgl><lgl><lgl><lgl>
VRTVRT Virtual Raster TRUE TRUETRUEFALSE TRUE
DERIVEDDERIVEDDerived datasets using VRT pixel functionsFALSEFALSETRUEFALSEFALSE
GTiffGTiff GeoTIFF TRUE TRUETRUEFALSE TRUE
COGCOG Cloud optimized GeoTIFF generator FALSE TRUETRUEFALSE TRUE
NITFNITF National Imagery Transmission Format TRUE TRUETRUEFALSE TRUE
RPFTOCRPFTOC Raster Product Format TOC format FALSEFALSETRUEFALSE TRUE

Now lets read our data.

[15]:
tiff_read <- sf::gdal_utils("info", tiff_path)
tiff_read
Driver: GTiff/GeoTIFF
Files: /vsis3/maap-ops-workspace/shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog.tif
Size is 3000, 3000
Coordinate System is:
PROJCRS["unknown",
    BASEGEOGCRS["NAD83",
        DATUM["North American Datum 1983",
            ELLIPSOID["GRS 1980",6378137,298.257222101004,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",4269]],
    CONVERSION["Albers Equal Area",
        METHOD["Albers Equal Area",
            ID["EPSG",9822]],
        PARAMETER["Latitude of false origin",40,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8821]],
        PARAMETER["Longitude of false origin",180,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8822]],
        PARAMETER["Latitude of 1st standard parallel",50,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8823]],
        PARAMETER["Latitude of 2nd standard parallel",70,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8824]],
        PARAMETER["Easting at false origin",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8826]],
        PARAMETER["Northing at false origin",0,
            LENGTHUNIT["metre",1],
            ID["EPSG",8827]]],
    CS[Cartesian,2],
        AXIS["easting",east,
            ORDER[1],
            LENGTHUNIT["metre",1,
                ID["EPSG",9001]]],
        AXIS["northing",north,
            ORDER[2],
            LENGTHUNIT["metre",1,
                ID["EPSG",9001]]]]
Data axis to CRS axis mapping: 1,2
Origin = (-1791478.000000000000000,7983304.000000000000000)
Pixel Size = (30.000000000000000,-30.000000000000000)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=PIXEL
  LAYOUT=COG
Corner Coordinates:
Upper Left  (-1791478.000, 7983304.000) ( 16d51'54.04"E, 68d27' 4.96"N)
Lower Left  (-1791478.000, 7893304.000) ( 18d20'45.02"E, 69d 3'10.36"N)
Upper Right (-1701478.000, 7983304.000) ( 15d 9'32.11"E, 68d58' 7.91"N)
Lower Right (-1701478.000, 7893304.000) ( 16d37'42.72"E, 69d35' 5.45"N)
Center      (-1746478.000, 7938304.000) ( 16d44'58.48"E, 69d 1' 3.32"N)
Band 1 Block=512x512 Type=Float32, ColorInterp=Gray
  Min=4.259 Max=642.621
  Minimum=4.259, Maximum=642.621, Mean=54.163, StdDev=41.175
  NoData Value=-3.4e+38
  Overviews: 1500x1500, 750x750, 375x375
  Metadata:
    STATISTICS_MAXIMUM=642.62117058029
    STATISTICS_MEAN=54.162682191363
    STATISTICS_MINIMUM=4.258820251973
    STATISTICS_STDDEV=41.175124882695
Band 2 Block=512x512 Type=Float32, ColorInterp=Undefined
  Min=0.630 Max=334.889
  Minimum=0.630, Maximum=334.889, Mean=10.525, StdDev=10.752
  NoData Value=-3.4e+38
  Overviews: 1500x1500, 750x750, 375x375
  Metadata:
    STATISTICS_MAXIMUM=334.88861093713
    STATISTICS_MEAN=10.524834878905
    STATISTICS_MINIMUM=0.62954892025643
    STATISTICS_STDDEV=10.751815070336
Band 3 Block=512x512 Type=Float32, ColorInterp=Undefined
  Min=3.409 Max=178.328
  Minimum=3.409, Maximum=178.328, Mean=41.354, StdDev=31.934
  NoData Value=-3.4e+38
  Overviews: 1500x1500, 750x750, 375x375
  Metadata:
    STATISTICS_MAXIMUM=178.32760325572
    STATISTICS_MEAN=41.353653830476
    STATISTICS_MINIMUM=3.408856940596
    STATISTICS_STDDEV=31.934002621158
Band 4 Block=512x512 Type=Float32, ColorInterp=Undefined
  Min=6.503 Max=850.186
  Minimum=6.503, Maximum=850.186, Mean=72.227, StdDev=52.055
  NoData Value=-3.4e+38
  Overviews: 1500x1500, 750x750, 375x375
  Metadata:
    STATISTICS_MAXIMUM=850.18554567087
    STATISTICS_MEAN=72.227219607842
    STATISTICS_MINIMUM=6.5033239743444
    STATISTICS_STDDEV=52.055061765112
'Driver: GTiff/GeoTIFF\nFiles: /vsis3/maap-ops-workspace/shared/alexdevseed/cog-tests/boreal_agb_20211015_0249_cog.tif\nSize is 3000, 3000\nCoordinate System is:\nPROJCRS["unknown",\n BASEGEOGCRS["NAD83",\n DATUM["North American Datum 1983",\n ELLIPSOID["GRS 1980",6378137,298.257222101004,\n LENGTHUNIT["metre",1]]],\n PRIMEM["Greenwich",0,\n ANGLEUNIT["degree",0.0174532925199433]],\n ID["EPSG",4269]],\n CONVERSION["Albers Equal Area",\n METHOD["Albers Equal Area",\n ID["EPSG",9822]],\n PARAMETER["Latitude of false origin",40,\n ANGLEUNIT["degree",0.0174532925199433],\n ID["EPSG",8821]],\n PARAMETER["Longitude of false origin",180,\n ANGLEUNIT["degree",0.0174532925199433],\n ID["EPSG",8822]],\n PARAMETER["Latitude of 1st standard parallel",50,\n ANGLEUNIT["degree",0.0174532925199433],\n ID["EPSG",8823]],\n PARAMETER["Latitude of 2nd standard parallel",70,\n ANGLEUNIT["degree",0.0174532925199433],\n ID["EPSG",8824]],\n PARAMETER["Easting at false origin",0,\n LENGTHUNIT["metre",1],\n ID["EPSG",8826]],\n PARAMETER["Northing at false origin",0,\n LENGTHUNIT["metre",1],\n ID["EPSG",8827]]],\n CS[Cartesian,2],\n AXIS["easting",east,\n ORDER[1],\n LENGTHUNIT["metre",1,\n ID["EPSG",9001]]],\n AXIS["northing",north,\n ORDER[2],\n LENGTHUNIT["metre",1,\n ID["EPSG",9001]]]]\nData axis to CRS axis mapping: 1,2\nOrigin = (-1791478.000000000000000,7983304.000000000000000)\nPixel Size = (30.000000000000000,-30.000000000000000)\nMetadata:\n AREA_OR_POINT=Area\nImage Structure Metadata:\n INTERLEAVE=PIXEL\n LAYOUT=COG\nCorner Coordinates:\nUpper Left (-1791478.000, 7983304.000) ( 16d51\'54.04"E, 68d27\' 4.96"N)\nLower Left (-1791478.000, 7893304.000) ( 18d20\'45.02"E, 69d 3\'10.36"N)\nUpper Right (-1701478.000, 7983304.000) ( 15d 9\'32.11"E, 68d58\' 7.91"N)\nLower Right (-1701478.000, 7893304.000) ( 16d37\'42.72"E, 69d35\' 5.45"N)\nCenter (-1746478.000, 7938304.000) ( 16d44\'58.48"E, 69d 1\' 3.32"N)\nBand 1 Block=512x512 Type=Float32, ColorInterp=Gray\n Min=4.259 Max=642.621 \n Minimum=4.259, Maximum=642.621, Mean=54.163, StdDev=41.175\n NoData Value=-3.4e+38\n Overviews: 1500x1500, 750x750, 375x375\n Metadata:\n STATISTICS_MAXIMUM=642.62117058029\n STATISTICS_MEAN=54.162682191363\n STATISTICS_MINIMUM=4.258820251973\n STATISTICS_STDDEV=41.175124882695\nBand 2 Block=512x512 Type=Float32, ColorInterp=Undefined\n Min=0.630 Max=334.889 \n Minimum=0.630, Maximum=334.889, Mean=10.525, StdDev=10.752\n NoData Value=-3.4e+38\n Overviews: 1500x1500, 750x750, 375x375\n Metadata:\n STATISTICS_MAXIMUM=334.88861093713\n STATISTICS_MEAN=10.524834878905\n STATISTICS_MINIMUM=0.62954892025643\n STATISTICS_STDDEV=10.751815070336\nBand 3 Block=512x512 Type=Float32, ColorInterp=Undefined\n Min=3.409 Max=178.328 \n Minimum=3.409, Maximum=178.328, Mean=41.354, StdDev=31.934\n NoData Value=-3.4e+38\n Overviews: 1500x1500, 750x750, 375x375\n Metadata:\n STATISTICS_MAXIMUM=178.32760325572\n STATISTICS_MEAN=41.353653830476\n STATISTICS_MINIMUM=3.408856940596\n STATISTICS_STDDEV=31.934002621158\nBand 4 Block=512x512 Type=Float32, ColorInterp=Undefined\n Min=6.503 Max=850.186 \n Minimum=6.503, Maximum=850.186, Mean=72.227, StdDev=52.055\n NoData Value=-3.4e+38\n Overviews: 1500x1500, 750x750, 375x375\n Metadata:\n STATISTICS_MAXIMUM=850.18554567087\n STATISTICS_MEAN=72.227219607842\n STATISTICS_MINIMUM=6.5033239743444\n STATISTICS_STDDEV=52.055061765112\n'

Vector

For this example, we’ll access a geopackage from a shared bucket query using the sf package. Similar to above, we’ll attach /vsis3/ to our path.

[16]:
vector_listing <- s3$list_objects_v2(Bucket = bucket, Prefix = "shared/smk0033/CONUSbiohex2020/")
vector_key <- sapply(vector_listing$Contents, function(vector_object) vector_object$Key)
[17]:
vector_path <- paste("/vsis3", bucket, vector_key[9], sep = "/")
print(vector_path)
[1] "/vsis3/maap-ops-workspace/shared/smk0033/CONUSbiohex2020/biohex.gpkg"
[18]:
vector <- st_read(vector_path)

# limit the printout to the first few rows
head(vector)
Reading layer `CONUSbiohex2020' from data source
  `/vsis3/maap-ops-workspace/shared/smk0033/CONUSbiohex2020/biohex.gpkg'
  using driver `GPKG'
Simple feature collection with 12591 features and 26 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -125.0093 ymin: 24.3193 xmax: -66.6917 ymax: 49.50757
Geodetic CRS:  Unknown datum based upon the Clarke 1866 ellipsoid
Registered S3 method overwritten by 'geojsonsf':
  method        from
  print.geojson geojson

A sf: 6 × 27
USHEXES_IDEMAP_HEXPROP_FORESSE_PROP_FOCRM_LIVESE_CRM_LIVCRM_STND_DSE_CRM_STNCRM_LIVE_DSE_CRM_L_1ShapeSE_JENK_LIJENK_STND_SE_JENK_STJENK_LIVE_SE_JENK__1EST_SAMPLESAMPLED_PLNON_SAMPLEAVG_INVYRShape
<int><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><MULTIPOLYGON [°]>
1168016800.9668349 3.24765976.7292114.810822.091053468.1083478.8202715.38130MULTIPOLYGON (((-69.33725 4...17.28790723.53024459.05075127.7172310.5834714242.787 602017.3MULTIPOLYGON (((-69.33725 4...
2168116810.9839139 1.12359172.7511910.498961.870613025.1864274.6218110.49655MULTIPOLYGON (((-69.1548 47... 9.390085 9.42236218.23495117.19076 9.2327547158.8901902017.1MULTIPOLYGON (((-69.1548 47...
3156815680.854100512.53903488.5270420.416720.703146658.6494689.2301820.33304MULTIPOLYGON (((-69.1548 47...20.126408 2.64305645.61095109.8392819.8584421226.970 902016.6MULTIPOLYGON (((-69.1548 47...
4145614560.543536322.59869952.0524440.713393.783766137.6652455.8362139.08006MULTIPOLYGON (((-68.78615 4...37.53265913.85836329.37956 81.4403735.2883623836.8501002017.4MULTIPOLYGON (((-68.78615 4...
5134513450.520229223.21019942.1795529.260780.340500950.4988842.5200529.33694MULTIPOLYGON (((-68.41737 4...27.366023 2.74468141.86418 59.3460427.7875437744.6201602016.9MULTIPOLYGON (((-68.41737 4...
6123512350.295306573.40429415.9912073.404290.0000000 0.0000015.9912073.40429MULTIPOLYGON (((-68.04847 4...73.404294 1.09807173.40429 20.0852573.40429 4576.253 202017.0MULTIPOLYGON (((-68.04847 4...

CSV (Spatial)

For this example, we’ll access a CSV file with spatial data from our MAAP STAC query. We’ll use the “item” variable from the STAC query, and then use sf to open the file.

[19]:
item
's3://nasa-maap-data-store/file-staging/nasa-map/icesat2-boreal/boreal_agb_202302151676439579_1326_train_data.csv'

Since we have a full S3 URL, let’s replace s3:// with /vsis/ using the sub function. We’ll also set names for the coordinate fields - see the GDAL Comma Separated Value (.csv) driver page for more information.

[20]:
head(st_read(sub("s3://", "/vsis3/", item), options = c("X_POSSIBLE_NAMES=lon", "Y_POSSIBLE_NAMES=lat")))
options:        X_POSSIBLE_NAMES=lon Y_POSSIBLE_NAMES=lat
Reading layer `boreal_agb_202302151676439579_1326_train_data' from data source
  `/vsis3/nasa-maap-data-store/file-staging/nasa-map/icesat2-boreal/boreal_agb_202302151676439579_1326_train_data.csv'
  using driver `CSV'
Simple feature collection with 8773 features and 4 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -178.5851 ymin: 36.25292 xmax: 178.2856 ymax: 67.56312
CRS:           NA
A sf: 6 × 5
lonlatAGBSEgeometry
<dbl><dbl><chr><chr><POINT>
1-76.3015551.0890713.20318771059180.00120325130936702POINT (-76.30155 51.08907)
2-79.0118350.972453.883445323546230.00107527195707417POINT (-79.01183 50.97245)
3-76.3973150.458324.3007091919769 0.00107527195707417POINT (-76.39731 50.45832)
4-76.3084450.4426843.30277323326380.00120325130936702POINT (-76.30844 50.44268)
5-77.4564552.031462.341350313267330.00107527195707417POINT (-77.45645 52.03146)
6-77.6891950.5360439.78933073102480.00120325130936702POINT (-77.68919 50.53604)

CSV (non-spatial)

For this example, we’ll access a CSV file from our shared bucket.

[21]:
csv_listing <- s3$list_objects_v2(Bucket = bucket, Prefix = "shared/smk0033/csv_ex/")
csv_keys <- sapply(csv_listing$Contents, function(csv_object) csv_object$Key)

# choose an arbitrary key
csv_key <- csv_keys[4]
csv_key
'shared/smk0033/csv_ex/country_estimates_gedi_l4b_v002.csv'

Since this CSV does not have any spatial data, we’ll download the file locally and then read it. While we are able to directly access a non-spatial CSV file, it is being downloaded and read for simplicity.

Before downloading, let’s create a new directory to put our file.

[ ]:
dir.create("./data")

Now we can download our data and open it.

[23]:
# create file name for download
filename <- sub(".*/", "", csv_key)
filename
'country_estimates_gedi_l4b_v002.csv'
[24]:
s3$download_file(Bucket = bucket, Key = csv_key, Filename = paste("./data", filename, sep = "/"))
[25]:
# open data
data <- read.csv(paste("./data", filename, sep = "/"))
head(data)
A data.frame: 6 × 11
CountryISO3Percent_ForestFAO_Forested_AGBDFAO_Forested_AGBD.1GEDI_L4B_Total_AGBDGEDI_L4B_Total_AGBD.1GEDI_L4B_AGBD_SE_PercentFAO_AGBGEDI_L4B_AGBGEDI_L4B_AGB_SE
<chr><chr><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
1Aruba ABW 2.3-9999.0-9999.0 2.10.523.6-9.999e+033.554221e-058.388068e-06
2AfghanistanAFG 1.9-9999.0-9999.024.71.3 5.4-9.999e+031.583907e+008.486180e-02
3Angola AGO53.4 30.3 16.234.60.6 1.9 2.020e+004.312326e+008.028431e-02
4Anguilla AIA61.1 210.0 128.3 4.41.022.5 1.160e-033.543690e-057.973480e-06
5Albania ALB28.8-9999.0-9999.056.91.4 2.5-9.999e+031.611579e-014.025675e-03
6Andorra AND34.0 154.0 52.474.34.7 6.3 2.460e-033.360226e-032.118110e-04