import pandas as pd
from simpledbf import Dbf5
import geopandas as gpd
import requests
import zipfile
import io
import os
%matplotlib inline

PROVINCIAS_URL = "http://www.ign.gob.ar/descargas/geodatos/SHAPES/ign_provincia.zip"
DEPARTAMENTOS_URL = "http://www.ign.gob.ar/descargas/geodatos/SHAPES/ign_departamento.zip"
MUNICIPIOS_URL = "http://www.ign.gob.ar/descargas/geodatos/SHAPES/ign_municipio.zip"

PROVINCIAS_OUTPUT = "provincias"
DEPARTAMENTOS_OUTPUT = "departamentos"
MUNICIPIOS_OUTPUT = "municipios"

def download_and_unzip(url):
    print('Downloading shapefile...')
    r = requests.get(url)
    z = zipfile.ZipFile(io.BytesIO(r.content))
    print("Done")
    
    z.extractall(path=".") # extract to folder
    filenames = [y for y in sorted(z.namelist()) for ending in ['dbf', 'prj', 'shp', 'shx'] if y.endswith(ending)] 
    print(filenames)

"""
Explanation: Correcciones de Unidades Territoriales de IGN
End of explanation
"""


download_and_unzip(PROVINCIAS_URL)

provincias = gpd.read_file("Provincia")
provincias.head()

provincias.to_file(os.path.join(PROVINCIAS_OUTPUT, PROVINCIAS_OUTPUT) + ".shp")

"""
Explanation: Provincias
End of explanation
"""


download_and_unzip(DEPARTAMENTOS_URL)

departamentos = gpd.read_file("Departamento")
departamentos.head()

# se corrige el id de departamentos, sacando el dígito inicial
departamentos["IN1"] = departamentos["IN1"].str[1:]

departamentos.to_file(os.path.join(DEPARTAMENTOS_OUTPUT, DEPARTAMENTOS_OUTPUT) + ".shp")

"""
Explanation: Departamentos
End of explanation
"""


download_and_unzip(MUNICIPIOS_URL)

municipios = gpd.read_file("Municipio")
municipios.head()

"""
Explanation: Municipios
End of explanation
"""


print("Existen {} municipios con id duplicado, tienen geometrías POLYGON separadas".format(
    len(municipios) - len(municipios.drop_duplicates("IN1"))
))

len(municipios), len(municipios.drop_duplicates("IN1"))

"""
Explanation: Los polígonos de algunos municipios están separados. Se juntan para solucionar la duplicidad de municipios.
End of explanation
"""


municipios[municipios["IN1"] == "380224"]

municipios[municipios["IN1"] == "380224"].plot()

"""
Explanation: Ejemplo: municipio de San Pedro de Jujuy tiene su geometría dividida en 2 polígonos.
End of explanation
"""


municipios_dissolved = municipios.dissolve(by='IN1').reset_index()

municipios_dissolved[municipios_dissolved["IN1"] == "380224"]

municipios_dissolved[municipios_dissolved["IN1"] == "380224"].plot()

municipios_dissolved.to_file(os.path.join(MUNICIPIOS_OUTPUT, MUNICIPIOS_OUTPUT) + ".shp")

"""
Explanation: Se aplica el método "dissolve" para unir los polígonos de los municipios, generando una sola fila por id sin afectar la forma de los polígonos.
End of explanation
"""


