{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Dask-GeoPandas\n", "\n", "**Attribution**: *This notebook is a revised version of the [Basic Introduction](https://dask-geopandas.readthedocs.io/en/stable/guide/basic-intro.html) notebook from Dask-GeoPandas documentation.* \n", "\n", "This notebook illustrates the basic API of Dask-GeoPandas and provides a basic timing comparison between operations on `geopandas.GeoDataFrame` and parallel `dask_geopandas.GeoDataFrame`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can access this notebook (in a Docker image) on this [GitHub repo](https://github.com/HamedAlemo/vector-data-tutorial)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [] }, "outputs": [], "source": [ "import os\n", "import requests\n", "import numpy as np\n", "import geopandas as gpd\n", "import dask_geopandas as dg\n", "import cartopy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Download a Sample Dataset using Cartopy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are going to use the [Natural Earth dataset](https://www.naturalearthdata.com/). This dataset has several vector files for different physical and cultural boundaries at different spatial scales. We will use the [110m Admin 0 Countries dataset](https://www.naturalearthdata.com/downloads/110m-cultural-vectors/110m-admin-0-countries/). \n", "\n", "You can use `cartopy` to download this dataset locally. Note that the file will be downloaded to a local cache folder. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "admin_shp = cartopy.io.shapereader.natural_earth(\n", " resolution='110m',\n", " category='cultural',\n", " name='admin_0_countries'\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating a Dask-GeoPandas `GeoDataFrame`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are many ways to create a `dask_geopandas.GeoDataFrame`. If your initial data fits in memory, you can create it from a `geopandas.GeoDataFrame` using the `from_geopandas` function:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "ERROR 1: PROJ: proj_create_from_database: Open of /opt/conda/envs/vector_tutorial/share/proj failed\n" ] } ], "source": [ "gdf = gpd.read_file(admin_shp)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", " | featurecla | \n", "scalerank | \n", "LABELRANK | \n", "SOVEREIGNT | \n", "SOV_A3 | \n", "ADM0_DIF | \n", "LEVEL | \n", "TYPE | \n", "TLC | \n", "ADMIN | \n", "... | \n", "FCLASS_TR | \n", "FCLASS_ID | \n", "FCLASS_PL | \n", "FCLASS_GR | \n", "FCLASS_IT | \n", "FCLASS_NL | \n", "FCLASS_SE | \n", "FCLASS_BD | \n", "FCLASS_UA | \n", "geometry | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | \n", "Admin-0 country | \n", "1 | \n", "6 | \n", "Fiji | \n", "FJI | \n", "0 | \n", "2 | \n", "Sovereign country | \n", "1 | \n", "Fiji | \n", "... | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "MULTIPOLYGON (((180 -16.06713, 180 -16.55522, ... | \n", "
1 | \n", "Admin-0 country | \n", "1 | \n", "3 | \n", "United Republic of Tanzania | \n", "TZA | \n", "0 | \n", "2 | \n", "Sovereign country | \n", "1 | \n", "United Republic of Tanzania | \n", "... | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "POLYGON ((33.90371 -0.95, 34.07262 -1.05982, 3... | \n", "
2 | \n", "Admin-0 country | \n", "1 | \n", "7 | \n", "Western Sahara | \n", "SAH | \n", "0 | \n", "2 | \n", "Indeterminate | \n", "1 | \n", "Western Sahara | \n", "... | \n", "Unrecognized | \n", "Unrecognized | \n", "Unrecognized | \n", "None | \n", "None | \n", "Unrecognized | \n", "None | \n", "None | \n", "None | \n", "POLYGON ((-8.66559 27.65643, -8.66512 27.58948... | \n", "
3 | \n", "Admin-0 country | \n", "1 | \n", "2 | \n", "Canada | \n", "CAN | \n", "0 | \n", "2 | \n", "Sovereign country | \n", "1 | \n", "Canada | \n", "... | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "MULTIPOLYGON (((-122.84 49, -122.97421 49.0025... | \n", "
4 | \n", "Admin-0 country | \n", "1 | \n", "2 | \n", "United States of America | \n", "US1 | \n", "1 | \n", "2 | \n", "Country | \n", "1 | \n", "United States of America | \n", "... | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "None | \n", "MULTIPOLYGON (((-122.84 49, -120 49, -117.0312... | \n", "
5 rows × 169 columns
\n", "\n", " | featurecla | \n", "scalerank | \n", "LABELRANK | \n", "SOVEREIGNT | \n", "SOV_A3 | \n", "ADM0_DIF | \n", "LEVEL | \n", "TYPE | \n", "TLC | \n", "ADMIN | \n", "ADM0_A3 | \n", "GEOU_DIF | \n", "GEOUNIT | \n", "GU_A3 | \n", "SU_DIF | \n", "SUBUNIT | \n", "SU_A3 | \n", "BRK_DIFF | \n", "NAME | \n", "NAME_LONG | \n", "BRK_A3 | \n", "BRK_NAME | \n", "BRK_GROUP | \n", "ABBREV | \n", "POSTAL | \n", "FORMAL_EN | \n", "FORMAL_FR | \n", "NAME_CIAWF | \n", "NOTE_ADM0 | \n", "NOTE_BRK | \n", "NAME_SORT | \n", "NAME_ALT | \n", "MAPCOLOR7 | \n", "MAPCOLOR8 | \n", "MAPCOLOR9 | \n", "MAPCOLOR13 | \n", "POP_EST | \n", "POP_RANK | \n", "POP_YEAR | \n", "GDP_MD | \n", "GDP_YEAR | \n", "ECONOMY | \n", "INCOME_GRP | \n", "FIPS_10 | \n", "ISO_A2 | \n", "ISO_A2_EH | \n", "ISO_A3 | \n", "ISO_A3_EH | \n", "ISO_N3 | \n", "ISO_N3_EH | \n", "UN_A3 | \n", "WB_A2 | \n", "WB_A3 | \n", "WOE_ID | \n", "WOE_ID_EH | \n", "WOE_NOTE | \n", "ADM0_ISO | \n", "ADM0_DIFF | \n", "ADM0_TLC | \n", "ADM0_A3_US | \n", "ADM0_A3_FR | \n", "ADM0_A3_RU | \n", "ADM0_A3_ES | \n", "ADM0_A3_CN | \n", "ADM0_A3_TW | \n", "ADM0_A3_IN | \n", "ADM0_A3_NP | \n", "ADM0_A3_PK | \n", "ADM0_A3_DE | \n", "ADM0_A3_GB | \n", "ADM0_A3_BR | \n", "ADM0_A3_IL | \n", "ADM0_A3_PS | \n", "ADM0_A3_SA | \n", "ADM0_A3_EG | \n", "ADM0_A3_MA | \n", "ADM0_A3_PT | \n", "ADM0_A3_AR | \n", "ADM0_A3_JP | \n", "ADM0_A3_KO | \n", "ADM0_A3_VN | \n", "ADM0_A3_TR | \n", "ADM0_A3_ID | \n", "ADM0_A3_PL | \n", "ADM0_A3_GR | \n", "ADM0_A3_IT | \n", "ADM0_A3_NL | \n", "ADM0_A3_SE | \n", "ADM0_A3_BD | \n", "ADM0_A3_UA | \n", "ADM0_A3_UN | \n", "ADM0_A3_WB | \n", "CONTINENT | \n", "REGION_UN | \n", "SUBREGION | \n", "REGION_WB | \n", "NAME_LEN | \n", "LONG_LEN | \n", "ABBREV_LEN | \n", "TINY | \n", "HOMEPART | \n", "MIN_ZOOM | \n", "MIN_LABEL | \n", "MAX_LABEL | \n", "LABEL_X | \n", "LABEL_Y | \n", "NE_ID | \n", "WIKIDATAID | \n", "NAME_AR | \n", "NAME_BN | \n", "NAME_DE | \n", "NAME_EN | \n", "NAME_ES | \n", "NAME_FA | \n", "NAME_FR | \n", "NAME_EL | \n", "NAME_HE | \n", "NAME_HI | \n", "NAME_HU | \n", "NAME_ID | \n", "NAME_IT | \n", "NAME_JA | \n", "NAME_KO | \n", "NAME_NL | \n", "NAME_PL | \n", "NAME_PT | \n", "NAME_RU | \n", "NAME_SV | \n", "NAME_TR | \n", "NAME_UK | \n", "NAME_UR | \n", "NAME_VI | \n", "NAME_ZH | \n", "NAME_ZHT | \n", "FCLASS_ISO | \n", "TLC_DIFF | \n", "FCLASS_TLC | \n", "FCLASS_US | \n", "FCLASS_FR | \n", "FCLASS_RU | \n", "FCLASS_ES | \n", "FCLASS_CN | \n", "FCLASS_TW | \n", "FCLASS_IN | \n", "FCLASS_NP | \n", "FCLASS_PK | \n", "FCLASS_DE | \n", "FCLASS_GB | \n", "FCLASS_BR | \n", "FCLASS_IL | \n", "FCLASS_PS | \n", "FCLASS_SA | \n", "FCLASS_EG | \n", "FCLASS_MA | \n", "FCLASS_PT | \n", "FCLASS_AR | \n", "FCLASS_JP | \n", "FCLASS_KO | \n", "FCLASS_VN | \n", "FCLASS_TR | \n", "FCLASS_ID | \n", "FCLASS_PL | \n", "FCLASS_GR | \n", "FCLASS_IT | \n", "FCLASS_NL | \n", "FCLASS_SE | \n", "FCLASS_BD | \n", "FCLASS_UA | \n", "geometry | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
npartitions=4 | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
0 | \n", "string | \n", "int32 | \n", "int32 | \n", "string | \n", "string | \n", "int32 | \n", "int32 | \n", "string | \n", "string | \n", "string | \n", "string | \n", "int32 | \n", "string | \n", "string | \n", "int32 | \n", "string | \n", "string | \n", "int32 | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "int32 | \n", "int32 | \n", "int32 | \n", "int32 | \n", "float64 | \n", "int32 | \n", "int32 | \n", "int32 | \n", "int32 | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "int32 | \n", "int32 | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "int32 | \n", "int32 | \n", "string | \n", "string | \n", "string | \n", "string | \n", "int32 | \n", "int32 | \n", "int32 | \n", "int32 | \n", "int32 | \n", "float64 | \n", "float64 | \n", "float64 | \n", "float64 | \n", "float64 | \n", "int64 | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "string | \n", "geometry | \n", "
45 | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
89 | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
133 | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
176 | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "