{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sewershed Network Examples\n",
    "\n",
    "In this Jupyter notebook for Python, we render examples of sewer networks based on a sewer lines in two different sewersheds.\n",
    "\n",
    "## Data requirements\n",
    "\n",
    "- Sewer mains\n",
    "  * Sewer gravity mains and possibly force mains.\n",
    "- WWTP (Wastewater treatment plants) as points"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Software setup \n",
    "\n",
    "We will use a couple of standard Python packages, GRASS GIS, and ImageMagick (specifically, convert).\n",
    "\n",
    "The setup here assumes Linux. Instructions for Windows are available at [GRASS GIS Jupyter notebooks wiki page](https://grasswiki.osgeo.org/wiki/GRASS_GIS_Jupyter_notebooks#Running_a_Jupyter_notebook_locally)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import Python standard library and IPython packages we need.\n",
    "import os\n",
    "import subprocess\n",
    "import sys\n",
    "from pathlib import Path\n",
    "\n",
    "# Ask GRASS GIS where its Python packages are.\n",
    "sys.path.append(\n",
    "    subprocess.check_output([\"grass\", \"--config\", \"python_path\"], text=True).strip()\n",
    ")\n",
    "\n",
    "# Import the GRASS GIS packages we need.\n",
    "import grass.script as gs\n",
    "import grass.jupyter as gj"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Get the data ready\n",
    "\n",
    "This notebooks needs two sets of gravity mains (or all mains) as vector lines and set of WWTP as points with an attribute specifying owner and facility name or at least one of them. The gravity mains file should be in directory `data/sewers_{city name}` and should be named `gravity_lines.shp` (any format or filename will work). The WWTP points need to be in one of these directories. This can be modified as needed in the code."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "grass_project = \"data/network_examples\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To compute the data, we will use a GRASS project (aka location)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!grass -e -c $data_directory $grass_project"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "session = gj.init(grass_project)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "gs.run_command(\n",
    "    \"v.import\", input=\"data/sewers_Raleigh/gravity_lines.shp\", output=\"raleigh\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "gs.run_command(\n",
    "    \"v.import\",\n",
    "    input=\"data/sewers_Greenville/gravity_lines.shp\",\n",
    "    output=\"greenville\",\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "point_file = \"wwtp_points\"  # Filename without file extension\n",
    "wwtp_vector = \"wwtp\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "gs.run_command(\n",
    "    \"v.import\", input=\"data/sewers_Greenville\", layer=point_file, output=wwtp_vector\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Render network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "gs.run_command(\"g.region\", vector=\"raleigh\", grow=\"5000\")\n",
    "sewer_map = gj.Map(width=750, height=750, use_region=True)\n",
    "sewer_map.d_background(color=\"white\")\n",
    "sewer_map.d_vect(map=\"raleigh\", legend_label=\"Gravity mains\", color=\"#0067CC\")\n",
    "sewer_map.d_vect(\n",
    "    map=wwtp_vector,\n",
    "    legend_label=\"WWTP\",\n",
    "    color=\"#865A0C\",\n",
    "    fill_color=\"#FCA636\",\n",
    "    size=10,\n",
    "    icon=\"basic/circle\",\n",
    "    where=\"OWNER = 'City of Raleigh'\",\n",
    "    attribute_column=\"FACILITY\",\n",
    "    xref=\"right\",\n",
    "    yref=\"top\",\n",
    "    label_color=\"black\",\n",
    "    label_size=12,\n",
    "    label_bgcolor=\"white\",\n",
    "    flags=\"s\",\n",
    ")\n",
    "sewer_map.d_vect(\n",
    "    map=wwtp_vector,\n",
    "    legend_label=\"WWTP\",\n",
    "    color=\"#865A0C\",\n",
    "    fill_color=\"#FCA636\",\n",
    "    size=10,\n",
    "    icon=\"basic/circle\",\n",
    "    where=\"OWNER = 'City of Raleigh'\",\n",
    ")\n",
    "sewer_map.d_text(text=\"(a)\", color=\"#111111\", size=\"6\", at=(0, 95))\n",
    "sewer_map.d_legend_vect(flags=\"b\", at=(75, 19), title=\"Raleigh\")\n",
    "sewer_map.d_barscale(flags=\"n\", at=(65, 7))\n",
    "sewer_map.save(Path(\".\") / \"raleigh_mains.png\")\n",
    "sewer_map.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "gs.run_command(\"g.region\", vector=\"greenville\", grow=\"5000\")\n",
    "sewer_map = gj.Map(width=750, height=750, use_region=True)\n",
    "sewer_map.d_background(color=\"white\")\n",
    "sewer_map.d_vect(map=\"greenville\", legend_label=\"Gravity mains\", color=\"#0067CC\")\n",
    "sewer_map.d_vect(\n",
    "    map=wwtp_vector,\n",
    "    legend_label=\"WWTP\",\n",
    "    color=\"#865A0C\",\n",
    "    fill_color=\"#FCA636\",\n",
    "    size=10,\n",
    "    icon=\"basic/circle\",\n",
    "    where=\"OWNER = 'Greenville Utilities Commission'\",\n",
    "    attribute_column=\"FACILITY\",\n",
    "    xref=\"left\",\n",
    "    yref=\"top\",\n",
    "    label_color=\"black\",\n",
    "    label_size=12,\n",
    ")\n",
    "sewer_map.d_text(text=\"(b)\", color=\"#111111\", size=\"5\", at=(0, 89))\n",
    "sewer_map.d_legend_vect(flags=\"b\", at=(75, 19), title=\"Greenville\")\n",
    "sewer_map.d_barscale(flags=\"n\", at=(58, 7))\n",
    "sewer_map.save(Path(\".\") / \"greenville_mains.png\")\n",
    "sewer_map.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!convert raleigh_mains.png greenville_mains.png +append mains_raleigh_greenville.png\n",
    "from IPython.display import Image\n",
    "\n",
    "Image(\"mains_raleigh_greenville.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Render network with diameter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "gs.run_command(\"g.region\", vector=\"greenville\", grow=\"50\")\n",
    "sewer_map = gj.Map(width=750, use_region=True)\n",
    "sewer_map.d_background(color=\"white\")\n",
    "sewer_map.d_vect(\n",
    "    map=\"greenville\",\n",
    "    legend_label=\"Gravity mains (<10in)\",\n",
    "    color=\"#0067CC\",\n",
    "    where=\"Diameter < 10\",\n",
    "    width=1,\n",
    ")\n",
    "sewer_map.d_vect(\n",
    "    map=\"greenville\",\n",
    "    legend_label=\"Gravity mains (<20in)\",\n",
    "    color=\"#00378C\",\n",
    "    where=\"Diameter >= 10 AND Diameter < 20\",\n",
    "    width=2,\n",
    ")\n",
    "sewer_map.d_vect(\n",
    "    map=\"greenville\",\n",
    "    legend_label=\"Gravity mains (>=20in)\",\n",
    "    color=\"#00073C\",\n",
    "    where=\"Diameter >= 20\",\n",
    "    width=3,\n",
    ")\n",
    "sewer_map.d_vect(\n",
    "    map=wwtp_vector,\n",
    "    legend_label=\"WWTP\",\n",
    "    color=\"#865A0C\",\n",
    "    fill_color=\"#FCA636\",\n",
    "    size=10,\n",
    "    icon=\"basic/circle\",\n",
    "    where=\"OWNER = 'Greenville Utilities Commission'\",\n",
    "    attribute_column=\"FACILITY\",\n",
    "    xref=\"left\",\n",
    "    yref=\"top\",\n",
    "    label_color=\"black\",\n",
    "    label_size=12,\n",
    ")\n",
    "sewer_map.d_legend_vect(flags=\"b\", at=(70, 19), title=\"Greenville\")\n",
    "sewer_map.d_barscale(flags=\"n\", at=(40, 7))\n",
    "sewer_map.save(Path(\".\") / \"greenville_mains_diameter.png\")\n",
    "sewer_map.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Render part of sewershed with diameter "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "gs.run_command(\"g.region\", vector=\"greenville\", res=1, n=\"n-50000\", s=\"s+25000\", w=\"w-1000\")\n",
    "sewer_map = gj.Map(width=750, use_region=True)\n",
    "sewer_map.d_background(color=\"white\")\n",
    "sewer_map.d_vect(\n",
    "    map=\"greenville\",\n",
    "    legend_label=\"Gravity mains (<10in)\",\n",
    "    color=\"#0067CC\",\n",
    "    where=\"Diameter < 10\",\n",
    "    width=1,\n",
    ")\n",
    "sewer_map.d_vect(\n",
    "    map=\"greenville\",\n",
    "    legend_label=\"Gravity mains (<20in)\",\n",
    "    color=\"#00378C\",\n",
    "    where=\"Diameter >= 10 AND Diameter < 20\",\n",
    "    width=2,\n",
    ")\n",
    "sewer_map.d_vect(\n",
    "    map=\"greenville\",\n",
    "    legend_label=\"Gravity mains (>=20in)\",\n",
    "    color=\"#00073C\",\n",
    "    where=\"Diameter >= 20\",\n",
    "    width=3,\n",
    ")\n",
    "sewer_map.d_vect(\n",
    "    map=wwtp_vector,\n",
    "    legend_label=\"WWTP\",\n",
    "    color=\"#865A0C\",\n",
    "    fill_color=\"#FCA636\",\n",
    "    size=10,\n",
    "    icon=\"basic/circle\",\n",
    "    where=\"OWNER = 'Greenville Utilities Commission'\",\n",
    "    attribute_column=\"FACILITY\",\n",
    "    xref=\"left\",\n",
    "    yref=\"top\",\n",
    "    label_color=\"black\",\n",
    "    label_size=12,\n",
    ")\n",
    "sewer_map.d_legend_vect(flags=\"b\", at=(70, 25), title=\"Greenville (central part)\")\n",
    "sewer_map.d_barscale(flags=\"n\", at=(65, 95), length=\"5\", units=\"kilometers\")\n",
    "sewer_map.save(Path(\".\") / \"greenville_mains_diameter_central.png\")\n",
    "sewer_map.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}