{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [],
   "source": [
    "import geopandas as gpd\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import requests, zipfile, io, os, shutil, geobuf, json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [],
   "source": [
    "zip_file_url='http://www.istat.it/storage/cartografia/confini_amministrativi/generalizzati/Limiti01012018_g.zip'\n",
    "maindir='Limiti01012018_g' \n",
    "r = requests.get(zip_file_url)\n",
    "z = zipfile.ZipFile(io.BytesIO(r.content))\n",
    "z.extractall()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [],
   "source": [
    "# regioni\n",
    "dirRegion = getDir(dirs,'reg')\n",
    "regions = os.listdir(os.path.join(maindir,dirRegion))\n",
    "\n",
    "shp_region = None\n",
    "for region in regions:\n",
    "    if region.rfind(\"shp\") > -1:\n",
    "        shp_region = region\n",
    "        break\n",
    "regioni = gpd.read_file(os.path.join(maindir,dirRegion,shp_region))\n",
    "regioni = regioni[[\"COD_REG\",\"DEN_REG\",\"geometry\"]]\n",
    "regioni = regioni.rename(index=str, columns={'COD_REG': 'id', 'DEN_REG': 'name','geometry':'geometry'})\n",
    "regioni = regioni.to_crs({'init': 'epsg:4326'})\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [],
   "source": [
    "def togeobuf(infile):\n",
    "    out = infile.replace('.json','.pbf')\n",
    "    outfile = open(out,'wb')\n",
    "    json_data=open(infile).read()\n",
    "    data = json.loads(json_data)\n",
    "    pbf = geobuf.encode(data)\n",
    "    outfile.write(pbf)\n",
    "    \n",
    "dirs = os.listdir(maindir)\n",
    "heads = ['rip','reg','prov','com']\n",
    "def getDir(dirs,head):\n",
    "    rname = None\n",
    "    for name in dirs:\n",
    "        if name.lower().startswith(head):\n",
    "            rname = name\n",
    "            break\n",
    "    return rname"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [],
   "source": [
    "# province\n",
    "dirProvince = getDir(dirs,'prov')\n",
    "provinces = os.listdir(os.path.join(maindir,dirProvince))\n",
    "\n",
    "shp_province = None\n",
    "for province in provinces:\n",
    "    if province.rfind(\"shp\") > -1:\n",
    "        shp_province = province\n",
    "        break\n",
    "province = gpd.read_file(os.path.join(maindir,dirProvince,shp_province))\n",
    "province.loc[(province['DEN_PROV'] == \"-\") & (province['DEN_PCM'] != '-'), ['DEN_PROV']] = province['DEN_PCM']\n",
    "province = province[[\"COD_REG\",\"COD_PROV\",\"DEN_PROV\",\"SIGLA\",\"geometry\"]]\n",
    "province = province.rename(index=str, columns={'COD_PROV':'id','COD_REG': 'id_reg', 'DEN_REG': 'name_region','DEN_PROV':'name','SIGLA':'sigla','geometry':'geometry'})\n",
    "province = province.to_crs({'init': 'epsg:4326'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [],
   "source": [
    "# comuni\n",
    "dirComuni = getDir(dirs,'com')\n",
    "comuni = os.listdir(os.path.join(maindir,dirComuni))\n",
    "shp_comuni = None\n",
    "for comune in comuni:\n",
    "    if comune.rfind(\"shp\") > -1:\n",
    "        shp_comuni = comune\n",
    "        break\n",
    "comuni = gpd.read_file(os.path.join(maindir,dirComuni,shp_comuni))\n",
    "comuni = comuni[[\"COD_REG\",\"COD_PROV\",\"PRO_COM\",\"COMUNE\",\"geometry\"]]\n",
    "comuni = comuni.rename(index=str, columns={'COD_PROV':'id_prov','COD_REG': 'id_reg', 'PRO_COM': 'id','COMUNE':'name','geometry':'geometry'})\n",
    "comuni = comuni.to_crs({'init': 'epsg:4326'})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [],
   "source": [
    "# crea directory data\n",
    "if os.path.exists('geojson'):\n",
    "    shutil.rmtree(\"geojson\")\n",
    "os.makedirs(\"geojson\")\n",
    "filename=\"regions.json\"\n",
    "regioni.to_file(os.path.join(\"geojson\",filename), driver=\"GeoJSON\")\n",
    "togeobuf(os.path.join(\"geojson\",filename))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "geojson/1/provinces.json\n",
      "geojson/1/1/muncipalities.json\n",
      "geojson/1/2/muncipalities.json\n",
      "geojson/1/3/muncipalities.json\n",
      "geojson/1/4/muncipalities.json\n",
      "geojson/1/5/muncipalities.json\n",
      "geojson/1/6/muncipalities.json\n",
      "geojson/1/96/muncipalities.json\n",
      "geojson/1/103/muncipalities.json\n",
      "geojson/2/provinces.json\n",
      "geojson/2/7/muncipalities.json\n",
      "geojson/3/provinces.json\n",
      "geojson/3/12/muncipalities.json\n",
      "geojson/3/13/muncipalities.json\n",
      "geojson/3/14/muncipalities.json\n",
      "geojson/3/15/muncipalities.json\n",
      "geojson/3/16/muncipalities.json\n",
      "geojson/3/17/muncipalities.json\n",
      "geojson/3/18/muncipalities.json\n",
      "geojson/3/19/muncipalities.json\n",
      "geojson/3/20/muncipalities.json\n",
      "geojson/3/97/muncipalities.json\n",
      "geojson/3/98/muncipalities.json\n",
      "geojson/3/108/muncipalities.json\n",
      "geojson/4/provinces.json\n",
      "geojson/4/21/muncipalities.json\n",
      "geojson/4/22/muncipalities.json\n",
      "geojson/5/provinces.json\n",
      "geojson/5/23/muncipalities.json\n",
      "geojson/5/24/muncipalities.json\n",
      "geojson/5/25/muncipalities.json\n",
      "geojson/5/26/muncipalities.json\n",
      "geojson/5/27/muncipalities.json\n",
      "geojson/5/28/muncipalities.json\n",
      "geojson/5/29/muncipalities.json\n",
      "geojson/6/provinces.json\n",
      "geojson/6/30/muncipalities.json\n",
      "geojson/6/31/muncipalities.json\n",
      "geojson/6/32/muncipalities.json\n",
      "geojson/6/93/muncipalities.json\n",
      "geojson/7/provinces.json\n",
      "geojson/7/8/muncipalities.json\n",
      "geojson/7/9/muncipalities.json\n",
      "geojson/7/10/muncipalities.json\n",
      "geojson/7/11/muncipalities.json\n",
      "geojson/8/provinces.json\n",
      "geojson/8/33/muncipalities.json\n",
      "geojson/8/34/muncipalities.json\n",
      "geojson/8/35/muncipalities.json\n",
      "geojson/8/36/muncipalities.json\n",
      "geojson/8/37/muncipalities.json\n",
      "geojson/8/38/muncipalities.json\n",
      "geojson/8/39/muncipalities.json\n",
      "geojson/8/40/muncipalities.json\n",
      "geojson/8/99/muncipalities.json\n",
      "geojson/9/provinces.json\n",
      "geojson/9/45/muncipalities.json\n",
      "geojson/9/46/muncipalities.json\n",
      "geojson/9/47/muncipalities.json\n",
      "geojson/9/48/muncipalities.json\n",
      "geojson/9/49/muncipalities.json\n",
      "geojson/9/50/muncipalities.json\n",
      "geojson/9/51/muncipalities.json\n",
      "geojson/9/52/muncipalities.json\n",
      "geojson/9/53/muncipalities.json\n",
      "geojson/9/100/muncipalities.json\n",
      "geojson/10/provinces.json\n",
      "geojson/10/54/muncipalities.json\n",
      "geojson/10/55/muncipalities.json\n",
      "geojson/11/provinces.json\n",
      "geojson/11/41/muncipalities.json\n",
      "geojson/11/42/muncipalities.json\n",
      "geojson/11/43/muncipalities.json\n",
      "geojson/11/44/muncipalities.json\n",
      "geojson/11/109/muncipalities.json\n",
      "geojson/12/provinces.json\n",
      "geojson/12/56/muncipalities.json\n",
      "geojson/12/57/muncipalities.json\n",
      "geojson/12/58/muncipalities.json\n",
      "geojson/12/59/muncipalities.json\n",
      "geojson/12/60/muncipalities.json\n",
      "geojson/13/provinces.json\n",
      "geojson/13/66/muncipalities.json\n",
      "geojson/13/67/muncipalities.json\n",
      "geojson/13/68/muncipalities.json\n",
      "geojson/13/69/muncipalities.json\n",
      "geojson/14/provinces.json\n",
      "geojson/14/70/muncipalities.json\n",
      "geojson/14/94/muncipalities.json\n",
      "geojson/15/provinces.json\n",
      "geojson/15/61/muncipalities.json\n",
      "geojson/15/62/muncipalities.json\n",
      "geojson/15/63/muncipalities.json\n",
      "geojson/15/64/muncipalities.json\n",
      "geojson/15/65/muncipalities.json\n",
      "geojson/16/provinces.json\n",
      "geojson/16/71/muncipalities.json\n",
      "geojson/16/72/muncipalities.json\n",
      "geojson/16/73/muncipalities.json\n",
      "geojson/16/74/muncipalities.json\n",
      "geojson/16/75/muncipalities.json\n",
      "geojson/16/110/muncipalities.json\n",
      "geojson/17/provinces.json\n",
      "geojson/17/76/muncipalities.json\n",
      "geojson/17/77/muncipalities.json\n",
      "geojson/18/provinces.json\n",
      "geojson/18/78/muncipalities.json\n",
      "geojson/18/79/muncipalities.json\n",
      "geojson/18/80/muncipalities.json\n",
      "geojson/18/101/muncipalities.json\n",
      "geojson/18/102/muncipalities.json\n",
      "geojson/19/provinces.json\n",
      "geojson/19/81/muncipalities.json\n",
      "geojson/19/82/muncipalities.json\n",
      "geojson/19/83/muncipalities.json\n",
      "geojson/19/84/muncipalities.json\n",
      "geojson/19/85/muncipalities.json\n",
      "geojson/19/86/muncipalities.json\n",
      "geojson/19/87/muncipalities.json\n",
      "geojson/19/88/muncipalities.json\n",
      "geojson/19/89/muncipalities.json\n",
      "geojson/20/provinces.json\n",
      "geojson/20/90/muncipalities.json\n",
      "geojson/20/91/muncipalities.json\n",
      "geojson/20/92/muncipalities.json\n",
      "geojson/20/95/muncipalities.json\n",
      "geojson/20/111/muncipalities.json\n"
     ]
    }
   ],
   "source": [
    "# crea province\n",
    "for id_reg in regioni.id:\n",
    "    regprov = os.path.join(\"geojson\",str(id_reg))\n",
    "    os.makedirs(regprov)\n",
    "    provincia = province[province.id_reg == id_reg]\n",
    "    fileprovinces = os.path.join(regprov,\"provinces.json\")\n",
    "    print(fileprovinces)\n",
    "    provincia.to_file(fileprovinces, driver=\"GeoJSON\")\n",
    "    togeobuf(fileprovinces)\n",
    "    for id_prov in provincia.id:\n",
    "        provcom = os.path.join(\"geojson\",str(id_reg),str(id_prov))\n",
    "        filemuncipalities = os.path.join(provcom,\"muncipalities.json\")\n",
    "        print(filemuncipalities)\n",
    "        os.makedirs(provcom)\n",
    "        comune = comuni[(comuni.id_prov == id_prov) & (comuni.id_reg == id_reg)]\n",
    "        comune.to_file(filemuncipalities, driver=\"GeoJSON\")\n",
    "        togeobuf(filemuncipalities)\n",
    "shutil.rmtree(maindir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
