La API de Ruteo utiliza la Red Nacional de Caminos y todas sus especificaciones técnicas, para generar el resultado de acuerdo a las restricciones de circulación en el mundo real como sentidos de circulación vehicular, pasos a desnivel, distribuidores viales, enlaces, retornos glorietas, y maniobras prohibidas. Además, considera tres posibles rutas: preferentemente libre, preferentemente cuota y la ruta sugerida para dar alternativas de traslado o viaje con diferente coste.
Los datos espaciales en formato Shapefile (SHP), datos tabulares, metadatos y documentación técnica de la Red Nacional de Caminos en su versión más reciente, puede ser descargada de manera gratuita en el sitio de descargas de INEGI mediante la siguiente URL:
Explore el ruteo en los sistemas de mapas del INEGI: Mapa Digital de México.
MDM: http://gaia.inegi.org.mx/mdm6
1.- Los sistemas o aplicaciones deben hacer referencia a la API de Ruteo y al INEGI Instituto Nacional de Estadística y Geografía, tanto en su nombre como sus logotipos.
2.- De difundir los resultados en cualquier documento, reporte o medio de difusión, será obligación del usuario dar el crédito respectivo.
3.- Se deben hacer las siguientes aclaraciones sobre su funcionalidad.
a. La Red Nacional de Caminos es actualizada cada año y publicada el 15 de diciembre de ese mismo año. El grado de actualización estará sujeto a la disponibilidad de insumos al momento de su digitalización y a los objetivos considerados.
b. La base de datos de la API es actualizada con la versión más reciente de la Red Nacional de Caminos una vez que ha sido publicada el 15 de diciembre y en un plazo no mayor a una semana.
c. Las rutas generadas están condicionadas a las especificaciones técnicas de la Red Nacional de Caminos.
d. El tiempo estimado de traslado entre un origen y un destino, considera transitar en condiciones óptimas, de forma continua, sin semáforos, tráfico, inclemencias del clima, paradas por carga de combustible o cualquier factor que incremente el tiempo del viaje.
e. Las tarifas de peaje en casetas de autopistas, puentes o túneles, así como los precios de combustible, pueden diferir de los costos reales, debido al periodo que se requiere para su actualización en cada alza o cambio, aunado a la regionalización del costo de los combustibles.
f. Por lo general el incremento de tarifas de peaje se presenta en los primeros tres meses de cada año, pero por aniversario de operación de autopistas, los incrementos se presentan en el transcurso del año. Por tanto, la principal actualización en la RNC se realiza de enero a marzo, y se contempla sincronizarla en la API en tres tiempos: primera semana de abril, primera semana de julio, y primera semana de noviembre.
g. Tanto el producto espacial como el sistema son perfectibles, por lo que se contempla una actualización permanente orientada a la mejora continua.
h. Es responsabilidad del usuario el uso que se le pueda dar a los resultados de este simulador.
y las notas vigentes que se publiquen en cada actualización.
3. Métodos para obtener información a través de la API
4. Registro y solicitud de token
Bienvenidos a la documentación para desarrolladores del API de Ruteo. El INEGI se une a la iniciativa de libre acceso con el objetivo de ampliar la disponibilidad de información para los usuarios.
Este documento está dirigido para los desarrolladores familiarizados con la programación Java Script y Sistemas de Información Geográfica para web.
Función | Parámetros | Funcionalidad | Retoma |
---|---|---|---|
buscalinea | x, y, escala, tipo formato devuelto | Encontrar línea más cercana en función de un buffer | ID, source, target y nombre de la línea, geometría |
buscadestino | Cadena texto, tipo formato devuelto | Buscar un origen o destino | Arreglo{ID y nombre del Destino} |
optima, cuota, libre | Datos de inicio y fin, tipo vehículo, ejes excedentes, barreras, tipo formato devuelto | Calcular la ruta | Línea de ruta, distancia, tiempo, costo de peaje, costo casetas, costo ejes excedentes |
Detalle_o, detalle_c, detalle_l | Datos de inicio y fin, tipo vehículo, ejes excedentes, barreras, tipo formato devuelto | Obtener el itinerario o detalle de la ruta | Arreglo de tramos de red {geometría, nombre, distancia, tiempo, costo de caseta, geometría punto caseta, costo eje excedente, giro} |
combustible | tipo formato devuelto | Regresa los tipos combustible y sus costos promedios | Tipo, costo, tipo-costo |
Nota:Los parámetros enviados deberán ser mediante el método POST.
Definiciones
Destino:Sitio de partida o llegada para una ruta. Están integrados por localidades, instalaciones de transporte como aeropuertos y puertos, así como sitios de interés contenidos en la Red Nacional de Caminos.
Línea:Es cualquier segmento de la Red Nacional de Caminos.
Token:Cadena de caracteres utilizada como clave de acceso por medio del parámetro key con una longitud igual a 36 caracteres, proporcionada por INEGI.
La búsqueda de destinos incluye aquellos registrados en la Red Nacional de Caminos como localidades urbanas y rurales, así como los sitios de interés que pueden ser instalaciones de servicios como aeropuertos, puertos, entre otros como servicios médicos, o centros educativos de nivel superior, así como sitios atractivos para el turismo como playas, cascadas, zonas arqueológicas, museos, pueblos mágicos, y muchos más. En cada actualización de la Red Nacional de Caminos, se definen líneas de trabajo para ampliar el universo de sitios, por lo que cada año serán incrementados.
Para hacer una búsqueda de destinos se utiliza la siguiente URL:
https://gaia.inegi.org.mx/sakbe_v3.1/buscadestino
ParámetrosLos parámetros son enviados mediante el método POST.
Devolverá todos los destinos que el parámetro buscar coincida con su nombre o parte del mismo ordenados de mayor a menor frecuencia solicitada. Se puede utilizar una coma (,) para separar lo que desea encontrar y una entidad federativa en específico (esto puede ser la palabra completa, parte de ella o su abreviatura).
Si la palabra de búsqueda es cascada se obtendrá como resultado todas las cascadas del país. Si la palabra de búsqueda es cascada, jal se obtendrá como resultado todas las cascadas del estado de Jalisco.
Buscaremos los 15 destinos más buscados que coincidan con la palabra Durango, con una proyección GRS80 y formato JSON.
https://gaia.inegi.org.mx/sakbe_v3.1/buscadestino { buscar: ”Durango”,type: “json”,num:15,key: "<token>" }
Objeto de parámetros a enviar mediante el método POST, por ejemplo para la función $.post() de jquery.
El API devolverá 3 objetos: data, meta y response.
El objeto data contiene los resultados, en este caso un arreglo de objetos con los destinos encontrados.
El objeto meta contiene la fuente
El objeto response contiene un atributo llamado succes donde contendrá true indicando que fue correcto el resultado o false indicando que ocurrió un error, además un mensaje en el atributo message donde se explica lo ocurrido en caso de existir un error o la plabra "OK" cuando es correcto el resultado.
El API devolverá una estructura XML como se muestra en la imagen, donde en la etiqueta
Para hacer una búsqueda de líneas en la red se utiliza la siguiente url:
https://gaia.inegi.org.mx/sakbe_v3.1/buscalinea
ParámetrosLos parámetros son enviados mediante el método POST.
Devolverá la línea más cercana a la coordenada enviada.
Para una escala de visualización de 1:10000 sobre las coordenadas 32.4952798422821 de latitud y -117.121925383366 de longitud.
https://gaia.inegi.org.mx/sakbe_v3.1/buscalinea { type: “json”,escala: 10000,x: -117.121925383366,y: 32.4952798422821,key:“<token>”}
Objeto de parámetros a enviar mediante el método POST, por ejemplo para la función $.post() de jquery.
En caso de utilizar la proyección Spherical Mercator deberá de incluir el parámetro proj con el valor MERC y los parámetros x y y deberán estar expresados en metros.
Para hacer el cálculo de rutas existen 3 tipos: óptima, preferentemente cuota y preferentemente libre, y se utilizan las siguientes URLs:
Los parámetros son enviados mediante el método POST.
* Parámetro opcional, aplica solo si se trata de una línea.
** Parámetro opcional, aplica solo si se trata de un destino.
Tabla 1 |
Tabla 2 |
Tabla 3 |
Devolverá los valores de la ruta.
Existen 4 formas de calcular rutas:
Tipo de petición:
https://gaia.inegi.org.mx/sakbe_v3.1/libre https://gaia.inegi.org.mx/sakbe_v3.1/cuota https://gaia.inegi.org.mx/sakbe_v3.1/optimaParámetros:
{id_i: 1,source_i: 254,target_i: 255,id_f: 775167,source_f: 250771,target_f: 687808,v: 1,type:"json",proj:"MERC"key:“<token>”} |
Datos de las dos líneas obtenidas(id_routing_net, source, target) mediante la función buscalinea. |
Tipo de petición:
https://gaia.inegi.org.mx/sakbe_v3.1/libre https://gaia.inegi.org.mx/sakbe_v3.1/cuota https://gaia.inegi.org.mx/sakbe_v3.1/optimaParámetros
{dest_i: 3345,dest_f: 222,v: 1,type:"json",proj:"MERC"key:“<token>”} |
Datos de los dos destinos (id_dest) obtenidos mediante la función buscadestino. |
Tipo de petición:
https://gaia.inegi.org.mx/sakbe_v3.1/libre https://gaia.inegi.org.mx/sakbe_v3.1/cuota https://gaia.inegi.org.mx/sakbe_v3.1/optimaParámetros
{id_i: 775167,source_i: 250771,target_i: 687808,dest_f: 245,v:1,e:1,type:"json",proj:"MERC"b:"25,696,748",key:“<token>”} |
Datos de la línea y el destino obtenidos mediante las funciones buscalinea y buscadestino respectivamente. |
Tipo de petición:
https://gaia.inegi.org.mx/sakbe_v3.1/libre https://gaia.inegi.org.mx/sakbe_v3.1/cuota https://gaia.inegi.org.mx/sakbe_v3.1/optimaParámetros
{dest_i: 1,id_f: 775167,source_f: 250771,target_f: 687808,v:1,b:"25,198,4578",type:"json",proj:"MERC"key:“<token>”} |
Datos del destino y la línea obtenidos mediante las funciones buscadestino y buscalinea respectivamente. |
El detalle de la ruta se compone de una secuencia de elementos viales, agrupados por el tipo de vialidad, código de carretera y nombre, así como la distancia por recorrer.
Para obtener el detalle de la ruta se utiliza las siguientes URLs:
https://gaia.inegi.org.mx/sakbe_v3.1/detalle_o Detalle de la ruta optima
https://gaia.inegi.org.mx/sakbe_v3.1/detalle_c Detalle de la ruta preferentemente cuota
https://gaia.inegi.org.mx/sakbe_v3.1/detalle_l Detalle de la ruta preferentemente libre
ParámetrosSe utilizarán los mismos parámetros del cálculo de ruta , bajo las mismas reglas para las 4 formas de consulta.
ResultadoDevolverá los datos de los segmentos que integran su ruta y una geometría de tipo punto que estará ubicada al inicio de cada segmento, así como también el costo de peaje en el caso que ese segmento cruce una caseta de cobro.
Giro | |
---|---|
0 | Continúe derecho |
1 | Gire a la izquierda |
2 | Gire a la derecha |
3 | Gire ligeramente a la izquierda |
4 | Gire ligeramente a la derecha |
Ejemplo
Por ejemplo, si realiza una ruta de destino a destino de preferentemente cuota y sin barreras deberá obtener el detalle de la siguiente manera:
Tipo de petición:
https://gaia.inegi.org.mx/sakbe_v3.1/detalle_c https://gaia.inegi.org.mx/sakbe_v3.1/detalle_o https://gaia.inegi.org.mx/sakbe_v3.1/detalle_lParámetros
{dest_i: 3345,dest_f: 222,v:1,type:"json",proj:"MERC"key:“<token>”} |
Datos de los dos destinos(id_dest) obtenidos mediante la función buscadestino. |
NOTA: Cabe aclarar que esta función puede y debe ser ejecutada en paralelo con la función de cálculo de ruta para su mayor eficiencia en los tiempos de ejecución.
Por ejemplo, si quiere obtener la ruta optima y la ruta libre debe lanzar al mismo tiempo las siguientes 4 funciones: optima, detalle_o, libre y detalle_l.
Retorna 4 tipos de combustibles más comunes y su costo promedio que se consultan el primer día hábil de cada semana en la página web de la Comisión Reguladora de Energía del Gobierno Federal: https://www.gob.mx/cre
Debido a la liberación de los precios de la gasolina al inicio de 2017, donde el precio está condicionado a la ubicación de las estaciones de servicio en las 90 regiones en las que ha sido dividido el País, además de los ajustes que se estén dando a lo largo del año, el dato que provee esta API solo es una referencia en función del precio promedio nacional excluyendo las 7 regiones sobre la frontera. También lo que refiere al gas LP el precio es un promedio ponderado que publica la Comisión Reguladora de Energía. A partir del 30 de noviembre de 2017 se liberaron los precios de las gasolinas lo que dificulta estimar un promedio, por tanto, se estarán mostrando los precios a esta fecha hasta que se tenga una fuente confiable de consulta. Se sugiere para la interface la opción de que el usuario registre el costo que el considere conveniente para su estimación.
https://gaia.inegi.org.mx/sakbe_v3.1/combustible
ParámetrosLos parámetros son enviados mediante el método POST.
https://gaia.inegi.org.mx/sakbe_v3.1/combustible
{
type:"json",
key:“<token>”
}
JSON y XML recibidoSe otorga el token de manera automatizada y de forma inmediata vía correo electrónico una vez que han sido registrados los datos del usuario y un correo válido. Estos datos son importantes para proveerles información de actualizaciones de este sistema o para fines de notificación de alguna ventana de tiempo para mantenimiento de servidores.
https://gaia.inegi.org.mx/sakbe_v3.1/genera_token.jsp
Una vez registrados los datos oprimir el botón “Generar Token” y le será enviado el token, key o llave por correo electrónico, que deberá utilizar en cada una de las peticiones hacia la API.
Se permite un solo registro de correo electrónico. Si intenta registrarse nuevamente recibirá a su correo el token generado anteriormente.
<!DOCTYPE html> <html> <head> <Title> Rutas - API </title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="CSS/CSS.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://www.openlayers.org/api/OpenLayers.js"></script> <script src="js/sakbe.js"></script> </head> <body onload="init()" > <id="map"> </div > <div class="sakbe" id="sakbe" > <div > Origen <input id="origen" type="text" / ></div > <div >Destino <input id="destino" type="text" / > </div > <div id="resultado" > <b >Dando click en el mapa, seleccione dos Carreteras o vialidades y espera a que se muestre la ruta </b > </div > </div > <img id="cargando" class="hidden" src="img/cargando.gif" width="70px" height="70px"/ > </body> </html>
var aProj = new OpenLayers.Projection("EPSG:4326"); var deProj = new OpenLayers.Projection("EPSG:900913"); var id_i=0; var map, layer; var style_ruta = { strokeColor: "#0000EE", strokeWidth: 6, strokeDashstyle: "solid", pointRadius: 15, pointerEvents: "visiblePainted", title: "Ruta Sugerida", strokeOpacity: 0.5 }; var vector_layer = new OpenLayers.Layer.Vector('Ruta',{style: style_ruta}); OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { defaultHandlerOptions: { 'single': true, 'double': false, 'pixelTolerance': 0, 'stopSingle': false, 'stopDouble': false }, initialize: function(options) { this.handlerOptions = OpenLayers.Util.extend( {}, this.defaultHandlerOptions ); OpenLayers.Control.prototype.initialize.apply( this, arguments ); this.handler = new OpenLayers.Handler.Click( this, { 'click': this.trigger }, this.handlerOptions ); }, trigger: function(e) { var lonlat = map.getLonLatFromPixel(e.xy); var escala = map.getScale(); EncuentraRoad(lonlat.lat,lonlat.lon,escala); } }); function init(){ map = new OpenLayers.Map( 'map',{ controls: [ new OpenLayers.Control.ScaleLine(), new OpenLayers.Control.MousePosition(), new OpenLayers.Control.Navigation(), new OpenLayers.Control.KeyboardDefaults() ], projection: new OpenLayers.Projection('EPSG:900913'), displayProjection: new OpenLayers.Projection("EPSG:4326"), numZoomLevels: 21 }); base1 = new OpenLayers.Layer.WMS( "Mapa Base", "http://gaiamapas1.inegi.org.mx/mdmCache/service/wms?", {layers: 'MapaBaseTopograficov61_consombreado'}, {isBaseLayer: 'true' } ); vector_puntos_ruta = new OpenLayers.Layer.Vector("Puntos Ruta", { styleMap: new OpenLayers.StyleMap({ "default": new OpenLayers.Style(OpenLayers.Util.applyDefaults({ externalGraphic: "img/punto.png", graphicOpacity: 1, rotation: 0, pointRadius: 20, graphicYOffset: -37, graphicXOffset: -18 }, OpenLayers.Feature.Vector.style["default"])) }) }); map.addLayers([base1,vector_puntos_ruta]); navigator.geolocation.getCurrentPosition(PermitirUbicacion,NoUbicacion); } ///////////////// TERMINA FUNCION Init() function PermitirUbicacion(pos){ IrPosicion(pos.coords.longitude, pos.coords.latitude); } function NoUbicacion(pos){ IrPosicion(-104.62426,24.03606); } function IrPosicion(lat,lon){ map.setCenter( new OpenLayers.LonLat(lat,lon).transform(new OpenLayers.Projection("EPSG:4326"),map.getProjectionObject()), 4 ); var click = new OpenLayers.Control.Click(); map.addControl(click); click.activate(); } function EncuentraRoad(y,x,escala) { var datos = { type: "json", key: "kqvCNH1V-keUF-rSVa-O1tf-gdqFN6DynMNN", proj: "MERC", escala:escala, y:y,//latitud x:x//longitud }; var geojson; try{ $.post("https://gaia.inegi.org.mx/sakbe_v3.1/buscalinea", datos, function (obj) { geojson = $.parseJSON(obj.data.geojson); var geojson_punto = new OpenLayers.Format.GeoJSON(); if (id_i==0){ id_i=obj.data.id_routing_net; source_i=obj.data.source; target_i=obj.data.target; $("#origen").val(obj.data.nombre); vector_puntos_ruta.addFeatures(geojson_punto.read(geojson)); }else{ id_f=obj.data.id_routing_net; source_f=obj.data.source; target_f=obj.data.target; $("#destino").val(obj.data.nombre); vector_puntos_ruta.addFeatures(geojson_punto.read(geojson)); rutear(); } }); } catch (err) { alert("Ha ocurrido un error: " + err.message); } } function rutear() { map.addLayer(vector_layer); datos = {type: "json", key: "kqvCNH1V-keUF-rSVa-O1tf-gdqFN6DynMNN", proj: "MERC", id_i:id_i, source_i: source_i, target_i: target_i, id_f: id_f, source_f: source_f, target_f: target_f, v: 2, e: 0}; $("#cargando").removeClass("hidden"); rutaSugerida(datos); detalleSugerida(datos); } function rutaSugerida(datos){ var geojson_format = new OpenLayers.Format.GeoJSON(); $.post("https://gaia.inegi.org.mx/sakbe_v3.1/optima", datos, function (obj) { var codHtml=" <table style='color: white' > <tr > < td > < b > Distancia: < b > ; < /td > < td > "+obj.data.long_km+" km >/td </tr >"+ " <tr > <td > <b >Tiempo: </b > </td > <td >"+obj.data.tiempo_min+" min </td > </tr >"+ " <tr > <td > <b >Costo Casetas: </b > </td > <td >$ "+obj.data.costo_caseta+" </td ></tr ></table >"; $("#resultado").html(codHtml); vector_layer.addFeatures(geojson_format.read(obj.data.geojson)); map.zoomToExtent(vector_layer.getDataExtent()); }); } function detalleSugerida(datos){ $.post("https://gaia.inegi.org.mx/sakbe_v3.1/detalle_o", datos, function (obj) { /* obj.data Es un vector de objetos con N posiciones, para ver el resultado de este vector antes de ejecutar una ruta abra las herramientas del desarrollador en su navegador y elija la pestaña de Network o Red En este espacio deberá de usar los datos del vector obj.data */ $("#cargando").addClass("hidden"); }); }
<html > <head> <title>Buscar Destinos - API </title> <meta charset="utf-8"> <script src="js/jquery-1.11.1.min.js" type="text/javascript"></script> <script src="js/apiSakbeJson.js"></script> <style> input{ font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif; width:250px; } #titulo{ font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif; } .lista{ width: 100%; height: 245px; overflow-y: auto; } </style > </head> <body> <img src="img/Logo_transp_sakbe.png" />
Buscar Localidades o Sitios de interés para el turismo </p> </b> <div> <input type="text" placeholder="Buscar... " id="busqueda" onchange="buscarDestino(this.value);" onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" /> </div > <div class="lista" id="lista"> </div> </body> </html>
var servidor = "https://gaia.inegi.org.mx/sakbe_v3.1/"; function buscarDestino(valor){ if (valor.length>3) { $.post(servidor+"buscadestino", { type:"json", buscar: valor, proj: "MERC", num:15, key: "x4cGBaOC-423Z-A9ii-AKwM-QWiCfq63rMu9" }, function( json ){ var codHtml = '<table >'; for(var i = 0; i < json.data.length; i++){ codHtml +='<tr > <td style="width:60px" >'+json.data[i].id_dest+' <td ><td >'+json.data[i].nombre+' <td%gt;<tr >'; } $('#lista').html(codHtml); }); } }