EJERCICIO 1

In [5]:
!pip install geopandas
Requirement already satisfied: geopandas in /usr/local/lib/python3.11/dist-packages (1.0.1)
Requirement already satisfied: numpy>=1.22 in /usr/local/lib/python3.11/dist-packages (from geopandas) (2.0.2)
Requirement already satisfied: pyogrio>=0.7.2 in /usr/local/lib/python3.11/dist-packages (from geopandas) (0.11.0)
Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from geopandas) (24.2)
Requirement already satisfied: pandas>=1.4.0 in /usr/local/lib/python3.11/dist-packages (from geopandas) (2.2.2)
Requirement already satisfied: pyproj>=3.3.0 in /usr/local/lib/python3.11/dist-packages (from geopandas) (3.7.1)
Requirement already satisfied: shapely>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from geopandas) (2.1.1)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.4.0->geopandas) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.4.0->geopandas) (2025.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.4.0->geopandas) (2025.2)
Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from pyogrio>=0.7.2->geopandas) (2025.6.15)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.8.2->pandas>=1.4.0->geopandas) (1.17.0)
In [6]:
!pip install fiona
Collecting fiona
  Downloading fiona-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (56 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.6/56.6 kB 2.1 MB/s eta 0:00:00
Requirement already satisfied: attrs>=19.2.0 in /usr/local/lib/python3.11/dist-packages (from fiona) (25.3.0)
Requirement already satisfied: certifi in /usr/local/lib/python3.11/dist-packages (from fiona) (2025.6.15)
Requirement already satisfied: click~=8.0 in /usr/local/lib/python3.11/dist-packages (from fiona) (8.2.1)
Collecting click-plugins>=1.0 (from fiona)
  Downloading click_plugins-1.1.1.2-py2.py3-none-any.whl.metadata (6.5 kB)
Collecting cligj>=0.5 (from fiona)
  Downloading cligj-0.7.2-py3-none-any.whl.metadata (5.0 kB)
Downloading fiona-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 17.3/17.3 MB 81.1 MB/s eta 0:00:00
Downloading click_plugins-1.1.1.2-py2.py3-none-any.whl (11 kB)
Downloading cligj-0.7.2-py3-none-any.whl (7.1 kB)
Installing collected packages: cligj, click-plugins, fiona
Successfully installed click-plugins-1.1.1.2 cligj-0.7.2 fiona-1.10.1
In [7]:
import geopandas as gpd
from fiona import listlayers
countries=gpd.read_file("https://github.com/AdriMA3/introgeodf/raw/refs/heads/main/maps/World_Countries/World_Countries.shp")
#ferrovias=gpd.read_file("https://github.com/AdriMA3/introgeodf/raw/refs/heads/main/maps/Red_Ferroviaria/Red_ferroviaria.shp")
In [8]:
chile=countries[countries.COUNTRY=="Chile"]
chile_5361=chile.to_crs(5361)
In [9]:
airports=gpd.read_file("https://github.com/AdriMA3/introgeodf/raw/refs/heads/main/data/chile-airports.csv")
In [10]:
airports=gpd.GeoDataFrame(data=airports.copy(),
                 geometry=gpd.points_from_xy(airports.longitude_deg,
                                             airports.latitude_deg),
                 crs=chile.crs.to_epsg())
airports_5361=airports.to_crs(5361)
In [11]:
import pandas as pd

portsFileLink="https://github.com/CienciaDeDatosEspacial/GeoDataFrame_Analytics/raw/main/data/UpdatedPub150.csv"
infoseaports=pd.read_csv(portsFileLink)

#columns available (so many)
infoseaports.columns.to_list()
Out[11]:
['World Port Index Number',
 'Region Name',
 'Main Port Name',
 'Alternate Port Name',
 'UN/LOCODE',
 'Country Code',
 'World Water Body',
 'IHO S-130 Sea Area',
 'Sailing Direction or Publication',
 'Publication Link',
 'Standard Nautical Chart',
 'IHO S-57 Electronic Navigational Chart',
 'IHO S-101 Electronic Navigational Chart',
 'Digital Nautical Chart',
 'Tidal Range (m)',
 'Entrance Width (m)',
 'Channel Depth (m)',
 'Anchorage Depth (m)',
 'Cargo Pier Depth (m)',
 'Oil Terminal Depth (m)',
 'Liquified Natural Gas Terminal Depth (m)',
 'Maximum Vessel Length (m)',
 'Maximum Vessel Beam (m)',
 'Maximum Vessel Draft (m)',
 'Offshore Maximum Vessel Length (m)',
 'Offshore Maximum Vessel Beam (m)',
 'Offshore Maximum Vessel Draft (m)',
 'Harbor Size',
 'Harbor Type',
 'Harbor Use',
 'Shelter Afforded',
 'Entrance Restriction - Tide',
 'Entrance Restriction - Heavy Swell',
 'Entrance Restriction - Ice',
 'Entrance Restriction - Other',
 'Overhead Limits',
 'Underkeel Clearance Management System',
 'Good Holding Ground',
 'Turning Area',
 'Port Security',
 'Estimated Time of Arrival Message',
 'Quarantine - Pratique',
 'Quarantine - Sanitation',
 'Quarantine - Other',
 'Traffic Separation Scheme',
 'Vessel Traffic Service',
 'First Port of Entry',
 'US Representative',
 'Pilotage - Compulsory',
 'Pilotage - Available',
 'Pilotage - Local Assistance',
 'Pilotage - Advisable',
 'Tugs - Salvage',
 'Tugs - Assistance',
 'Communications - Telephone',
 'Communications - Telefax',
 'Communications - Radio',
 'Communications - Radiotelephone',
 'Communications - Airport',
 'Communications - Rail',
 'Search and Rescue',
 'NAVAREA',
 'Facilities - Wharves',
 'Facilities - Anchorage',
 'Facilities - Dangerous Cargo Anchorage',
 'Facilities - Med Mooring',
 'Facilities - Beach Mooring',
 'Facilities - Ice Mooring',
 'Facilities - Ro-Ro',
 'Facilities - Solid Bulk',
 'Facilities - Liquid Bulk',
 'Facilities - Container',
 'Facilities - Breakbulk',
 'Facilities - Oil Terminal',
 'Facilities - LNG Terminal',
 'Facilities - Other',
 'Medical Facilities',
 'Garbage Disposal',
 'Chemical Holding Tank Disposal',
 'Degaussing',
 'Dirty Ballast Disposal',
 'Cranes - Fixed',
 'Cranes - Mobile',
 'Cranes - Floating',
 'Cranes - Container',
 'Lifts - 100+ Tons',
 'Lifts - 50-100 Tons',
 'Lifts - 25-49 Tons',
 'Lifts - 0-24 Tons',
 'Services - Longshoremen',
 'Services - Electricity',
 'Services - Steam',
 'Services - Navigation Equipment',
 'Services - Electrical Repair',
 'Services - Ice Breaking',
 'Services - Diving',
 'Supplies - Provisions',
 'Supplies - Potable Water',
 'Supplies - Fuel Oil',
 'Supplies - Diesel Oil',
 'Supplies - Aviation Fuel',
 'Supplies - Deck',
 'Supplies - Engine',
 'Repairs',
 'Dry Dock',
 'Railway',
 'Latitude',
 'Longitude']
In [14]:
#rename
infoseaports.rename(columns={'Main Port Name':'portName'},inplace=True)
#keep few columns
infoseaports=infoseaports.loc[:,['portName', 'Country Code','Latitude', 'Longitude']]

# we have now
infoseaports.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3739 entries, 0 to 3738
Data columns (total 4 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   portName      3739 non-null   object 
 1   Country Code  3739 non-null   object 
 2   Latitude      3739 non-null   float64
 3   Longitude     3739 non-null   float64
dtypes: float64(2), object(2)
memory usage: 117.0+ KB
In [15]:
#spatial points (unprojected)
seaports=gpd.GeoDataFrame(data=infoseaports.copy(),
                           geometry=gpd.points_from_xy(infoseaports.Longitude,
                                                       infoseaports.Latitude),
                          crs=4326)# notice it is unprojected

# keep Brazil
seaports_chi=seaports[seaports['Country Code']=='Chile'].copy()

# reset indexes
seaports_chi.reset_index(drop=True, inplace=True)

# reprojecting
seaports_chi_5361=seaports_chi.to_crs(5361) # projected crs
In [16]:
# subsetting
mediumAirports=airports[airports['type']=='medium_airport'] #can't use "airports.type"
mediumAirports.reset_index(drop=True, inplace=True)
mediumAirports.head()
Out[16]:
id ident type name latitude_deg longitude_deg elevation_ft continent country_name iso_country ... gps_code icao_code iata_code local_code home_link wikipedia_link keywords score last_updated geometry
0 6009 SCCI medium_airport President Carlos Ibañez del Campo Internationa... -53.002602 -70.854599 139 SA Chile CL ... SCCI SCCI PUQ https://en.wikipedia.org/wiki/Carlos_Ibanez_De... 750 2021-12-22T15:07:05+00:00 POINT (-70.8546 -53.0026)
1 6043 SCTE medium_airport El Tepual Airport -41.438899993896484 -73.09400177001953 294 SA Chile CL ... SCTE SCTE PMC https://en.wikipedia.org/wiki/El_Tepual_Airport 750 2008-07-12T07:26:32+00:00 POINT (-73.094 -41.4389)
2 6026 SCIP medium_airport Mataveri Airport -27.1648006439 -109.42199707 227 SA Chile CL ... SCIP SCIP IPC https://en.wikipedia.org/wiki/Mataveri_Interna... Rapa Nui, Easter Island 750 2011-10-28T10:05:26+00:00 POINT (-109.422 -27.1648)
3 6007 SCCF medium_airport El Loa Airport -22.498199 -68.903603 7543 SA Chile CL ... SCCF SCCF CJC https://en.wikipedia.org/wiki/El_Loa_Airport 750 2024-04-29T19:45:32+00:00 POINT (-68.9036 -22.4982)
4 6018 SCFA medium_airport Andrés Sabella Gálvez International Airport -23.444501 -70.445099 455 SA Chile CL ... SCFA SCFA ANF https://en.wikipedia.org/wiki/Andr%C3%A9s_Sabe... Cerro Moreno Airport 750 2019-02-15T15:15:06+00:00 POINT (-70.4451 -23.4445)

5 rows × 25 columns

In [17]:
# Reproyectar ambos GeoDataFrames a CRS proyectado para Chile
seaports_chi_5361 = seaports_chi.to_crs(epsg=5361)
mediumAirports_5361 = mediumAirports.to_crs(epsg=5361)
In [18]:
# Crear matriz de distancias (km) con índices organizados
distanceMatrixKM = seaports_chi_5361.set_index('portName').geometry.apply(
    lambda g: mediumAirports_5361.set_index('name').geometry.distance(g) / 1000
)

# Ordenar por índices para que se vea ordenado
distanceMatrixKM = distanceMatrixKM.sort_index(axis=0).sort_index(axis=1)

# Mostrar parte de la matriz
distanceMatrixKM.head()
Out[18]:
name Andrés Sabella Gálvez International Airport Balmaceda Airport Barriles Airport Captain Fuentes Martinez Airport Carriel Sur Airport Cañal Bajo Carlos Hott Siebert Airport Chacalluta Airport Chañaral Airport Chile Chico Airport Cochrane Airport ... Mataveri Airport Nuevo Chaitén Airport Panguilemo Airport Pichoy Airport President Carlos Ibañez del Campo International Airport Ricardo García Posada Airport Teniente Vidal Airport Vallenar Airport Victoria Airport Viña del Mar Airport
portName
Antofagasta 22.940637 2472.864745 170.961872 3285.596330 1477.370401 1897.808345 586.939017 297.737139 2546.887085 2625.362563 ... 4213.139786 2134.261522 1305.090964 1792.593794 3258.036259 301.950756 2439.421551 549.012137 1628.965043 1035.910135
Bahia Agua Fresca 3323.291208 832.129552 3467.953403 45.485040 1853.910946 1429.114399 3887.468225 3003.357477 758.093206 692.682429 ... 4601.174929 1187.154111 2001.452201 1535.633295 43.019862 3006.846332 870.228448 2752.489579 1686.170806 2270.533143
Bahia De Valdivia 1833.539735 691.687551 1981.761205 1512.472356 336.845978 91.604626 2395.295895 1514.434726 764.655835 829.431954 ... 3888.592172 333.329655 512.292563 21.816091 1479.466825 1531.082734 650.913648 1264.368041 189.571032 777.107154
Bahia De Valparaiso 1068.946150 1430.651373 1216.684847 2248.722965 435.704955 851.304473 1632.011796 749.240496 1504.811883 1580.688617 ... 3955.007034 1087.922271 260.147625 746.470033 2219.386102 766.305626 1395.631570 498.816608 582.382233 15.902885
Bahia Harris 3374.743679 886.830961 3519.008142 66.910109 1909.247021 1485.162268 3938.813770 3054.994445 812.998363 750.297332 ... 4656.461753 1243.387734 2054.599389 1591.509722 98.045533 3057.503553 925.876234 2804.315216 1740.697091 2323.383383

5 rows × 32 columns

In [19]:
distanceMatrixKM_sea_air = (
    seaports_chi_5361.set_index('portName').geometry.apply(
        lambda g: mediumAirports_5361.set_index('name').geometry.distance(g) / 1000
    )
).sort_index(axis=0).sort_index(axis=1)
In [20]:
port_point=seaports_chi_5361[seaports_chi_5361['portName']== "Bahia Harris"]
closest_point1=mediumAirports[mediumAirports['name']=='President Carlos Ibañez del Campo International Airport']
closest_point2=mediumAirports[mediumAirports['name']=='Captain Fuentes Martinez Airport']
In [21]:
# Reproyectar puntos individuales
port_point_proj = port_point.to_crs(epsg=5361)
closest_point1_proj = closest_point1.to_crs(epsg=5361)
closest_point2_proj = closest_point2.to_crs(epsg=5361)
In [22]:
base=chile_5361.plot(facecolor='white',
                 edgecolor='black',
                 linewidth=0.1,
                 figsize=(6,6))
port_point.plot(facecolor='green',linewidth=0,marker="^",
                ax=base,markersize=30,zorder=5)
closest_point1_proj.plot(facecolor='blue',linewidth=0,
                ax=base,markersize=20,zorder=5)
closest_point2_proj.plot(facecolor='red',linewidth=0,
                ax=base,markersize=20,zorder=5)
Out[22]:
<Axes: >
No description has been provided for this image

Ejercicio 2

In [23]:
import geopandas as gpd
from fiona import listlayers
hidrografia=gpd.read_file("https://github.com/AdriMA3/Tarea2G/raw/refs/heads/main/maps/Red_Hidrografica/Red_Hidrografica.shp")
In [24]:
#asignaremos un crs conocido para luego poroyectar
# Asegurar que ambos estén en el mismo CRS antes del clip
hidrografia_aligned = hidrografia.to_crs(chile.crs)

# Realizar el clip
hidrografiaChile_clipped = gpd.clip(hidrografia_aligned, chile)

# Luego proyectar al CRS deseado (por ejemplo EPSG:5361)
hidrografia_chile_5361 =  hidrografiaChile_clipped.to_crs(5361)
In [25]:
hidrografia_chile_5361.head()
Out[25]:
objectid fid_drenes cod_comuna shape_leng st_length_ Nombre Dren_Tipo Region Provincia Comuna geometry
4243 4286 31936 1240 9673.323324 15831.851676 Río Volcan Río Región de Magallanes y Antártica Chilena Ultima Esperanza Natales LINESTRING (189727.27 4184887.299, 189760.717 ...
4242 4285 31936 1240 0.002220 0.003612 Río Volcan Río Región de Magallanes y Antártica Chilena Ultima Esperanza Natales LINESTRING (189727.268 4184887.298, 189727.27 ...
3106 3149 68837 1130 2246.652440 3381.047573 None Quebrada Región de Aysén del Gral.Ibañez del Campo Capitán Prat Tortel LINESTRING (152514.392 4626409.814, 152571.086...
3093 3136 68799 1130 1505.446980 2266.294719 None Quebrada Región de Aysén del Gral.Ibañez del Campo Capitán Prat Tortel LINESTRING (152514.392 4626409.814, 152497.027...
2941 2968 68685 1130 1163.005615 1750.726277 None Quebrada Región de Aysén del Gral.Ibañez del Campo Capitán Prat Tortel LINESTRING (151852.068 4627342.785, 151871.722...
In [26]:
# Seleccionar el río
single_line = hidrografia_chile_5361[hidrografia_chile_5361['Nombre'] == 'Río Volcan']

# Calcular distancias en km del río a todos los aeropuertos medianos
distanceMatrixKM_hidro = (
    single_line.set_index('Nombre').geometry.apply(
        lambda g: mediumAirports_5361.set_index('name').geometry.distance(g) / 1000
    )
).sort_index(axis=0)

# Mostrar resultado
distanceMatrixKM_hidro
Out[26]:
name President Carlos Ibañez del Campo International Airport El Tepual Airport Mataveri Airport El Loa Airport Andrés Sabella Gálvez International Airport Diego Aracena Airport Balmaceda Airport La Florida Airport Desierto de Atacama Airport Chacalluta Airport ... Viña del Mar Airport Chañaral Airport Chile Chico Airport Captain Fuentes Martinez Airport Panguilemo Airport Las Breas Airport Vallenar Airport Nuevo Chaitén Airport Barriles Airport Victoria Airport
Nombre
Río Volcan 191.041139 1219.950585 4395.029503 3342.303390 3225.716669 3548.854965 733.603823 2505.494207 2801.685469 3789.602662 ... 2168.110341 2905.439258 660.640989 234.511907 1898.503935 2991.855506 2654.163181 1071.381411 3372.193828 1576.836478
Río Volcan 194.981921 1219.950585 4395.029501 3342.508387 3225.748145 3548.895438 733.965003 2505.494207 2801.706883 3789.612040 ... 2168.110341 2905.474895 661.075725 238.390204 1898.503935 2991.913871 2654.200975 1071.381411 3372.260089 1576.836478
Río Volcan 187.499808 1220.299335 4400.639220 3341.896185 3225.489617 3548.618136 733.051097 2505.326628 2801.469589 3789.397850 ... 2167.966803 2905.208412 660.014422 231.064002 1898.341339 2991.600911 2653.930596 1071.558047 3371.930458 1576.895195
Río Volcan 189.071192 1220.315269 4398.739622 3342.267597 3225.731013 3548.866636 733.524022 2505.533934 2801.702844 3789.623259 ... 2168.164823 2905.452494 660.539305 232.567191 1898.545913 2991.862155 2654.175882 1071.635387 3372.198096 1577.017498
Río Volcan 186.520260 1219.215611 4402.013832 3340.629100 3224.285359 3547.410304 731.738642 2504.139479 2800.269478 3788.201329 ... 2166.784457 2904.002936 658.678104 230.179542 1897.155933 2990.386993 2652.724626 1070.439713 3370.713303 1575.751446
Río Volcan 2118.034101 875.867850 4106.602797 1269.480266 1161.306169 1482.597729 1336.993190 458.142005 741.652933 1724.874910 ... 175.271130 842.739640 1410.609785 2144.911981 217.239722 926.445525 594.336724 1012.099330 1304.709991 522.531145
Río Volcan 2121.016784 878.689617 4106.530687 1267.852392 1159.696159 1480.981734 1339.954974 456.623438 740.062534 1723.260476 ... 174.438190 841.138715 1413.574103 2147.897360 219.380281 924.836044 592.754061 1014.981912 1303.092555 525.233684
Río Volcan 2122.639069 880.289196 4106.348454 1265.930458 1157.719653 1479.014031 1341.583070 454.629497 738.070597 1721.290154 ... 172.964928 839.153280 1415.202019 2149.517019 220.706763 922.858899 590.759036 1016.598540 1301.127534 526.792787
Río Volcan 2124.592399 882.055885 4105.862021 1262.581684 1154.428830 1475.706406 1343.500913 451.564994 734.831294 1717.986988 ... 171.331036 835.886805 1417.123488 2151.477334 221.929637 919.569545 587.539383 1018.424833 1297.815713 528.453140
Río Volcan 2130.863314 886.224551 4099.450065 1258.030002 1149.425218 1470.791680 1349.258843 445.974069 729.624611 1713.046353 ... 163.593613 830.777633 1422.928672 2157.867800 222.413853 914.559725 582.272514 1023.153084 1292.926756 531.758771
Río Volcan 2131.126431 885.037364 4092.561981 1259.569197 1149.574345 1471.218019 1349.142707 443.829880 729.092553 1713.381638 ... 157.380456 830.588299 1422.846057 2158.224728 219.081952 914.704871 581.535840 1022.324585 1293.442564 530.069665
Río Volcan 2131.843189 885.195533 4091.607886 1259.650908 1149.550295 1471.214590 1349.740602 443.630600 729.018076 1713.370661 ... 156.587352 830.539595 1423.455288 2158.966412 218.551208 914.681599 581.447185 1022.638192 1293.446548 530.001765
Río Volcan 2131.918691 884.931729 4090.437630 1259.708935 1149.496891 1471.184749 1349.733552 443.305036 728.891047 1713.332050 ... 155.622737 830.455900 1423.457678 2159.056726 217.896657 914.629284 581.296717 1022.455378 1293.425324 529.636400
Río Volcan 2131.957949 884.724261 4088.836305 1259.681572 1149.200773 1470.938136 1349.735271 442.683486 728.490679 1713.066483 ... 154.193904 830.103514 1423.459632 2159.115860 217.157822 914.336169 580.871093 1022.318193 1293.197343 529.313884
Río Volcan 2132.142538 884.143816 4085.317592 1259.484542 1148.541720 1470.362019 1349.672733 441.343167 727.630608 1712.456954 ... 151.072746 829.347584 1423.418502 2159.363431 215.561947 913.684432 579.958427 1021.913358 1292.654078 528.519620
Río Volcan 2127.919034 885.381201 4103.650233 1258.042684 1149.456415 1470.817985 1346.851269 446.044534 729.667754 1713.074108 ... 166.019605 830.814869 1420.472405 2154.795771 224.780218 914.591213 582.319407 1021.773706 1292.951633 531.713742
Río Volcan 2130.616935 885.046959 4095.851860 1260.644823 1151.086541 1472.647049 1348.767355 445.963328 730.802699 1714.840063 ... 160.799748 832.199442 1422.459007 2157.677296 220.041976 916.215525 583.298822 1022.203515 1294.842612 530.263619
Río Volcan 2130.464575 885.020108 4096.167448 1260.313958 1150.877433 1472.413605 1348.645315 445.991848 730.655619 1714.614840 ... 161.057390 832.020039 1422.334078 2157.522361 220.192320 916.006427 583.173286 1022.144217 1294.601107 530.283090
Río Volcan 2130.632953 885.564930 4097.780930 1260.159035 1150.935552 1472.431551 1348.913782 446.359115 730.811256 1714.646068 ... 162.362336 832.127046 1422.593734 2157.665842 221.218129 916.065004 583.356913 1022.597500 1294.606001 530.954527
Río Volcan 2130.517518 884.807542 4094.320787 1260.119712 1150.368524 1471.965955 1348.628971 444.954481 729.990497 1714.146137 ... 159.179336 831.434334 1422.323847 2157.591374 219.623546 915.497886 582.462551 1021.997385 1294.174173 529.978802

20 rows × 32 columns

In [32]:
!pip install folium matplotlib mapclassify
Requirement already satisfied: folium in /usr/local/lib/python3.11/dist-packages (0.19.7)
Requirement already satisfied: matplotlib in /usr/local/lib/python3.11/dist-packages (3.10.0)
Collecting mapclassify
  Downloading mapclassify-2.9.0-py3-none-any.whl.metadata (3.1 kB)
Requirement already satisfied: branca>=0.6.0 in /usr/local/lib/python3.11/dist-packages (from folium) (0.8.1)
Requirement already satisfied: jinja2>=2.9 in /usr/local/lib/python3.11/dist-packages (from folium) (3.1.6)
Requirement already satisfied: numpy in /usr/local/lib/python3.11/dist-packages (from folium) (2.0.2)
Requirement already satisfied: requests in /usr/local/lib/python3.11/dist-packages (from folium) (2.32.3)
Requirement already satisfied: xyzservices in /usr/local/lib/python3.11/dist-packages (from folium) (2025.4.0)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (4.58.4)
Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (1.4.8)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (24.2)
Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (11.2.1)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (2.9.0.post0)
Requirement already satisfied: networkx>=3.2 in /usr/local/lib/python3.11/dist-packages (from mapclassify) (3.5)
Requirement already satisfied: pandas>=2.1 in /usr/local/lib/python3.11/dist-packages (from mapclassify) (2.2.2)
Requirement already satisfied: scikit-learn>=1.4 in /usr/local/lib/python3.11/dist-packages (from mapclassify) (1.6.1)
Requirement already satisfied: scipy>=1.12 in /usr/local/lib/python3.11/dist-packages (from mapclassify) (1.15.3)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2>=2.9->folium) (3.0.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=2.1->mapclassify) (2025.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=2.1->mapclassify) (2025.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from python-dateutil>=2.7->matplotlib) (1.17.0)
Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn>=1.4->mapclassify) (1.5.1)
Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn>=1.4->mapclassify) (3.6.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests->folium) (3.4.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests->folium) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests->folium) (2.4.0)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests->folium) (2025.6.15)
Downloading mapclassify-2.9.0-py3-none-any.whl (286 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 286.7/286.7 kB 4.1 MB/s eta 0:00:00
Installing collected packages: mapclassify
Successfully installed mapclassify-2.9.0
In [28]:
closest_airports=mediumAirports_5361[mediumAirports_5361['name']=='President Carlos Ibañez del Campo International Airport']
farthest_airports=mediumAirports_5361[mediumAirports_5361['name']=='Andrés Sabella Gálvez International Airport']
In [29]:
farthest_airport = mediumAirports[mediumAirports['name'] =='Andrés Sabella Gálvez International Airport']
farthest_airport_5361 = farthest_airport.to_crs(epsg=5361)
In [33]:
# Mapa interactivo del río
m = single_line.explore(color='black', tooltip='Nombre')  # ¡Usa 'Nombre' con mayúscula!

# Agregar puertos con sus nombres también
closest_airports.explore(m=m, color='red', marker_kwds=dict(radius=5), tooltip='name')
farthest_airport_5361.explore(m=m, color='green', marker_kwds=dict(radius=5), tooltip='name')
Out[33]:
Make this Notebook Trusted to load map: File -> Trust Notebook

ejercicio 3

In [34]:
hidrografia_chile_5361.head()
Out[34]:
objectid fid_drenes cod_comuna shape_leng st_length_ Nombre Dren_Tipo Region Provincia Comuna geometry
4243 4286 31936 1240 9673.323324 15831.851676 Río Volcan Río Región de Magallanes y Antártica Chilena Ultima Esperanza Natales LINESTRING (189727.27 4184887.299, 189760.717 ...
4242 4285 31936 1240 0.002220 0.003612 Río Volcan Río Región de Magallanes y Antártica Chilena Ultima Esperanza Natales LINESTRING (189727.268 4184887.298, 189727.27 ...
3106 3149 68837 1130 2246.652440 3381.047573 None Quebrada Región de Aysén del Gral.Ibañez del Campo Capitán Prat Tortel LINESTRING (152514.392 4626409.814, 152571.086...
3093 3136 68799 1130 1505.446980 2266.294719 None Quebrada Región de Aysén del Gral.Ibañez del Campo Capitán Prat Tortel LINESTRING (152514.392 4626409.814, 152497.027...
2941 2968 68685 1130 1163.005615 1750.726277 None Quebrada Región de Aysén del Gral.Ibañez del Campo Capitán Prat Tortel LINESTRING (151852.068 4627342.785, 151871.722...
In [35]:
hidro_lines_by_region=hidrografia_chile_5361.dissolve(by='Region')
hidro_lines_by_region.reset_index(drop=False, inplace=True)
hidro_lines_by_region.drop(columns=['objectid','fid_drenes','cod_comuna','shape_leng','st_length_','Dren_Tipo'],inplace=True)
hidro_lines_Magallanes_Antartida=hidro_lines_by_region[hidro_lines_by_region['Region']=='Región de Magallanes y Antártica Chilena']
In [36]:
hidro_lines_Magallanes_Antartida.convex_hull
Out[36]:
0
12 POLYGON ((581364.81 3876015.596, 563792.703 38...

In [37]:
hidro_lines_Magallanes_Antartida.convex_hull.plot()
Out[37]:
<Axes: >
No description has been provided for this image
In [38]:
lines_Magallanes_hulls=hidro_lines_Magallanes_Antartida.convex_hull.to_frame()
lines_Magallanes_hulls['Region']=['Región de Magallanes y Antártica Chilena']
lines_Magallanes_hulls.rename(columns={0:'geometry'},inplace=True)
lines_Magallanes_hulls=lines_Magallanes_hulls.set_geometry('geometry')
lines_Magallanes_hulls
Out[38]:
geometry Region
12 POLYGON ((581364.81 3876015.596, 563792.703 38... Región de Magallanes y Antártica Chilena
In [39]:
distanceMatrixKM_linesHull=lines_Magallanes_hulls.set_index('Region').geometry.apply\
(lambda g: mediumAirports_5361.set_index('name').geometry.distance(g)/1000)\
.sort_index(axis=1)
distanceMatrixKM_linesHull
Out[39]:
name Andrés Sabella Gálvez International Airport Balmaceda Airport Barriles Airport Captain Fuentes Martinez Airport Carriel Sur Airport Cañal Bajo Carlos Hott Siebert Airport Chacalluta Airport Chañaral Airport Chile Chico Airport Cochrane Airport ... Mataveri Airport Nuevo Chaitén Airport Panguilemo Airport Pichoy Airport President Carlos Ibañez del Campo International Airport Ricardo García Posada Airport Teniente Vidal Airport Vallenar Airport Victoria Airport Viña del Mar Airport
Region
Región de Magallanes y Antártica Chilena 2842.207391 384.11785 2989.718127 0.0 1347.876385 922.774781 3405.07226 2522.319723 322.502245 222.616636 ... 4108.12686 686.003741 1515.179809 1028.924551 0.0 2534.653706 401.102147 2271.366361 1190.889578 1783.954673

1 rows × 32 columns

In [40]:
closest_airports_1=mediumAirports_5361[mediumAirports_5361['name']=='Captain Fuentes Martinez Airport']
closest_airports_2=mediumAirports_5361[mediumAirports_5361['name']=='President Carlos Ibañez del Campo International Airport']
farthest_airports_1=mediumAirports_5361[mediumAirports_5361['name']=='Chañaral Airport']
In [41]:
farthest_airports_1 = farthest_airports_1.to_crs(5361)
In [42]:
base=lines_Magallanes_hulls.explore()
mins=distanceMatrixKM_linesHull.idxmin(axis=1)
closest_airports_1.explore(m=base, color='red', marker_kwds=dict(radius=10))
closest_airports_2.explore(m=base, color='blue', marker_kwds=dict(radius=10))
farthest_airports_1.explore(m=base, color='green', marker_kwds=dict(radius=10))
Out[42]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Ejercicio4

In [48]:
import geopandas as gpd

# URL del servicio de ArcGIS REST con capa de líneas eléctricas
url = "https://ide-energia.minenergia.cl/server/rest/services/IDE_Energia/Visor_IDE_Energ%C3%ADa/MapServer/10/query"

# Descargar todas las líneas eléctricas como GeoDataFrame
electric_lines = gpd.read_file(
    f"{url}?where=1=1&outFields=*&f=geojson"
)

# Verificar carga exitosa
print(electric_lines.shape)
electric_lines.head()
(1052, 22)
Out[48]:
OBJECTID ID_LIN_TRANS SUBTIPO NOMBRE CIRCUITO TIPO F_OPERACIO LONG_KM TRAMO PROPIEDAD ... SIST_ELECT ESTADO REGION PROVINCIA COMUNA FUENTE_BAS FECH_CREA FECH_ACT SHAPE.STLength() geometry
0 1041 134.0 100 ANCOA - ALTO JAHUEL 500KV L1 C1 NACIONAL 1.126570e+12 240.253297 ANCOA - ALTO JAHUEL C1 TRANSELEC S.A. ... SEN EN OPERACION METROPOLITANA DE SANTIAGO-LIBERTADOR GENERAL B... MAIPO-CURICO-COLCHAGUA-CACHAPOAL-LINARES-TALCA MOSTAZAL-BUIN-GRANEROS-CODEGUA-PAINE-RANCAGUA-... CEN 1556236800000 1714435200000 2.245320 LINESTRING (-71.38073 -35.6829, -71.38105 -35....
1 1042 814.0 100 ANCOA - ALTO JAHUEL 500KV L2 C1 NACIONAL 1.420070e+12 257.757360 ANCOA - ALTO JAHUEL C2 TRANSELEC S.A. ... SEN EN OPERACION METROPOLITANA DE SANTIAGO-LIBERTADOR GENERAL B... MAIPO-CURICO-COLCHAGUA-CACHAPOAL-LINARES-TALCA MOSTAZAL-BUIN-GRANEROS-PAINE-SAN BERNARDO-DONI... CEN 1556236800000 1714435200000 2.431573 LINESTRING (-71.38073 -35.68302, -71.38105 -35...
2 1043 864.0 100 ANCOA - ALTO JAHUEL 500KV L3 S/I NACIONAL 1.420070e+12 256.467637 ANCOA - ALTO JAHUEL ALTO JAHUEL TRANSMISORA DE ENERGÍA S.A. ... SEN EN OPERACION METROPOLITANA DE SANTIAGO-LIBERTADOR GENERAL B... MAIPO-CURICO-COLCHAGUA-CACHAPOAL-LINARES-TALCA MOSTAZAL-BUIN-CODEGUA-PAINE-SAN FERNANDO-RIO C... CEN 1513728000000 1714435200000 2.432870 LINESTRING (-71.37801 -35.68121, -71.37784 -35...
3 1044 889.0 100 ANCOA - ALTO JAHUEL 500KV L4 S/I NACIONAL 1.420070e+12 256.297624 ANCOA - ALTO JAHUEL ALTO JAHUEL TRANSMISORA DE ENERGÍA S.A. ... SEN EN OPERACION METROPOLITANA DE SANTIAGO-LIBERTADOR GENERAL B... MAIPO-CURICO-COLCHAGUA-CACHAPOAL-LINARES-TALCA MOSTAZAL-BUIN-CODEGUA-PAINE-SAN FERNANDO-RIO C... CEN 1513728000000 1714435200000 2.431254 LINESTRING (-71.37784 -35.68053, -71.37711 -35...
4 1045 904.0 100 NUEVA CARDONES - NUEVA MAITENCILLO 500KV C1 - C2 NACIONAL 1.515888e+12 139.902808 NUEVA CARDONES - NUEVA MAITENCILLO INTERCHILE S.A. ... SEN EN OPERACION ATACAMA HUASCO-COPIAPO FREIRINA-COPIAPO-VALLENAR CEN 1556236800000 1714435200000 1.303026 LINESTRING (-70.4269 -27.51888, -70.42733 -27....

5 rows × 22 columns

In [49]:
# Cambiar proyección a 5361 (metros en Chile)
electric_lines_5361 = electric_lines.to_crs(epsg=5361)
In [52]:
# Seleccionar por nombre
linea_seleccionada = electric_lines_5361[electric_lines_5361['TRAMO'].str.contains('ANCOA - ALTO JAHUEL C2', na=False)]
In [56]:
# Calcular matriz de distancia (km)
distanceMatrix_km = (
    linea_seleccionada.set_index('TRAMO').geometry.apply(
        lambda g:airports_5361.set_index('name').geometry.distance(g) / 1000
    )
)
distanceMatrix_km
Out[56]:
name Comodoro Arturo Merino Benítez International Airport President Carlos Ibañez del Campo International Airport El Tepual Airport Mataveri Airport El Loa Airport Andrés Sabella Gálvez International Airport Diego Aracena Airport Balmaceda Airport La Florida Airport Desierto de Atacama Airport ... Clínica Indisa Helipad Ejército Bicentenario Helipad Titanium Heliport Moneda Bicentenario Heliport Apoquindo 2929 Helipad Edificio Torre Nueva Santa María Helipad Dinahue Heliport Basso Field Santa Carolina Heliport Villarica Park Lake Heliport
TRAMO
ANCOA - ALTO JAHUEL C2 32.821931 1924.906462 656.410475 3982.230895 1252.114702 1135.140472 1457.849156 1136.833811 420.276566 712.108264 ... 30.87334 25.911729 32.106916 27.582695 31.781138 30.551055 194.579976 547.316968 84.220548 406.580385

1 rows × 520 columns

In [60]:
buffer_metros = 30000  # = 30 km
buffer_linea = linea_seleccionada.buffer(distance=buffer_metros)
In [61]:
# Aeropuertos dentro del buffer
aeropuertos_en_buffer = airports_5361.clip(buffer_linea)
aeropuertos_en_buffer
Out[61]:
id ident type name latitude_deg longitude_deg elevation_ft continent country_name iso_country ... gps_code icao_code iata_code local_code home_link wikipedia_link keywords score last_updated geometry
265 39187 SCKK small_airport La Cascada Airport -35.384998 -71.106667 1804 SA Chile CL ... SCKK https://en.wikipedia.org/wiki/La_Cascada_Airport 50 2024-05-18T22:07:57+00:00 POINT (308653.58 6082223.214)
269 39320 SCXA small_airport Alupenhue Airport -35.239445 -71.070831 1600 SA Chile CL ... SCXA https://en.wikipedia.org/wiki/Alupenhue_Airport 50 2024-05-18T22:36:52+00:00 POINT (311571.544 6098437.602)
266 39203 SCLP small_airport Los Petiles Airport -35.21555709838867 -71.10861206054688 1575 SA Chile CL ... SCLP 50 2008-07-12T07:24:28+00:00 POINT (308076.986 6101014.996)
201 39289 SCTM small_airport La Montaña Airport -34.9689 -70.9333 1969 SA Chile CL ... SCTM https://en.wikipedia.org/wiki/Curic%C3%B3_La_M... 50 2024-05-18T22:29:32+00:00 POINT (323504.867 6128698.807)
348 39236 SCOE small_airport San Miguel Airport -34.962223 -71.016388 1509 SA Chile CL ... SCOE https://en.wikipedia.org/wiki/Romeral_San_Migu... 50 2024-05-18T22:17:20+00:00 POINT (315903.58 6129289.492)
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
432 39334 SHBE heliport Banco Exterior Heliport -33.43611145019531 -70.6449966430664 2000 SA Chile CL ... SHBE 25 2008-07-12T07:27:21+00:00 POINT (347083.402 6299154.253)
452 39375 SHLA heliport Las Americas Heliport -33.43583297729492 -70.6433334350586 2126 SA Chile CL ... SHLA 25 2008-07-12T07:27:59+00:00 POINT (347237.541 6299187.577)
449 39370 SHHS heliport Hospital del Salvador Heliport -33.43611145019531 -70.62110900878906 1910 SA Chile CL ... SHHS 25 2008-07-12T07:27:54+00:00 POINT (349304.2 6299189.14)
456 39381 SHMD heliport Ministerio de Defensa Nacional Heliport -33.43527603149414 -70.63805389404297 2123 SA Chile CL ... SHMD 25 2008-07-12T07:28:04+00:00 POINT (347727.401 6299257.081)
454 39379 SHMA heliport Clínica Santa María Heliport -33.432220458984375 -70.62833404541016 2028 SA Chile CL ... SHMA 25 2008-07-12T07:28:03+00:00 POINT (348625.742 6299610.097)

71 rows × 25 columns

In [62]:
# 5. Visualizamos los resultados
base = buffer_linea.plot(color='red', edgecolor='black', alpha=0.5, figsize=(10, 10))
linea_seleccionada.plot(ax=base, color='blue', linewidth=2, label='Línea eléctrica')
aeropuertos_en_buffer.plot(ax=base, color='green', markersize=20, label='Aeropuertos dentro del buffer')
plt.legend()
plt.title('Aeropuertos dentro del buffer alrededor de línea eléctrica')
plt.show()
No description has been provided for this image
In [63]:
lineas_seleccionadas = electric_lines_5361[electric_lines_5361['TRAMO'].str.contains("NUEVA", case=False, na=False)]
In [64]:
# 2. Crear el buffer para todas las líneas seleccionadas (por ejemplo, 30 km)
buffer_metros = 30000
buffers_lineas = lineas_seleccionadas.buffer(distance=buffer_metros)
In [66]:
# 3. Crear GeoDataFrame del buffer (con el mismo CRS)
buffers_gdf = gpd.GeoDataFrame(geometry=buffers_lineas, crs=electric_lines_5361.crs)
In [67]:
# 4. Mapa base con el buffer en rojo
base = buffers_gdf.explore(color='yellow', style_kwds={'fillOpacity': 0.2}, name="Buffers")

# 5. Agregar las líneas eléctricas en azul
lineas_seleccionadas.explore(m=base, color='blue', style_kwds={'weight':2}, name="Líneas eléctricas")

# 6. (Opcional) Agregar aeropuertos en negro
airports_5361.explore(m=base, color='black', marker_kwds={'radius':4}, name="Aeropuertos")

# 7. Mostrar mapa (con control de capas)
import folium
folium.LayerControl().add_to(base)
base
Out[67]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [68]:
# 4. Filtrar aeropuertos que están dentro del buffer
airports_dentro_buffer = airports_5361.clip(buffers_gdf)
In [69]:
# 5. Mapa base con buffers (rojo)
base = buffers_gdf.explore(color='yellow', style_kwds={'fillOpacity': 0.2}, name="Buffers")

# 6. Agregar líneas eléctricas (azul)
lineas_seleccionadas.explore(m=base, color='blue', style_kwds={'weight':2}, name="Líneas eléctricas")

# 7. Agregar solo los aeropuertos dentro del buffer (negro)
airports_dentro_buffer.explore(m=base, color='black', marker_kwds={'radius':4}, name="Aeropuertos en buffer")

# 8. Control de capas
folium.LayerControl().add_to(base)
base
Out[69]:
Make this Notebook Trusted to load map: File -> Trust Notebook