{"id":3213,"date":"2025-09-16T23:06:48","date_gmt":"2025-09-17T02:06:48","guid":{"rendered":"https:\/\/tprentacar.com\/?page_id=3213"},"modified":"2025-10-03T11:41:58","modified_gmt":"2025-10-03T14:41:58","slug":"calculadora-para-tu-viaje","status":"publish","type":"page","link":"https:\/\/tprentacar.com\/en\/calculadora-para-tu-viaje\/","title":{"rendered":"Carretera Austral route calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3213\" class=\"elementor elementor-3213\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0be5a0e e-flex e-con-boxed e-con e-parent\" data-id=\"0be5a0e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-543f71a elementor-widget elementor-widget-html\" data-id=\"543f71a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"utf-8\"\/>\n  <title>Calculadora Carretera Austral v4.36.1 (perfil de superficie + fix)<\/title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- Leaflet \/ LRM CSS -->\n  <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\"\/>\n  <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet-routing-machine@3.2.12\/dist\/leaflet-routing-machine.css\"\/>\n\n  <style>\n    :root{\n      --azul:#0077cc;--azul-osc:#005fa3;--borde:#dde1e6;--bg:#f7f7f9;--txt:#263238;--verde:#15a85a;\n      --sheet-peek:150px;--peligro:#b91c1c;\n      --asfalto:#0f766e;   \/* verde-azulado *\/\n      --ripio:#8b5e34;     \/* caf\u00e9 *\/\n    }\n    html,body{height:100%;margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:var(--txt);}\n\n    \/* M\u00f3vil-first *\/\n    #container{display:flex;flex-direction:column;min-height:100vh;background:var(--bg)}\n    #map{height:100vh;position:relative}\n    #panel{\n      background:#fff;border-top:1px solid var(--borde);padding:12px 12px 16px;box-shadow:0 -8px 24px rgba(0,0,0,.08);\n      border-top-left-radius:14px;border-top-right-radius:14px;\n    }\n\n    h2{margin:0 0 8px;text-align:center;font-size:18px}\n    .row{display:grid;grid-template-columns:1fr;gap:8px}\n    label{font-weight:600;font-size:13px}\n    select,input,button{width:100%;padding:10px 12px;border:1px solid var(--borde);border-radius:10px;background:#fff;font-size:15px}\n    .btn{background:var(--azul);color:#fff;border:none;font-weight:700;cursor:pointer}\n    .btn:hover{background:var(--azul-osc)}\n    .btn[disabled]{opacity:.55;cursor:not-allowed}\n    .btn-sec{background:#fff;border:1px solid var(--borde);font-weight:700}\n    .controls-inline{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:6px}\n    .controls-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n\n    #resultados{margin-top:10px;background:#fff;border:1px solid var(--borde);border-radius:12px;padding:10px}\n    #resultados p{margin:6px 0}\n    .valor{font-weight:800}\n    .pill{display:inline-block;border:1px solid var(--borde);border-radius:999px;padding:2px 8px;background:#fff;font-size:12px}\n    .warn{color:var(--peligro);font-size:12px;font-weight:700;margin-top:4px;display:none}\n\n    .legend{\n      position:absolute;left:10px;bottom:10px;background:#fff;border:1px solid var(--borde);\n      border-radius:10px;padding:8px 10px;font-size:12px;line-height:1.4;z-index:800;min-width:210px;\n      box-shadow:0 4px 12px rgba(0,0,0,.06)\n    }\n    .leg-line{display:inline-block;width:22px;height:0;border-top:4px solid var(--asfalto);margin-right:6px;vertical-align:middle}\n    .leg-line.ripio{border-top:4px dashed var(--ripio)}\n\n    \/* Header sheet *\/\n    #sheetHeader{display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:8px;position:relative}\n    .sheet-grip{width:44px;height:5px;border-radius:999px;background:#d0d5db;position:absolute;top:-6px;left:50%;transform:translateX(-50%)}\n    #sheetToggle{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;border:1px solid var(--borde);background:#fff;font-weight:700;cursor:pointer}\n\n    \/* Contao highlight *\/\n    .contao-hint{background:#fff;border:1px solid #ff8f00;color:#a45100;border-radius:8px;padding:2px 6px;font-weight:700;font-size:12px;box-shadow:0 2px 6px rgba(0,0,0,.08)}\n    .pulse-dot{width:16px;height:16px;border-radius:50%;background:rgba(255,143,0,.9);box-shadow:0 0 0 0 rgba(255,143,0,.5);animation:pulseContao 1.8s infinite}\n    @keyframes pulseContao{0%{box-shadow:0 0 0 0 rgba(255,143,0,.45)}70%{box-shadow:0 0 0 16px rgba(255,143,0,0)}100%{box-shadow:0 0 0 0 rgba(255,143,0,0)}}\n\n    \/* Tabla de superficie *\/\n    table{width:100%;border-collapse:collapse;font-size:13px}\n    thead th{background:#f1f5f9;text-align:left;padding:6px;border-bottom:1px solid #e5e7eb}\n    tbody td{padding:6px;border-bottom:1px solid #f1f5f9}\n    .bar{height:8px;border-radius:6px;background:#e2e8f0;overflow:hidden}\n    .bar>span{display:block;height:100%}\n    .bar .asf{background:var(--asfalto)}\n    .bar .rip{background:repeating-linear-gradient(90deg,var(--ripio),var(--ripio) 8px,transparent 8px,transparent 14px)}\n\n    \/* Bottom sheet (m\u00f3vil) *\/\n    @media (max-width: 899.98px){\n      #container{position:relative}\n      #panel{\n        position:fixed;left:0;right:0;bottom:0;z-index:1000;max-height:84vh;overflow:auto;\n        transform:translateY(calc(100% - var(--sheet-peek)));\n        transition:transform .28s ease;\n      }\n      #panel.sheet-expanded{ transform:translateY(0); }\n      #panel.sheet-collapsed{ transform:translateY(calc(100% - var(--sheet-peek))); }\n    }\n    @media (min-width: 900px){\n      #container{flex-direction:row;height:100vh}\n      #map{flex:2;height:auto}\n      #panel{\n        position:relative;border-top:none;border-left:1px solid var(--borde);\n        transform:none;box-shadow:none;flex:1;\n      }\n      #sheetHeader{display:none}\n    }\n  <\/style>\n<\/head>\n<body>\n  <div id=\"container\">\n    <div id=\"map\"><\/div>\n\n    <div id=\"panel\" class=\"sheet-collapsed\" aria-expanded=\"false\">\n      <div id=\"sheetHeader\">\n        <span class=\"sheet-grip\" aria-hidden=\"true\"><\/span>\n        <button id=\"sheetToggle\" type=\"button\" aria-controls=\"panel\" aria-expanded=\"false\">\u2b06\ufe0f Expandir<\/button>\n      <\/div>\n\n      <h2>Calculadora \u2013 Carretera Austral (v4.36.1)<\/h2>\n      <div class=\"row\">\n        <!-- Origen \/ Destino -->\n        <div>\n          <label for=\"origen\">Origen<\/label>\n          <select id=\"origen\">\n            <option value=\"\">\u2014 Selecciona \u2014<\/option>\n            <option value=\"-41.4733,-72.9423\">Puerto Montt<\/option>\n            <option value=\"-41.3155,-72.9854\">Puerto Varas<\/option>\n            <option value=\"-41.49417,-72.30667\">Cocham\u00f3<\/option>\n            <option value=\"-41.9662,-72.4706\">Hornopir\u00e9n<\/option>\n            <option value=\"-42.5628936,-72.6049179\">Caleta Gonzalo<\/option>\n            <option value=\"-42.9137,-72.7083\">Chait\u00e9n<\/option>\n            <option value=\"-44.3160,-72.5660\">La Junta<\/option>\n            <option value=\"-44.3292,-72.5653\">Puyuhuapi<\/option>\n            <option value=\"-45.5712,-72.0683\">Coyhaique<\/option>\n            <option value=\"-45.9975,-71.9116\">Villa Cerro Castillo<\/option>\n            <option value=\"-46.6220,-72.6767\">Puerto R\u00edo Tranquilo<\/option>\n            <option value=\"-46.5400,-71.7200\">Chile Chico<\/option>\n            <option value=\"-47.2549,-72.5734\">Cochrane<\/option>\n            <option value=\"-47.8009,-73.5336\">Caleta Tortel<\/option>\n            <option value=\"-48.4692,-72.5613\">Villa O'Higgins<\/option>\n          <\/select>\n          <p id=\"sameWarn\" class=\"warn\">El origen y el destino no pueden ser iguales.<\/p>\n        <\/div>\n        <div>\n          <label for=\"destino\">Destino<\/label>\n          <select id=\"destino\">\n            <option value=\"\">\u2014 Selecciona \u2014<\/option>\n            <option value=\"-48.4692,-72.5613\">Villa O'Higgins<\/option>\n            <option value=\"-47.8009,-73.5336\">Caleta Tortel<\/option>\n            <option value=\"-47.2549,-72.5734\">Cochrane<\/option>\n            <option value=\"-46.6220,-72.6767\">Puerto R\u00edo Tranquilo<\/option>\n            <option value=\"-46.5400,-71.7200\">Chile Chico<\/option>\n            <option value=\"-45.9975,-71.9116\">Villa Cerro Castillo<\/option>\n            <option value=\"-45.5712,-72.0683\">Coyhaique<\/option>\n            <option value=\"-44.3292,-72.5653\">Puyuhuapi<\/option>\n            <option value=\"-44.3160,-72.5660\">La Junta<\/option>\n            <option value=\"-42.9137,-72.7083\">Chait\u00e9n<\/option>\n            <option value=\"-42.5628936,-72.6049179\">Caleta Gonzalo<\/option>\n            <option value=\"-41.9662,-72.4706\">Hornopir\u00e9n<\/option>\n            <option value=\"-41.49417,-72.30667\">Cocham\u00f3<\/option>\n            <option value=\"-41.3155,-72.9854\">Puerto Varas<\/option>\n            <option value=\"-41.4733,-72.9423\">Puerto Montt<\/option>\n          <\/select>\n        <\/div>\n\n        <!-- Par\u00e1metros -->\n        <div class=\"controls-row\">\n          <div style=\"flex:1\">\n            <label for=\"rendimiento\">Rendimiento (km\/L)<\/label>\n            <input id=\"rendimiento\" type=\"number\" step=\"0.1\" value=\"10\">\n          <\/div>\n          <div style=\"flex:1\">\n            <label for=\"precio\">Precio combustible (CLP\/L)<\/label>\n            <input id=\"precio\" type=\"number\" step=\"1\" value=\"1500\">\n          <\/div>\n          <div style=\"flex:1\">\n            <label for=\"velocidad\">Velocidad en asfalto (km\/h)<\/label>\n            <input id=\"velocidad\" type=\"number\" step=\"1\" value=\"70\">\n          <\/div>\n        <\/div>\n\n        <div class=\"controls-inline\" style=\"margin-top:4px\">\n          <button class=\"btn\" id=\"btnCalcular\" title=\"Selecciona origen y destino\" disabled>Calcular ruta<\/button>\n          <button class=\"btn-sec\" id=\"btnLimpiar\">Limpiar<\/button>\n\n          <label style=\"display:inline-flex;gap:6px;align-items:center\">\n            <input type=\"checkbox\" id=\"toggleLeyenda\" checked> Leyenda\n          <\/label>\n          <label style=\"display:inline-flex;gap:6px;align-items:center\">\n            <input type=\"checkbox\" id=\"toggleFuel\" checked> Combustible\n          <\/label>\n          <label style=\"display:inline-flex;gap:6px;align-items:center\">\n            <input type=\"checkbox\" id=\"toggleFerries\" checked> Ferries\n          <\/label>\n          <label style=\"display:inline-flex;gap:6px;align-items:center\">\n            <input type=\"checkbox\" id=\"toggleSurface\" checked> Superficie\n          <\/label>\n        <\/div>\n\n        <details id=\"detalleAvanzado\" style=\"margin-top:6px\">\n          <summary style=\"cursor:pointer;font-weight:700\">Avanzado<\/summary>\n          <div class=\"controls-row\" style=\"margin-top:6px\">\n            <label style=\"display:inline-flex;gap:6px;align-items:center\">\n              <input type=\"checkbox\" id=\"autoRipio\" checked> Factor ripio autom\u00e1tico (0.70)\n            <\/label>\n            <div style=\"display:inline-flex;gap:6px;align-items:center;margin-left:auto\">\n              <label for=\"factorRipio\">Factor ripio (%)<\/label>\n              <input id=\"factorRipio\" type=\"number\" min=\"40\" max=\"100\" step=\"1\" value=\"70\" disabled style=\"width:90px\">\n            <\/div>\n          <\/div>\n          <p style=\"font-size:12px;margin:6px 0 0\">\n            El tiempo se calcula con velocidades distintas: asfalto = la que ingreses; ripio = asfalto \u00d7 factor.\n            El porcentaje de ripio se estima autom\u00e1ticamente por tramo cuando no hay una regla espec\u00edfica.\n          <\/p>\n        <\/details>\n\n        <details id=\"detalleResultados\" style=\"margin-top:8px\" open>\n          <summary style=\"cursor:pointer;font-weight:700\">Resultados<\/summary>\n          <div id=\"resultados\">\n            <p>Distancia total: <span class=\"valor\" id=\"distancia\">-<\/span><\/p>\n            <p>Tiempo estimado: <span class=\"valor\" id=\"tiempo\">-<\/span> <span id=\"detalleTiempo\" style=\"font-size:12px;color:#64748b\"><\/span><\/p>\n            <p>Combustible requerido: <span class=\"valor\" id=\"combustible\">-<\/span><\/p>\n            <p>Costo estimado: <span class=\"valor\" id=\"costo\">-<\/span><\/p>\n            <p id=\"observacion\" class=\"pill\" style=\"display:none;\"><\/p>\n          <\/div>\n        <\/details>\n\n        <details id=\"detalleSuperficie\" style=\"margin-top:8px\" open>\n          <summary style=\"cursor:pointer;font-weight:700\">Superficie (asfalto vs. ripio)<\/summary>\n          <div id=\"resSuperficie\">\n            <p>\u2014<\/p>\n          <\/div>\n        <\/details>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Leyenda (toggle) -->\n  <div class=\"legend\" id=\"leyendaBox\">\n    <div><span style=\"display:inline-block;width:10px;height:10px;background:#15a85a;border-radius:50%;margin-right:6px;border:1px solid #0e8b4b;\"><\/span>Combustible<\/div>\n    <div>\ud83d\udea2 Terminal\/Tramo de ferry<\/div>\n    <div>\ud83d\udec3 Control aduanero: Contao<\/div>\n    <div>\u2014 Ruta principal (azul)<\/div>\n    <div><span class=\"leg-line\"><\/span> Asfalto &nbsp; <span class=\"leg-line ripio\"><\/span> Ripio<\/div>\n  <\/div>\n\n  <!-- Scripts -->\n  <script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n  <script src=\"https:\/\/unpkg.com\/leaflet-routing-machine@3.2.12\/dist\/leaflet-routing-machine.min.js\"><\/script>\n\n  <script>\n    \/\/ ====== MAPA ======\n    const map = L.map('map').setView([-45.6, -72.6], 6);\n    L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n      attribution:'&copy; OpenStreetMap', crossOrigin:'anonymous'\n    }).addTo(map);\n\n    \/\/ ====== CAPAS ======\n    const fuelLayer    = L.layerGroup().addTo(map);\n    const ferryLayer   = L.layerGroup().addTo(map);\n    const controlLayer = L.layerGroup().addTo(map);\n    const surfaceLayer = L.layerGroup().addTo(map); \/\/ NUEVO\n\n    \/\/ ====== DATOS ======\n    const PUNTOS = {\n      \"Puerto Montt\": [-41.4733,-72.9423],\n      \"Puerto Varas\": [-41.3155,-72.9854],\n      \"Cocham\u00f3\": [-41.49417,-72.30667],\n      \"Puelche\": [-41.5820,-72.6000],            \/\/ solo ferry (no seleccionable)\n      \"Caleta La Arena\": [-41.6260,-72.6750],    \/\/ solo ferry (no seleccionable)\n      \"Hornopir\u00e9n\": [-41.9662,-72.4706],\n      \"Leptep\u00fa\": [-42.48674,-72.43733],          \/\/ ferry + seleccionable\n      \"Caleta Gonzalo\": [-42.5628936,-72.6049179],\n      \"Chait\u00e9n\": [-42.9137,-72.7083],\n      \"La Junta\": [-44.3160,-72.5660],\n      \"Puyuhuapi\": [-44.3292,-72.5653],\n      \"Coyhaique\": [-45.5712,-72.0683],\n      \"Villa Cerro Castillo\": [-45.9975,-71.9116], \/\/ sin combustible\n      \"Puerto R\u00edo Tranquilo\": [-46.6220,-72.6767],\n      \"Chile Chico\": [-46.5400,-71.7200],\n      \"Cochrane\": [-47.2549,-72.5734],\n      \"Caleta Tortel\": [-47.8009,-73.5336],\n      \"Villa O'Higgins\": [-48.4692,-72.5613]\n    };\n\n    \/\/ Aduana: Contao\n    const CONTAO = { name: \"Contao (Control Aduanero)\", coords: [-41.802106, -72.722054] };\n    const contaoMarker = L.marker(CONTAO.coords, {\n      icon: L.divIcon({html:\"\ud83d\udec3\",className:\"\",iconSize:[20,20],iconAnchor:[10,10]})\n    }).addTo(controlLayer).bindPopup(`<b>${CONTAO.name}<\/b><br>\ud83d\udec3 Control permanente`);\n\n    \/\/ Cadena chilena (para mantener ruta por Chile)\n    const RUTA_CHILE = [\n      \"Puerto Montt\",\"Puerto Varas\",\"Cocham\u00f3\",\n      \"Hornopir\u00e9n\",\"Leptep\u00fa\",\"Caleta Gonzalo\",\"Chait\u00e9n\",\"La Junta\",\"Puyuhuapi\",\n      \"Coyhaique\",\"Villa Cerro Castillo\",\"Puerto R\u00edo Tranquilo\",\"Cochrane\",\n      \"Caleta Tortel\",\"Villa O'Higgins\"\n    ];\n    const IDX = Object.fromEntries(RUTA_CHILE.map((n,i)=>[n,i]));\n\n    \/\/ Terminales de ferry (se marcan si la ruta pasa cerca)\n    const FERRY_TERMINALS = [\n      { name:\"Caleta La Arena (ferry)\", coords:PUNTOS[\"Caleta La Arena\"] },\n      { name:\"Puelche (ferry)\",        coords:PUNTOS[\"Puelche\"] },\n      { name:\"Hornopir\u00e9n (ferry)\",     coords:PUNTOS[\"Hornopir\u00e9n\"] },\n      { name:\"Leptep\u00fa (ferry)\",        coords:PUNTOS[\"Leptep\u00fa\"] },\n      { name:\"Fiordo Largo (ferry)\",   coords:[-42.54553,-72.52335] },\n      { name:\"Caleta Gonzalo (ferry)\", coords:PUNTOS[\"Caleta Gonzalo\"] }\n    ];\n\n    \/\/ Combustible en verde (excepto ferry y Cerro Castillo)\n    const NO_FUEL = new Set([\"Puelche\",\"Leptep\u00fa\",\"Caleta La Arena\",\"Villa Cerro Castillo\"]);\n    function pintarFuel(){\n      fuelLayer.clearLayers();\n      Object.entries(PUNTOS).forEach(([name,coords])=>{\n        if (NO_FUEL.has(name)) return;\n        L.circleMarker(coords, {\n          radius:5, color:'#0e8b4b', fillColor:'#15a85a', fillOpacity:1, weight:1\n        }).addTo(fuelLayer).bindPopup(`<b>${name}<\/b><br>Combustible disponible`);\n      });\n    }\n    pintarFuel();\n\n    \/\/ ====== ROUTING ======\n    let controlRuta=null;\n    let ferryMarkers=[];\n    let contaoPulse = null, contaoHintOn = false, contaoSegment = null;\n    let lastSecNames = []; \/\/ secuencia de nombres usada como waypoints (incluye Contao cuando aplica)\n\n    function iguales(a,b){ return Math.abs(a[0]-b[0])<0.01 && Math.abs(a[1]-b[1])<0.01; }\n    function nombrePorLL(ll){\n      for(const [name,coords] of Object.entries(PUNTOS)){ if(iguales(ll, coords)) return name; }\n      if(iguales(ll, CONTAO.coords)) return \"Contao\";\n      return null;\n    }\n\n    \/\/ Reglas espec\u00edficas de superficie por par (aprox.)\n    \/\/ valores: asfalto en porcentaje (0..1). El resto es ripio.\n    const SURF_OVERRIDES = {\n      \"Puerto Montt|Puerto Varas\": 1.00,\n      \"Puerto Varas|Cocham\u00f3\": 0.80,\n      \"Cocham\u00f3|Contao\": 0.80,\n      \"Contao|Hornopir\u00e9n\": 0.60,\n      \"Caleta Gonzalo|Chait\u00e9n\": 0.40,\n      \"Chait\u00e9n|La Junta\": 0.55,\n      \"La Junta|Puyuhuapi\": 0.55,\n      \"Puyuhuapi|Coyhaique\": 0.65,\n      \/\/ el resto se resuelve con la heur\u00edstica por latitud\n    };\n    function getOverrideAsfalto(a,b){\n      const k1=`${a}|${b}`, k2=`${b}|${a}`;\n      if(SURF_OVERRIDES[k1]!=null) return SURF_OVERRIDES[k1];\n      if(SURF_OVERRIDES[k2]!=null) return SURF_OVERRIDES[k2];\n      return null;\n    }\n\n    \/\/ Heur\u00edstica por \"lo m\u00e1s al sur\" del par\n    function ripioShareBySouthmostIndex(southIdx){\n      const H = IDX[\"Hornopir\u00e9n\"], CG = IDX[\"Caleta Gonzalo\"], CH = IDX[\"Chait\u00e9n\"], LJ = IDX[\"La Junta\"],\n            PY = IDX[\"Puyuhuapi\"], COY= IDX[\"Coyhaique\"], VCC= IDX[\"Villa Cerro Castillo\"],\n            PRT= IDX[\"Puerto R\u00edo Tranquilo\"], COC= IDX[\"Cochrane\"], CT = IDX[\"Caleta Tortel\"], VOH= IDX[\"Villa O'Higgins\"];\n      if(southIdx <= H)  return 0.25;\n      if(southIdx <= CG) return 0.35;\n      if(southIdx <= CH) return 0.40;\n      if(southIdx <= LJ) return 0.45;\n      if(southIdx <= PY) return 0.45;\n      if(southIdx <= COY)return 0.35;\n      if(southIdx <= VCC)return 0.40;\n      if(southIdx <= PRT)return 0.50;\n      if(southIdx <= COC)return 0.55;\n      if(southIdx <= CT) return 0.60;\n      if(southIdx <= VOH)return 0.65;\n      return 0.50;\n    }\n\n    function waypointsSoloChile(origenLL, destinoLL){\n      const nO = nombrePorLL(origenLL), nD = nombrePorLL(destinoLL);\n      if(!nO || !nD) { lastSecNames = [nO||\"Origen\", nD||\"Destino\"]; return [ L.latLng(...origenLL), L.latLng(...destinoLL) ]; }\n      const i = IDX[nO], j = IDX[nD];\n      if(i===undefined || j===undefined){ lastSecNames = [nO, nD]; return [ L.latLng(...origenLL), L.latLng(...destinoLL) ]; }\n\n      let sec = (i<=j) ? RUTA_CHILE.slice(i, j+1) : RUTA_CHILE.slice(j, i+1).reverse();\n      sec = sec.filter((n,k,a)=> k===0 || a[k-1]!==n);\n\n      \/\/ \u00bfinsertar Contao?\n      const destinoAlSur = IDX[nD] !== undefined && IDX[nD] >= IDX[\"Hornopir\u00e9n\"];\n      const origenEnZona = [\"Puerto Montt\",\"Puerto Varas\",\"Cocham\u00f3\",\"Hornopir\u00e9n\"].includes(nO);\n      if(origenEnZona && destinoAlSur){\n        const idxC = sec.indexOf(\"Cocham\u00f3\"), idxH = sec.indexOf(\"Hornopir\u00e9n\");\n        if(idxC !== -1 && idxH !== -1 && idxH > idxC){\n          sec.splice(idxC+1, 0, \"Contao\");\n        }\n      }\n      lastSecNames = sec.slice();\n      return sec.map(n => n===\"Contao\" ? L.latLng(CONTAO.coords[0], CONTAO.coords[1]) : L.latLng(...PUNTOS[n]));\n    }\n\n    \/\/ Geometr\u00eda\n    function haversine(a,b){\n      const toRad=x=>x*Math.PI\/180, R=6371000;\n      const dLat=toRad(b[0]-a[0]), dLng=toRad(b[1]-a[1]);\n      const lat1=toRad(a[0]), lat2=toRad(b[0]);\n      const h = Math.sin(dLat\/2)**2 + Math.cos(lat1)*Math.cos(lat2)*Math.sin(dLng\/2)**2;\n      return 2*R*Math.asin(Math.sqrt(h));\n    }\n    function segmentDistance(poly, i0, i1){\n      let d=0;\n      for(let i=i0;i<i1;i++) d += haversine([poly[i][0],poly[i][1]],[poly[i+1][0],poly[i+1][1]]);\n      return d;\n    }\n    function splitByDistance(poly, i0, i1, cutMeters){\n      const outA=[], outB=[];\n      let acc=0;\n      for(let i=i0;i<i1;i++){\n        const pA=poly[i], pB=poly[i+1];\n        const d = haversine(pA,pB);\n        if((acc+d) < cutMeters){\n          if(outA.length===0) outA.push(pA);\n          outA.push(pB);\n          acc += d;\n        }else{\n          const rest = cutMeters - acc;\n          const t = Math.max(0, Math.min(1, d ? rest\/d : 0));\n          const pCut = [ pA[0] + (pB[0]-pA[0])*t, pA[1] + (pB[1]-pA[1])*t ];\n          if(outA.length===0) outA.push(pA);\n          outA.push(pCut);\n          outB.push(pCut);\n          outB.push(pB);\n          for(let k=i+1;k<=i1;k++){ outB.push(poly[k]); }\n          return {A:outA, B:outB};\n        }\n      }\n      return {A:outA, B:[]};\n    }\n    function nearestIndex(poly, target){\n      let best = 0, bestD = Infinity;\n      for(let i=0;i<poly.length;i++){\n        const d = haversine(target, poly[i]);\n        if(d < bestD){ bestD = d; best = i; }\n      }\n      return best;\n    }\n    function cercaDeRuta(pt, poly, umbralM){\n      for(let i=0;i<poly.length-1;i++){\n        const A=poly[i], B=poly[i+1], P=pt;\n        const AB=[B[0]-A[0], B[1]-A[1]], AP=[P[0]-A[0], P[1]-A[1]];\n        const ab2=AB[0]*AB[0]+AB[1]*AB[1]||1e-12;\n        let t=(AP[0]*AB[0]+AP[1]*AB[1])\/ab2; t=Math.max(0,Math.min(1,t));\n        const proj=[A[0]+t*AB[0], A[1]+t*AB[1]];\n        if(haversine(P,proj)<=umbralM) return true;\n      }\n      return false;\n    }\n\n    \/\/ ====== UI \/ L\u00d3GICA ======\n    let surfaceOverlays = []; \/\/ polylines dibujadas\n    function clearSurface(){\n      surfaceOverlays.forEach(p=>map.removeLayer(p));\n      surfaceOverlays=[];\n      surfaceLayer.clearLayers();\n      document.getElementById('resSuperficie').innerHTML = \"<p>\u2014<\/p>\";\n    }\n\n    function calcularRuta(){\n      const oSel = document.getElementById('origen').value;\n      const dSel = document.getElementById('destino').value;\n      if(!oSel || !dSel){ alert('Selecciona origen y destino.'); return; }\n      if(oSel === dSel){ alert('El origen y el destino no pueden ser iguales.'); return; }\n\n      const origen = oSel.split(\",\").map(Number);\n      const destino= dSel.split(\",\").map(Number);\n      const rend   = Math.max(0.1, parseFloat(document.getElementById('rendimiento').value));\n      const precio = parseFloat(document.getElementById('precio').value);\n      const vAsf   = Math.max(1, parseFloat(document.getElementById('velocidad').value));\n      const mostrarFerries = document.getElementById('toggleFerries').checked;\n\n      \/\/ limpiar previos\n      if(controlRuta){ map.removeControl(controlRuta); controlRuta=null; }\n      ferryMarkers.forEach(m=>map.removeLayer(m)); ferryMarkers=[];\n      if (contaoPulse){ map.removeLayer(contaoPulse); contaoPulse = null; }\n      if (contaoHintOn){ contaoMarker.unbindTooltip(); contaoHintOn = false; }\n      if (contaoSegment){ map.removeLayer(contaoSegment); contaoSegment = null; }\n      clearSurface();\n\n      const wps = waypointsSoloChile(origen, destino);\n\n      controlRuta=L.Routing.control({\n        waypoints: wps,\n        lineOptions:{styles:[{color:'blue',weight:4}]}, \/\/ l\u00ednea base (azul)\n        addWaypoints:false, draggableWaypoints:false, routeWhileDragging:false, show:false,\n        createMarker:()=>null\n      }).on('routesfound', e=>{\n        const r=e.routes[0];\n        const coords = r.coordinates.map(c=>[c.lat,c.lng]);\n        const km=r.summary.totalDistance\/1000;\n\n        \/\/ === Velocidad diferenciada asfalto\/ripio (global para tiempo) ===\n        const nombreO = nombrePorLL(origen);\n        const nombreD = nombrePorLL(destino);\n        const southIdx = Math.max(IDX[nombreO] ?? 0, IDX[nombreD] ?? 0);\n        const autoRipio = document.getElementById('autoRipio').checked;\n        const factorRipio = autoRipio ? 0.70 : Math.min(1, Math.max(0.4, parseFloat(document.getElementById('factorRipio').value)\/100));\n\n        let totalAsfKm=0, totalRipKm=0;\n\n        \/\/ ==== PERFIL DE SUPERFICIE POR TRAMO ====\n        const wpIdx = r.waypointIndices && r.waypointIndices.length ? r.waypointIndices : (()=>{\n          const n = lastSecNames.length, Lc = coords.length;\n          const arr = [];\n          for(let i=0;i<n;i++) arr.push(Math.round(i*(Lc-1)\/(n-1)));\n          return arr;\n        })();\n\n        const detalle = [];\n        const drawSurface = document.getElementById('toggleSurface').checked;\n\n        for(let i=0;i<wpIdx.length-1;i++){\n          const i0 = wpIdx[i], i1 = wpIdx[i+1];\n          const nameA = lastSecNames[i] || `Tramo ${i+1}`;\n          const nameB = lastSecNames[i+1] || `Tramo ${i+1}`;\n          const dMeters = segmentDistance(coords, i0, i1);\n          const dKm = dMeters\/1000;\n\n          let asfPct = getOverrideAsfalto(nameA, nameB);\n          if(asfPct==null){\n            const southOfPair = Math.max(IDX[nameA] ?? southIdx, IDX[nameB] ?? southIdx);\n            const ripPct = ripioShareBySouthmostIndex(southOfPair);\n            asfPct = 1 - ripPct;\n          }\n          asfPct = Math.max(0, Math.min(1, asfPct));\n          const ripPct = 1 - asfPct;\n\n          const asfKm = dKm * asfPct;\n          const ripKm = dKm * ripPct;\n          totalAsfKm += asfKm; totalRipKm += ripKm;\n\n          \/\/ Dibujar overlay: primero asfalto, luego ripio (corte por distancia)\n          if(drawSurface && dMeters>0){\n            const cut = dMeters * asfPct;\n            const parts = splitByDistance(coords, i0, i1, cut);\n            if(parts.A && parts.A.length>=2 && asfPct>0){\n              const plA = L.polyline(parts.A, {color:'#0f766e', weight:6, opacity:0.9}).addTo(surfaceLayer);\n              surfaceOverlays.push(plA);\n            }\n            if(parts.B && parts.B.length>=2 && ripPct>0){\n              const plB = L.polyline(parts.B, {color:'#8b5e34', weight:6, opacity:0.9, dashArray:'10,8'}).addTo(surfaceLayer);\n              surfaceOverlays.push(plB);\n            }\n          }\n\n          detalle.push({ tramo:`${nameA} \u2192 ${nameB}`, asfKm, ripKm, asfPct, ripPct });\n        }\n\n        \/\/ ==== TIEMPO con km asfalto\/ripio efectivos (FIX) ====\n        const vAsfEff = vAsf;                 \/\/ velocidad de asfalto ingresada\n        const vRip    = vAsfEff * factorRipio;\n        const h = (totalAsfKm \/ Math.max(1, vAsfEff)) + (totalRipKm \/ Math.max(1, vRip));\n\n        \/\/ ==== Combustible \/ costo ====\n        const litros = (totalAsfKm+totalRipKm)\/Math.max(0.1, rend);\n        const costo  = litros * precio;\n\n        \/\/ ==== Pinta resultados generales ====\n        document.getElementById('distancia').textContent=km.toFixed(1)+' km';\n        document.getElementById('tiempo').textContent=h.toFixed(1)+' h';\n        document.getElementById('combustible').textContent=litros.toFixed(1)+' L';\n        document.getElementById('costo').textContent='$'+costo.toFixed(0);\n        document.getElementById('detalleTiempo').textContent =\n          ` (asfalto ${Math.round(totalAsfKm)} km @ ${vAsfEff} km\/h, ripio ${Math.round(totalRipKm)} km @ ${Math.round(vRip)} km\/h)`;\n\n        \/\/ ==== Ferries ====\n        const escenarioPV = ([\"Puerto Montt\",\"Puerto Varas\",\"Cocham\u00f3\",\"Hornopir\u00e9n\"].includes(nombreO) &&\n                             IDX[nombreD] !== undefined && IDX[nombreD] >= IDX[\"Hornopir\u00e9n\"]);\n        const obs=document.getElementById('observacion'); let anyFerry=false;\n        const terminales = FERRY_TERMINALS.filter(ft => {\n          if(!escenarioPV) return true;\n          return !(ft.name.includes(\"Caleta La Arena\") || ft.name.includes(\"Puelche\"));\n        });\n        terminales.forEach(ft=>{\n          if(!mostrarFerries) return;\n          if(cercaDeRuta(ft.coords, coords, 12000)){\n            anyFerry=true;\n            const m=L.marker(ft.coords,{icon:L.divIcon({html:\"\ud83d\udea2\",className:\"\",iconSize:[20,20],iconAnchor:[10,10]})})\n              .addTo(ferryLayer).bindPopup(`\ud83d\udea2 Ferry: ${ft.name}`);\n            ferryMarkers.push(m);\n          }\n        });\n        if(anyFerry && mostrarFerries){ obs.style.display='inline-block'; obs.textContent='Incluye ferry en el trayecto'; }\n        else{ obs.style.display='none'; obs.textContent=''; }\n\n        \/\/ Resaltado Contao si aplica\n        if(escenarioPV){\n          contaoMarker.bindTooltip('Desv\u00edo por costa este', {\n            permanent:true, direction:'top', offset:[0,-12], className:'contao-hint'\n          }).openTooltip(); contaoHintOn = true;\n\n          contaoPulse = L.marker(CONTAO.coords, {\n            icon: L.divIcon({ html:'<div class=\"pulse-dot\"><\/div>', className:'', iconSize:[18,18], iconAnchor:[9,9] })\n          }).addTo(controlLayer);\n\n          const idx = nearestIndex(coords, CONTAO.coords);\n          const start = Math.max(0, idx - 25), end = Math.min(coords.length-1, idx + 25);\n          const seg = coords.slice(start, end+1).map(c=>L.latLng(c[0], c[1]));\n          contaoSegment = L.polyline(seg, { color:'#ff8f00', weight:6, opacity:0.95, dashArray:'8,6' })\n                           .addTo(controlLayer);\n          if(contaoSegment.bringToFront) contaoSegment.bringToFront();\n        }\n\n        \/\/ ==== Resumen + tabla de superficie ====\n        const totalKm = totalAsfKm + totalRipKm;\n        const ripPctTotal = totalKm>0 ? (totalRipKm\/totalKm) : 0;\n        const asfPctTotal = 1 - ripPctTotal;\n\n        const rows = detalle.map(d=>{\n          const asfPct = Math.round(d.asfPct*100), ripPct = Math.round(d.ripPct*100);\n          const asfKm = d.asfKm.toFixed(1), ripKm = d.ripKm.toFixed(1);\n          return `\n            <tr>\n              <td style=\"white-space:nowrap\">${d.tramo}<\/td>\n              <td style=\"text-align:right\">${asfKm} km<\/td>\n              <td style=\"text-align:right\">${ripKm} km<\/td>\n              <td style=\"width:40%\">\n                <div class=\"bar\"><span class=\"asf\" style=\"width:${asfPct}%\"><\/span><span class=\"rip\" style=\"width:${ripPct}%\"><\/span><\/div>\n              <\/td>\n              <td style=\"text-align:right\">${asfPct}% \/ ${ripPct}%<\/td>\n            <\/tr>`;\n        }).join(\"\");\n\n        document.getElementById('resSuperficie').innerHTML = `\n          <p><b>Total asfalto:<\/b> ${totalAsfKm.toFixed(1)} km &nbsp; | &nbsp; <b>Total ripio:<\/b> ${totalRipKm.toFixed(1)} km &nbsp; | &nbsp; <b>Ripio total:<\/b> ${(ripPctTotal*100).toFixed(0)}%<\/p>\n          <div style=\"margin:8px 0 10px\" class=\"bar\">\n            <span class=\"asf\" style=\"width:${(asfPctTotal*100).toFixed(0)}%\"><\/span>\n            <span class=\"rip\" style=\"width:${(ripPctTotal*100).toFixed(0)}%\"><\/span>\n          <\/div>\n          <div style=\"overflow:auto\">\n            <table>\n              <thead><tr><th>Tramo<\/th><th>Asfalto<\/th><th>Ripio<\/th><th>Perfil<\/th><th>%<\/th><\/tr><\/thead>\n              <tbody>${rows}<\/tbody>\n            <\/table>\n          <\/div>\n          <p style=\"font-size:12px;color:#64748b;margin-top:6px\">Estimaci\u00f3n referencial; si tienes datos locales por tramo, los incorporamos como reglas fijas.<\/p>\n        `;\n\n        map.fitBounds(L.latLngBounds(coords.map(c=>L.latLng(c[0],c[1]))).pad(0.1));\n      }).on('routingerror',()=>{\n        alert('No se pudo calcular la ruta (OSRM). Intenta nuevamente.');\n      }).addTo(map);\n\n      setTimeout(()=>map.invalidateSize(), 50);\n    }\n\n    function limpiarRuta(resetSelects=true){\n      if(controlRuta){ map.removeControl(controlRuta); controlRuta=null; }\n      ferryMarkers.forEach(m=>map.removeLayer(m)); ferryMarkers=[];\n      if (contaoPulse){ map.removeLayer(contaoPulse); contaoPulse = null; }\n      if (contaoHintOn){ contaoMarker.unbindTooltip(); contaoHintOn = false; }\n      if (contaoSegment){ map.removeLayer(contaoSegment); contaoSegment = null; }\n      clearSurface();\n\n      document.getElementById('distancia').textContent='-';\n      document.getElementById('tiempo').textContent='-';\n      document.getElementById('combustible').textContent='-';\n      document.getElementById('costo').textContent='-';\n      document.getElementById('detalleTiempo').textContent='';\n      document.getElementById('observacion').style.display='none';\n      if(resetSelects){\n        document.getElementById('origen').selectedIndex=0;\n        document.getElementById('destino').selectedIndex=0;\n        document.getElementById('btnCalcular').disabled = true;\n        document.getElementById('sameWarn').style.display='none';\n      }\n      if (window.innerWidth < 900) window.scrollTo({top:0,behavior:'smooth'});\n    }\n\n    \/\/ ====== TOGGLES DE CAPAS ======\n    document.getElementById('toggleFuel').addEventListener('change', (e)=>{\n      if(e.target.checked){ map.addLayer(fuelLayer); } else { map.removeLayer(fuelLayer); }\n      saveParams();\n    });\n    document.getElementById('toggleFerries').addEventListener('change', (e)=>{\n      if(e.target.checked){ map.addLayer(ferryLayer); } else { map.removeLayer(ferryLayer); }\n      saveParams();\n    });\n    document.getElementById('toggleLeyenda').addEventListener('change', (e)=>{\n      document.getElementById('leyendaBox').style.display = e.target.checked ? 'block' : 'none';\n      saveParams();\n    });\n    document.getElementById('toggleSurface').addEventListener('change', (e)=>{\n      if(!e.target.checked){ clearSurface(); map.removeLayer(surfaceLayer); }\n      else{ map.addLayer(surfaceLayer); } \/\/ se dibuja al recalcular\n      saveParams();\n    });\n\n    \/\/ ====== Avanzado: auto factor ripio ======\n    document.getElementById('autoRipio').addEventListener('change', (e)=>{\n      const manual = !e.target.checked;\n      const input = document.getElementById('factorRipio');\n      input.disabled = !manual;\n      saveParams();\n    });\n\n    \/\/ ====== Habilitar Calcular \/ evitar mismo origen-destino ======\n    function updateState(){\n      const o = document.getElementById('origen').value;\n      const d = document.getElementById('destino').value;\n      const same = o && d && o===d;\n      document.getElementById('sameWarn').style.display = same ? 'block' : 'none';\n      document.getElementById('btnCalcular').disabled = !(o && d) || same;\n      document.getElementById('btnCalcular').title = same ? 'Origen y destino no pueden ser iguales' : 'Calcular ruta';\n    }\n    ['origen','destino'].forEach(id=>{\n      document.getElementById(id).addEventListener('change', updateState);\n      document.getElementById(id).addEventListener('input',  updateState);\n    });\n\n    \/\/ ====== Bottom sheet con localStorage ======\n    const panel = document.getElementById('panel');\n    const sheetToggle = document.getElementById('sheetToggle');\n    function setSheet(expanded){\n      if (window.innerWidth >= 900) return;\n      panel.classList.toggle('sheet-expanded', expanded);\n      panel.classList.toggle('sheet-collapsed', !expanded);\n      panel.setAttribute('aria-expanded', String(expanded));\n      sheetToggle.setAttribute('aria-expanded', String(expanded));\n      sheetToggle.textContent = expanded ? '\u2b07\ufe0f Colapsar' : '\u2b06\ufe0f Expandir';\n      try{ localStorage.setItem('ca_sheet_expanded', expanded ? '1':'0'); }catch(_){}\n    }\n    sheetToggle.addEventListener('click', ()=>{\n      const expanded = panel.classList.contains('sheet-collapsed');\n      setSheet(expanded);\n    });\n    function initSheet(){\n      if (window.innerWidth < 900){\n        let expanded = false;\n        try{\n          const saved = localStorage.getItem('ca_sheet_expanded');\n          if(saved==='1') expanded = true;\n        }catch(_){}\n        setSheet(expanded);\n      }else{\n        panel.classList.remove('sheet-expanded','sheet-collapsed');\n        panel.removeAttribute('aria-expanded');\n        sheetToggle.setAttribute('aria-expanded','false');\n      }\n    }\n    window.addEventListener('resize', initSheet);\n\n    \/\/ ====== Persistencia de par\u00e1metros ======\n    const PARAMS_KEY='ca_params_v2'; \/\/ incluye toggleSurface\n    function saveParams(){\n      try{\n        const obj = {\n          rendimiento: parseFloat(document.getElementById('rendimiento').value)||10,\n          precio:      parseFloat(document.getElementById('precio').value)||1500,\n          velocidad:   parseFloat(document.getElementById('velocidad').value)||70,\n          toggleLeyenda: document.getElementById('toggleLeyenda').checked,\n          toggleFuel:    document.getElementById('toggleFuel').checked,\n          toggleFerries: document.getElementById('toggleFerries').checked,\n          toggleSurface: document.getElementById('toggleSurface').checked,\n          autoRipio:     document.getElementById('autoRipio').checked,\n          factorRipio:   parseInt(document.getElementById('factorRipio').value)||70\n        };\n        localStorage.setItem(PARAMS_KEY, JSON.stringify(obj));\n      }catch(_){}\n    }\n    function loadParams(){\n      try{\n        const raw = localStorage.getItem(PARAMS_KEY);\n        if(!raw) return;\n        const p = JSON.parse(raw);\n        ['rendimiento','precio','velocidad','factorRipio'].forEach(id=>{\n          if(p[id]!=null) document.getElementById(id).value = p[id];\n        });\n        [['toggleLeyenda','leyendaBox',true],['toggleFuel',fuelLayer,true],['toggleFerries',ferryLayer,true],['toggleSurface',surfaceLayer,true]].forEach(([id,target,layer])=>{\n          if(typeof p[id]==='boolean'){\n            const el=document.getElementById(id); el.checked=p[id];\n            if(id==='toggleLeyenda'){ document.getElementById('leyendaBox').style.display = el.checked?'block':'none'; }\n            else{\n              if(el.checked){ if(layer && !map.hasLayer(layer)) map.addLayer(layer); }\n              else{ if(layer && map.hasLayer(layer)) map.removeLayer(layer); }\n            }\n          }\n        });\n        if(typeof p.autoRipio==='boolean'){\n          document.getElementById('autoRipio').checked=p.autoRipio;\n          document.getElementById('factorRipio').disabled = p.autoRipio;\n        }\n      }catch(_){}\n    }\n    ['rendimiento','precio','velocidad','factorRipio'].forEach(id=>{\n      document.getElementById(id).addEventListener('input', saveParams);\n      document.getElementById(id).addEventListener('change', saveParams);\n    });\n\n    \/\/ ====== Calcular con Enter ======\n    document.addEventListener('keydown', (e)=>{\n      if(e.key === 'Enter'){\n        const btn = document.getElementById('btnCalcular');\n        if(!btn.disabled){ e.preventDefault(); calcularRuta(); }\n      }\n    });\n\n    \/\/ Botones principales\n    document.getElementById('btnCalcular').addEventListener('click', (e)=>{ e.preventDefault(); calcularRuta(); });\n    document.getElementById('btnLimpiar').addEventListener('click', ()=> limpiarRuta(true) );\n\n    \/\/ Iniciar\n    (function init(){\n      document.getElementById('origen').selectedIndex = 0;\n      document.getElementById('destino').selectedIndex = 0;\n      document.getElementById('btnCalcular').disabled = true;\n      initSheet();\n      loadParams(); \/\/ \u2190 aplica par\u00e1metros guardados\n      window.addEventListener('beforeunload', saveParams);\n    })();\n  <\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-670ca0e e-flex e-con-boxed e-con e-parent\" data-id=\"670ca0e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Calculadora Carretera Austral v4.36.1 (perfil de superficie + fix) \u2b06\ufe0f Expandir Calculadora \u2013 Carretera Austral (v4.36.1) Origen \u2014 Selecciona \u2014Puerto MonttPuerto VarasCocham\u00f3Hornopir\u00e9nCaleta GonzaloChait\u00e9nLa JuntaPuyuhuapiCoyhaiqueVilla Cerro CastilloPuerto R\u00edo TranquiloChile ChicoCochraneCaleta TortelVilla O&#8217;Higgins El origen y el destino no pueden ser iguales. Destino \u2014 Selecciona \u2014Villa O&#8217;HigginsCaleta TortelCochranePuerto R\u00edo TranquiloChile ChicoVilla Cerro CastilloCoyhaiquePuyuhuapiLa JuntaChait\u00e9nCaleta GonzaloHornopir\u00e9nCocham\u00f3Puerto VarasPuerto Montt [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3213","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Calculadora de rutas Carretera Austral - TPRentacar<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tprentacar.com\/en\/calculadora-para-tu-viaje\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Calculadora de rutas Carretera Austral - TPRentacar\" \/>\n<meta property=\"og:description\" content=\"Calculadora Carretera Austral v4.36.1 (perfil de superficie + fix) \u2b06\ufe0f Expandir Calculadora \u2013 Carretera Austral (v4.36.1) Origen \u2014 Selecciona \u2014Puerto MonttPuerto VarasCocham\u00f3Hornopir\u00e9nCaleta GonzaloChait\u00e9nLa JuntaPuyuhuapiCoyhaiqueVilla Cerro CastilloPuerto R\u00edo TranquiloChile ChicoCochraneCaleta TortelVilla O&#8217;Higgins El origen y el destino no pueden ser iguales. Destino \u2014 Selecciona \u2014Villa O&#8217;HigginsCaleta TortelCochranePuerto R\u00edo TranquiloChile ChicoVilla Cerro CastilloCoyhaiquePuyuhuapiLa JuntaChait\u00e9nCaleta GonzaloHornopir\u00e9nCocham\u00f3Puerto VarasPuerto Montt [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tprentacar.com\/en\/calculadora-para-tu-viaje\/\" \/>\n<meta property=\"og:site_name\" content=\"TPRentacar\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-03T14:41:58+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/tprentacar.com\\\/calculadora-para-tu-viaje\\\/\",\"url\":\"https:\\\/\\\/tprentacar.com\\\/calculadora-para-tu-viaje\\\/\",\"name\":\"Calculadora de rutas Carretera Austral - TPRentacar\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tprentacar.com\\\/#website\"},\"datePublished\":\"2025-09-17T02:06:48+00:00\",\"dateModified\":\"2025-10-03T14:41:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tprentacar.com\\\/calculadora-para-tu-viaje\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tprentacar.com\\\/calculadora-para-tu-viaje\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tprentacar.com\\\/calculadora-para-tu-viaje\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/tprentacar.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Calculadora de rutas Carretera Austral\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tprentacar.com\\\/#website\",\"url\":\"https:\\\/\\\/tprentacar.com\\\/\",\"name\":\"TPRenta Car\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/tprentacar.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tprentacar.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/tprentacar.com\\\/#organization\",\"name\":\"TPRenta Car\",\"url\":\"https:\\\/\\\/tprentacar.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/tprentacar.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/tprentacar.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/tprentacar.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/logo.png\",\"width\":477,\"height\":381,\"caption\":\"TPRenta Car\"},\"image\":{\"@id\":\"https:\\\/\\\/tprentacar.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Calculadora de rutas Carretera Austral - TPRentacar","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tprentacar.com\/en\/calculadora-para-tu-viaje\/","og_locale":"en_US","og_type":"article","og_title":"Calculadora de rutas Carretera Austral - TPRentacar","og_description":"Calculadora Carretera Austral v4.36.1 (perfil de superficie + fix) \u2b06\ufe0f Expandir Calculadora \u2013 Carretera Austral (v4.36.1) Origen \u2014 Selecciona \u2014Puerto MonttPuerto VarasCocham\u00f3Hornopir\u00e9nCaleta GonzaloChait\u00e9nLa JuntaPuyuhuapiCoyhaiqueVilla Cerro CastilloPuerto R\u00edo TranquiloChile ChicoCochraneCaleta TortelVilla O&#8217;Higgins El origen y el destino no pueden ser iguales. Destino \u2014 Selecciona \u2014Villa O&#8217;HigginsCaleta TortelCochranePuerto R\u00edo TranquiloChile ChicoVilla Cerro CastilloCoyhaiquePuyuhuapiLa JuntaChait\u00e9nCaleta GonzaloHornopir\u00e9nCocham\u00f3Puerto VarasPuerto Montt [&hellip;]","og_url":"https:\/\/tprentacar.com\/en\/calculadora-para-tu-viaje\/","og_site_name":"TPRentacar","article_modified_time":"2025-10-03T14:41:58+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/tprentacar.com\/calculadora-para-tu-viaje\/","url":"https:\/\/tprentacar.com\/calculadora-para-tu-viaje\/","name":"Calculadora de rutas Carretera Austral - TPRentacar","isPartOf":{"@id":"https:\/\/tprentacar.com\/#website"},"datePublished":"2025-09-17T02:06:48+00:00","dateModified":"2025-10-03T14:41:58+00:00","breadcrumb":{"@id":"https:\/\/tprentacar.com\/calculadora-para-tu-viaje\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tprentacar.com\/calculadora-para-tu-viaje\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/tprentacar.com\/calculadora-para-tu-viaje\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/tprentacar.com\/"},{"@type":"ListItem","position":2,"name":"Calculadora de rutas Carretera Austral"}]},{"@type":"WebSite","@id":"https:\/\/tprentacar.com\/#website","url":"https:\/\/tprentacar.com\/","name":"TPRenta Car","description":"","publisher":{"@id":"https:\/\/tprentacar.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tprentacar.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/tprentacar.com\/#organization","name":"TPRenta Car","url":"https:\/\/tprentacar.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tprentacar.com\/#\/schema\/logo\/image\/","url":"https:\/\/tprentacar.com\/wp-content\/uploads\/2024\/03\/logo.png","contentUrl":"https:\/\/tprentacar.com\/wp-content\/uploads\/2024\/03\/logo.png","width":477,"height":381,"caption":"TPRenta Car"},"image":{"@id":"https:\/\/tprentacar.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/tprentacar.com\/en\/wp-json\/wp\/v2\/pages\/3213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tprentacar.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tprentacar.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tprentacar.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tprentacar.com\/en\/wp-json\/wp\/v2\/comments?post=3213"}],"version-history":[{"count":0,"href":"https:\/\/tprentacar.com\/en\/wp-json\/wp\/v2\/pages\/3213\/revisions"}],"wp:attachment":[{"href":"https:\/\/tprentacar.com\/en\/wp-json\/wp\/v2\/media?parent=3213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}