diff --git a/content/de/index.md b/content/de/index.md deleted file mode 100644 index b37d0cc..0000000 --- a/content/de/index.md +++ /dev/null @@ -1,10 +0,0 @@ -+++ -Description = "" -date = 2015-05-06T11:09:35Z -title = "Overpass API is a highly optimized, read-only API built for gathering OSM map data." -type = "front" -ref = "API docs" -learn = "Learn" -+++ - -Currently untranslated diff --git a/content/en/exercises/intro/3.md b/content/en/exercises/intro/3.md index 310c1ba..6aa0bdb 100644 --- a/content/en/exercises/intro/3.md +++ b/content/en/exercises/intro/3.md @@ -9,7 +9,7 @@ code: | out; instructions: | 1. Seems that we weren’t specific enough! However, we do know that Bob is next to the tallest tree in the area, let’s use that info to search for him! Click on the nodes on the map view and find the tallest tree! - 2. You can combine filters by just typing them in next to the query statement just like what we did with `[natural=tree`]. Remember to put the second filter before the semicolon! + 2. You can combine filters by just typing them in next to the query statement just like what we did with `[natural=tree]`. Remember to put the second filter before the semicolon! hint: Try testing for the height of the tallest tree. Combine the filters by putting them next to each other. answer: | node(48.5657094, 13.4490548, 48.5662416, 13.4501676) diff --git a/content/en/exercises/intro/4.md b/content/en/exercises/intro/4.md index 62447d3..7300b7a 100644 --- a/content/en/exercises/intro/4.md +++ b/content/en/exercises/intro/4.md @@ -1,4 +1,4 @@ ---- +w--- date: "2015-07-04T16:35:50+08:00" title: "Filter by Tag III?" type: "exercise" diff --git a/content/en/exercises/intro/6.md b/content/en/exercises/intro/6.md index 04d0379..30bcd2d 100644 --- a/content/en/exercises/intro/6.md +++ b/content/en/exercises/intro/6.md @@ -9,13 +9,13 @@ code: | out; instructions: | 1. Our `around` filter gave us a bunch of nodes around our first node, but there are no restaurants in it, and there are too many nodes! - 2. Increase our around distance a bit more. Bob says he sees a restaurant about a 150 meters distance from him, so go ahead and use that as a distance filter for around. + 2. Increase our around distance a bit more. Bob says he sees a restaurant about a 450 meters distance from him, so go ahead and use that as a distance filter for around. 3. Use a filter by tag to query for restaurants. You can use the tag `[amenity=restaurant]` for this. 4. Remember that we are filtering our data from our around set, so make sure to add the filter tag after our around filter. hint: Remember to make a new query statement! Don't just add around to the first line. answer: | node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; - node(around:150)[amenity=restaurant]; + node(around:450)[amenity=restaurant]; out; --- diff --git a/content/en/exercises/intro/7.md b/content/en/exercises/intro/7.md index 4ceddeb..2322566 100644 --- a/content/en/exercises/intro/7.md +++ b/content/en/exercises/intro/7.md @@ -5,7 +5,7 @@ type: "exercise" section: "exercise" code: | node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; - node(around:150)[amenity=restaurant]; + node(around:450)[amenity=restaurant]; out; area; @@ -22,7 +22,7 @@ instructions: | hint: Remember to use an `area` query! answer: | node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; - node(around:150)[amenity=restaurant]; + node(around:450)[amenity=restaurant]; out; area[name=Inn]; diff --git a/content/en/exercises/intro/8.md b/content/en/exercises/intro/8.md index 8f0549b..49ae6a7 100644 --- a/content/en/exercises/intro/8.md +++ b/content/en/exercises/intro/8.md @@ -5,7 +5,7 @@ type: "exercise" section: "exercise" code: | node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; - node(around:150)[amenity=restaurant]; + node(around:450)[amenity=restaurant]; out; area[name=Inn]; @@ -13,17 +13,17 @@ code: | out; instructions: | - 1. We need to find Bob’s bicycle, which he knows is about 100 meters away from the restaurant. We will have to use the `around` statement again. + 1. We need to find Bob’s bicycle, which he knows is about 120 meters away from the restaurant. We will have to use the `around` statement again. 2. Bicycle parking areas are tagged as `[amenity=bicycle_parking]`. You should now be comfortable knowing what statement we need to use. 3. Note that our statement uses `around`, so make sure to place the statement properly so that it finds the parking space around _the restaurant_ instead of _the tower_. Remember that Overpass has the concept of ‘flow’. Where do you think you should put our _around_ statement? 4. Once you’ve added it, make sure to also add `out;` after your statement to print the bicycle parking node. hint: The around query relies on the result set (in this case the result of the query above it) answer: | node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; - node(around:150)[amenity=restaurant]; + node(around:450)[amenity=restaurant]; out; - node(around:100)[amenity=bicycle_parking]; + node(around:120)[amenity=bicycle_parking]; out; area[name=Inn]; diff --git a/content/en/exercises/intro/9.md b/content/en/exercises/intro/9.md index 29a0fcf..a5fd72e 100644 --- a/content/en/exercises/intro/9.md +++ b/content/en/exercises/intro/9.md @@ -5,10 +5,10 @@ type: "exercise" section: "exercise" code: | node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; - node(around:150)[amenity=restaurant]; + node(around:450)[amenity=restaurant]; out; - node(around:100)[amenity=bicycle_parking]; + node(around:120)[amenity=bicycle_parking]; out; area[name=Inn]; @@ -31,6 +31,6 @@ Bob carefully examines the bike in the parking space, trying to find his bike. Now that Bob is on his bike, he now needs to go the observatory to find his wallet. Since we already know Bob has a bad sense of direction (I mean, he did get lost!) it’d be best to show Bob the main road he needs to take to reach the observatory. -If you look at the map viewer closely, you will see that between the bicycle parking spot and the observatory tower is the main road "Innstraße". as the main road Bob needs to take in order to reach the observatory. How can we possibly show this? By using `node`, and having `[name="Innstraße"]` as a filter perhaps? +If you look at the map viewer closely, you will see that between the bicycle parking spot and the observatory tower is the main road "Innstraße". As the main road Bob needs to take in order to reach the observatory. How can we possibly show this? By using `node`, and having `[name="Innstraße"]` as a filter perhaps? Not quite. Remember that `node`s are __strictly__ for _points_ of interest. They can’t map roads, as that doesn’t really exist as a single point. diff --git a/content/es/_index.md b/content/es/_index.md new file mode 100644 index 0000000..22a6608 --- /dev/null +++ b/content/es/_index.md @@ -0,0 +1,13 @@ ++++ +Description = "" +date = 2015-05-06T11:09:35Z +title = "Overpass API es una API de sólo lectura altamente optimizada, creada para recopilar datos de mapas OSM." +type = "front" +layout = "single" +ref = "Documentación del API" +learn = "Comienza tu viaje por Overpass" +learnsub = "¡Aprende Overpass con nuestros divertidos ejercicios interactivos!" +github = "Ver en github" ++++ + +Tanto si eres un completo principiante como un desarrollador experimentado, encontrarás en LearnOverpass el recurso más completo para aprender a utilizar la API Overpass. En poco tiempo, aprenderás a utilizar el potente lenguaje de consulta y recopilar datos de diversos criterios: desde la ubicación, los tipos de objetos, las propiedades de las etiquetas hasta las proximidades. diff --git a/content/es/exercises/intro/1.md b/content/es/exercises/intro/1.md new file mode 100644 index 0000000..4038528 --- /dev/null +++ b/content/es/exercises/intro/1.md @@ -0,0 +1,32 @@ +--- +date: "2015-07-01T16:35:50+08:00" +title: "Introducción" +type: "exercise" +code: | + node; + out; +instructions: | + 1. `node` consulta un nodo, pero en realidad no decimos QUÉ nodos. ¿Cómo los buscamos? + 2. Hay muchas formas de hacerlo, pero para este ejemplo, vamos a realizar la consulta utilizando la posición __latitude__ y __longitude__. Nuestro amigo "Bob" está en algún lugar de Europa con un GPS, lo que nos da su ubicación aproximada: está en algún lugar entre estas posiciones aproximadas: + - south = 48.5657094 + - west = 13.4490548 + - north = 48.5662416 + - east = 13.4501676 + 3. Utiliza esta posición para buscar la posición aproximada de Bob. Añádelas en un formato tal que la primera línea se convierta en `node(sur, oeste, norte, este);`, donde sur, etc, es la coordenada específica dada por el GPS de Bob más arriba. No olvides el punto y coma al final. + 4. Una vez hecho esto, verás que en la segunda línea aparece la palabra `out;`. Puedes ignorarla por ahora. + 5. Pulsa el botón verde "Run Query" (Ejecutar consulta). +hint: Asegúrate de que su consulta tiene el formato t `node(south, west, north, east)` +answer: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676); + out; + +--- +¡Hola y bienvenido a LearnOverpass! + +La API Overpass es una potente API que te permite consultar datos de OpenStreetMap. Puedes encontrar diferentes lugares, rutas a lugares, y todo bajo el sol, ¡literalmente! Puedes "hablar" con ella y solicitar datos para tu uso específico, utilizando su propio lenguaje, el "Lenguaje de consulta de Overpass" (QL). + +Lo que ves a la derecha es un editor de texto donde puedes escribir tus comandos QL. ¿Ves la sentencia con la palabra `nodo`? Se trata de una instrucción QL que pide (consulta) a la API un único punto de interés (un nodo) en OpenStreetMap. + +El mapa del mundo debajo del editor es una visualización de los datos que recibe tu sentencia. Ahora mismo no contiene nada, porque nuestra sentencia está incompleta - aunque _consultamos un nodo_ con la primera línea, no sabe qué o cuál es el nodo que nos interesa, ¡así que la API no sabe qué hacer con él! + +¡Cambiemos eso! diff --git a/content/es/exercises/intro/10.md b/content/es/exercises/intro/10.md new file mode 100644 index 0000000..36a9c43 --- /dev/null +++ b/content/es/exercises/intro/10.md @@ -0,0 +1,27 @@ +--- +date: "2015-07-10T16:35:50+08:00" +title: "Way como Area" +type: "exercise" +section: "exercise" +code: | + way[name="Innstraße"]; + out geom; +instructions: | + 1. Sólo tenemos que buscar vías en Passau. Las vías pueden filtrarse por zonas del mismo modo que los nodos. + 2. Busca un `area` que tenga la clave `name` y el valor `Passau`. Recuerda que nuestra área debe colocarse antes de nuestra consulta de camino, de lo contrario el `area` no _fluirá_ al filtro de camino. + 3. Añade el filtro de área en nuestra sentencia way. Recuerda que los nodos se filtran por área con la forma `node(area);`. +hint: ¡Utiliza el filtro de área en el camino existente! +answer: | + area[name=Passau]; + way(area)[name="Innstraße"]; + out geom; + +--- + +"Ahm, ¿estás seguro de que esto está bien?" Dice Bob al ver las diferentes formas. ¡oh oh! + +Hemos conseguido buscar vías con el nombre "Innstraße", pero desgraciadamente parece que hay bastantes vías que se llaman igual. + +Esto es obviamente inaceptable - Overpass nos mostró todas las vías llamadas "Innstraße" alrededor del mundo, pero sólo estamos interesados en la "Innstraße" cerca de Bob. + +Como sabemos que Bob está en _Passau_, lo que podemos hacer es buscar las vías que sólo están en _Passau_. De nuevo, utilizamos la consulta `area` para hacerlo. diff --git a/content/es/exercises/intro/11.md b/content/es/exercises/intro/11.md new file mode 100644 index 0000000..c433a8e --- /dev/null +++ b/content/es/exercises/intro/11.md @@ -0,0 +1,36 @@ +--- +date: "2015-07-11T16:35:50+08:00" +title: "Modificadores Out" +type: "exercise" +section: "exercise" +code: | + area[name=Passau]; + way(area)[name="Innstraße"]; + out geom; +instructions: | + 1. Modifica la consulta existente para que utilice una sentencia `out` eliminando el modificador `geom`. Ten cuidado de no eliminar el punto y coma. +hint: Elimina geom del código de muestra. +answer: | + area[name=Passau]; + way(area)[name="Innstraße"]; + out; + +--- + +¡Increíblemente buen trabajo! + +"¡Gracias!" Dijo Bob mientras se subía a su moto. "¡Entonces seguiré este camino hasta el observatorio!". + +Los dos últimos ejercicios introdujeron bastantes cosas, en concreto, `way` y el modificador `out geom`. + +Un `way` es otro elemento OSM (como `node`) que describe una característica lineal o área. Por ahora, acepta que una "vía" también puede definir áreas. La información relevante que necesitamos aprender es que una "vía" se utiliza normalmente para definir carreteras, arroyos y autopistas, entre otras cosas. Si necesitas buscar una ruta, o algo que crees que no puede ser definido como un simple "punto", lo más probable es que sea un elemento "camino". + +En OSM, las vías se representan simplemente como un conjunto de puntos. Si lo piensas, podemos usar un par de puntos para definir una línea (que puede usarse para definir rutas). + +Dado que las vías se representan internamente como un conjunto de puntos, una vía es en realidad una lista ordenada de nodos. Impresionante, ¿verdad? Debido a esto, podemos consultar los nodos individuales de una vía, aunque no es algo que vayamos a hacer por ahora. + +Te habrás dado cuenta de que hemos utilizado `out geom;` en lugar de nuestra habitual sentencia `out` en nuestra última consulta. ¿Por qué? + +Para entenderlo, hablemos primero de `out`. La sentencia `out` es una llamada _action_, la única _action_ en el Overpass QL. Lo que hace es tomar el conjunto de entrada (el conjunto de resultados/datos que le precede) e `imprimirlo`, para que podamos utilizar los datos (que vemos en el visor de mapas). + +Hasta ahora, sólo hemos utilizado la sentencia `out`. ¿Qué pasaría si utilizáramos `out` en lugar de `out geom` en nuestra última consulta? Intentémoslo. diff --git a/content/es/exercises/intro/12.md b/content/es/exercises/intro/12.md new file mode 100644 index 0000000..2ecbf24 --- /dev/null +++ b/content/es/exercises/intro/12.md @@ -0,0 +1,28 @@ +--- +date: "2015-07-12T16:35:50+08:00" +title: "Datos del modificador Out" +type: "exercise" +section: "exercise" +code: | + area[name=Passau]; + way(area)[name="Innstraße"]; + out; +instructions: | + 1. Volvemos a modificar nuestra consulta para incluir el modificador `geom`, de forma que nuestra consulta diga `out geom;`, y observamos qué ocurre con los datos. +hint: Vuelve a añadir geom al código de ejemplo. +answer: | + area[name=Passau]; + way(area)[name="Innstraße"]; + out geom; + +--- + +"¡Uaaghhh! Qué le ha pasado a mi mapa!" Bob exclama al ver el mapa vacío. + +Como ves, al usar una sentencia `out` se producía un mapa vacío. + +Verás, nuestra sentencia `out` _imprime_ los datos que recibe, eso si puede. Una vía sólo lleva una referencia a la lista de nodos que la componen - prueba a hacer clic en el botón `data` de la parte superior derecha de la vista del mapa. Esto te mostrará los 'datos' en bruto que devuelve el paso elevado. Adelante, pruébalo. + +Vaya. Puede parecer un poco complicado, pero lo básico que tenemos que mirar aquí es que el camino, tiene una lista de nodos (nd). Así que ya ves, en realidad sólo consultamos por el "camino", específicamente, la lista de nodos que lo componen. + +Vamos a cambiar nuestra consulta de nuevo para ver la ruta. diff --git a/content/es/exercises/intro/13.md b/content/es/exercises/intro/13.md new file mode 100644 index 0000000..9ee0d9f --- /dev/null +++ b/content/es/exercises/intro/13.md @@ -0,0 +1,36 @@ +--- +date: "2015-07-13T16:35:50+08:00" +title: "Around II" +type: "exercise" +section: "exercise" +code: | + area[name=Inn]; + node(area)["tower:type"=observation]; + out; +instructions: | + 1. Vaya, parece que Bob sigue teniendo problemas. Probablemente se llevó el dinero de su cartera mientras nadaba de vuelta a la orilla. Por suerte, sus tarjetas de cajero automático siguen intactas, así que Bob sólo tiene que sacar dinero de un cajero cercano. + 2. Bob dice que vio un cajero automático de camino a la torre. Calcula que el cajero está a 150 m, más o menos. + 3. A partir de la quinta línea en blanco, crea una nueva consulta `node around` para imprimir los atm. Los ATMs son de tipo clave `amenity`, y toma el valor clave `atm`. + 4. Asegúrate de imprimir el conjunto resultante con `out;`. +hint: Vuelve a utilizar una consulta `around` +answer: | + area[name=Inn]; + node(area)["tower:type"=observation]; + out; + + node(around:150)[amenity=atm]; + out; + +--- + +"¡Gracias!" dice Bob mientras buscamos la ruta de vuelta. Él la sigue hasta llegar a la torre del observatorio. Una vez en la orilla del río, decide dejar la bici y ¡nadar hasta el observatorio! + +Al cabo de unos minutos, Bob regresa temblando y mojado. + +"Brrrr... ¡el agua está fría!" exclama Bob, cuando, de la nada, aparece el camarero del restaurante, todo vestido de blanco. De hecho, ¡ha seguido a Bob todo el camino! + +"Señor" dice el camarero, jadeando "¡Todavía necesito esos 25 euros!". "Sí, seguro" dice Bob mientras saca su cartera mojada del bolsillo. + +"Oh" una expresión inexpresiva sale de él. "¡Lo siento, parece que he perdido todo mi dinero nadando de vuelta aquí!". + +Camarero: *Facepalm* diff --git a/content/es/exercises/intro/14.md b/content/es/exercises/intro/14.md new file mode 100644 index 0000000..665e19e --- /dev/null +++ b/content/es/exercises/intro/14.md @@ -0,0 +1,31 @@ +--- +date: "2015-07-14T16:35:50+08:00" +title: "Polígono Way cerrado" +type: "exercise" +section: "exercise" +code: | + area[name=Inn]; + node(area)["tower:type"=observation]; + node(around:150)[amenity=atm]; + out; +instructions: | + 1. Como puedes ver, las primeras cuatro líneas de nuestra consulta sólo buscan el cajero automático. Como vamos a buscar tanto el cajero automático como el edificio, deja las cuatro líneas intactas y crea unas líneas en blanco a continuación, donde escribiremos la consulta para el edificio. + 2. Como ya hemos dicho, las "vías", además de representar rutas y carreteras, también pueden representar "áreas". Un ejemplo concreto es un edificio, que es una estructura poligonal cerrada definida como una serie de puntos (que podemos representar como un camino). + 3. Así que para buscar el edificio, tendríamos que hacer una consulta `way`. Escribe una consulta `way`, filtrándola para que su nombre sea el que veas en el visor de mapas. + 4. Como puede haber otros edificios que se llamen así, filtremos también por la dirección. Añade `["addr:city"=Passau]` como filtro adicional para nuestra consulta. + 5. Una vez consultado el edificio con éxito, nos quedaría imprimirlo para el visor de mapas. Hazlo usando `out` con el modificador que hemos usado hasta ahora para las formas. +hint: Utiliza una consulta de forma filtrada por el nombre del edificio +answer: | + area[name=Inn]; + node(area)["tower:type"=observation]; + node(around:150)[amenity=atm]; + out; + + way["addr:city"=Passau][name="Wirtschaftswissenschaften (WIWI)"]; + out geom; + +--- + +"Hmm, no lo veo desde el observatorio, pero sí desde el mapa de consulta del paso elevado", dice Bob. Efectivamente, el cajero está en el lado opuesto de un edificio (el polígono parduzco del visor de mapas). + +Sigamos adelante y consultemos tanto el cajero como el edificio, para que Bob pueda tener una mejor idea de dónde está el cajero. diff --git a/content/es/exercises/intro/15.md b/content/es/exercises/intro/15.md new file mode 100644 index 0000000..bf644af --- /dev/null +++ b/content/es/exercises/intro/15.md @@ -0,0 +1,33 @@ +--- +date: "2015-07-15T16:35:50+08:00" +title: "Recursión de nodos de way" +type: "exercise" +section: "exercise" +code: | + way["addr:city"=Passau][name="Wirtschaftswissenschaften (WIWI)"]; + out geom; + +instructions: | + 1. Lo primero que tenemos que hacer es buscar un `nodo` específico que forme parte de una `way`. El filtro `recurse` hace justamente eso - te permite encontrar el `node` de una `way`. + 2. Para hacer un filtro `recurse`, necesitas empezar con tu elemento objetivo, y una clave para el elemento fuente dentro de paréntesis. En nuestro ejemplo, nuestro elemento de destino es un `node`, mientras que nuestro elemento de origen es un `way`, por lo que necesitamos utilizar la sintaxis `nodo(w);`. + 3. La importante metáfora del "flujo" de datos sigue siendo válida para esta consulta. Por ello, tenemos que asegurarnos de que nuestro conjunto `way` ya está disponible cuando realicemos la consulta de sus nodos. Así que tenemos que colocar la sentencia `node(w)` después de que la vía está establecido, pero antes de la sentencia `out;`. + 4. Si intentas ejecutar la consulta ahora (en serio, ¡adelante!), verás un montón de nodos que definen el aspecto de nuestro polígono. Como se ha dicho antes, `way`s son sólo un montón de `node`s, y con el filtro `recurse`, mostramos estos nodos en lugar de la forma real. + 5. Mientras que el filtro `recurse` _recursó_ a través del `way` y devolvió los `nodos` que lo componen, aún necesitamos filtrar más los `nodos` para mostrar sólo las entradas. Por suerte, podemos utilizar el filtro `[entrance=yes]` para ello. + 6. Dado que hemos cambiado el conjunto de resultados de salida de una vía a entradas (con `node(w)`), una sentencia `out` simple funcionará bien - ¡asegúrate de eliminar el modificador `geom`! +hint: Usa `node(w);` +answer: | + way["addr:city"=Passau][name="Wirtschaftswissenschaften (WIWI)"]; + node(w)[entrance=yes]; + out; + +--- + +"¡Oh! ¡Veo ese edificio!" exclama Bob. "Así que el cajero automático está justo al otro lado, ¿no?". + +Mientras Bob caminaba hacia el edificio, se dio cuenta de una cosa importante: ¡no sabía dónde está la entrada! Parece que tenemos que escribirle otra consulta. + +Con la consulta actual, hemos encontrado el edificio, pero tenemos que localizar un punto concreto: la entrada. + +Un edificio, dado que generalmente es un polígono visto desde el mapa, se define como una "entrada". Sin embargo, una entrada suele ser sólo un punto en el mapa, un punto con una ubicación específica. Entonces, ¿cómo cree que se representan en Overpass? Si has adivinado por `node`, ¡entonces has acertado! + +¿Recuerdas cuando te dije que las "vías" se definen como una lista ordenada de nodos? Algunos de estos nodos se pueden etiquetar aún más, tomando diferentes valores como entradas. En la siguiente consulta aprenderemos a buscar un nodo específico (una entrada) que forme parte de una `vía`. diff --git a/content/es/exercises/intro/2.md b/content/es/exercises/intro/2.md new file mode 100644 index 0000000..50393d9 --- /dev/null +++ b/content/es/exercises/intro/2.md @@ -0,0 +1,25 @@ +--- +date: "2015-07-02T16:35:50+08:00" +title: "Filtrar por etiqueta" +type: "exercise" +section: "exercise" +code: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676); + out; +instructions: | + 1. Vemos un montón de nodos, pero estamos buscando un nodo concreto, concretamente, el nodo en el que se encuentra Bob, ¡que es un árbol! + 2. Haz clic en algunos de los nodos del mapa. Verás algunos nodos etiquetados como "natural=tree" (lo que significa que el nodo es un elemento _natural_, en concreto, un árbol - _tree_). Bob debería estar junto a uno de estos árboles. + 3. Vamos a usar `filtros` para, _ejem_ __filtrar__ nuestros nodos para que sólo muestren árboles. Podemos hacerlo añadiendo `[clave=valor]` al final de nuestra primera línea (pero antes del punto y coma `;`), por supuesto sustituyendo clave=valor por lo que estamos buscando (árboles) +hint: ¡Asegúrate de añadir sólo el filtro, y no de sustituir toda la línea. +answer: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree]; + out; + + +--- + +Muy bien. Como puedes ver, el lenguaje de consulta puede parecer críptico al principio, pero en realidad es bastante sencillo. + +Esos círculos que ves en la vista del mapa son "puntos de interés" llamados "nodos". Prueba a hacer clic en ellos: algunos sólo contienen sus propias posiciones (lat/lon), pero otros están etiquetados y contienen otros datos, como nombres, tipo de nodo, etc, etc. + +Como nuestro amigo "Bob" tiene un GPS bastante impreciso, sólo consiguió darnos unas coordenadas aproximadas. Sin embargo, dijo que estaría junto a un árbol, así que ¿por qué no intentamos buscar un nodo que sea un árbol? Seguro que está allí. diff --git a/content/es/exercises/intro/3.md b/content/es/exercises/intro/3.md new file mode 100644 index 0000000..39874e8 --- /dev/null +++ b/content/es/exercises/intro/3.md @@ -0,0 +1,32 @@ +--- +date: "2015-07-03T16:35:50+08:00" +title: "Filtrar por etiqueta II" +type: "exercise" +section: "exercise" +code: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676) + [natural=tree]; + out; +instructions: | + 1. Parece que no fuimos lo suficientemente específicos. Sin embargo, sabemos que Bob está junto al árbol más alto de la zona, ¡utilicemos esa información para buscarlo! Haz clic en los nodos del mapa y encuentra el árbol más alto. + 2. Puedes combinar filtros escribiéndolos junto a la consulta, como hicimos con `[natural=tree]`. Recuerda poner el segundo filtro antes del punto y coma. +hint: Prueba la altura del árbol más alto. Combina los filtros poniéndolos uno al lado del otro. +answer: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676) + [natural=tree] + [height=20]; + out; + +--- + +¡Impresionante! ¡Hemos filtrado nuestros datos para que sólo muestren árboles! + +Si te fijas, en el editor de texto de la derecha, [natural=tree] está en la segunda línea. Overpass Turbo le permite añadir sangrías y líneas adicionales según le convenga, así que siéntate libre de hacer un amplio uso de ellas para hacer tus consultas más legibles. Sin embargo, ten en cuenta que el punto y coma también se coloca en la segunda línea para indicar a Overpass que la sentencia ha terminado. Considéralo como el punto y aparte de Overpass. + +De todos modos, hemos filtrado con éxito los datos para solicitar sólo árboles. Sin embargo, seguimos teniendo un problema. Aunque "Bob" nos ha dicho que está en un árbol, ¡hay TRES árboles en la zona! + +"¡Hola! ¡Hola! Query Writer" dice Bob. + +Bob: "Parece que estamos en un buen aprieto. No estoy seguro de cómo puedo ayudar, pero sé que estoy junto al árbol más alto de la zona". + +Woah, Bob acaba de hablar con nosotros, ¡y menciona estar junto al árbol más alto! Si te fijas, los nodos de los árboles también están etiquetados por su altura. Puedes usarlas para filtrar aún más tus datos. diff --git a/content/es/exercises/intro/4.md b/content/es/exercises/intro/4.md new file mode 100644 index 0000000..4273c2f --- /dev/null +++ b/content/es/exercises/intro/4.md @@ -0,0 +1,29 @@ +--- +date: "2015-07-04T16:35:50+08:00" +title: "¿Filtrar por etiqueta III?" +type: "exercise" +section: "exercise" +code: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676) + [natural=tree] + [height=20]; + out; +instructions: | + 1. Bob está buscando un lugar __cercano__ donde pueda __comer__. + 2. Vamos a buscarle un restaurante. Los restaurantes son __amenities__, así que los restaurantes se etiquetan como `[amenity=restaurant]`. + 3. Pero, ¡espera! ¿Cómo buscamos restaurantes cerca de él? ¿Quizá podamos añadir `[amenity=restaurant]` como filtro para el nodo actual? +hint: Combina los filtros poniéndolos uno al lado del otro. +answer: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676) + [natural=tree] + [height=20] + [amenity=restaurant]; + out; +regex: | + \[amenity=restaurant\] + +--- + +"¿No es mejor así? Más corto y más fácil de trabajar". + +"Sabes, llevo esperándote un buen rato, ¡tengo hambre! Como mi GPS no parece muy fiable, ¿te importaría buscarme un sitio cerca donde pueda comer?". diff --git a/content/es/exercises/intro/5.md b/content/es/exercises/intro/5.md new file mode 100644 index 0000000..8b790ab --- /dev/null +++ b/content/es/exercises/intro/5.md @@ -0,0 +1,30 @@ +--- +date: "2015-07-05T16:35:50+08:00" +title: "Filtro alrededor" +type: "exercise" +section: "exercise" +code: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + out; +instructions: | + 1. Around es un filtro que busca cualquier cosa alrededor de nuestro _conjunto de resultados_ (_result set_) existente (en este caso nuestro nodo árbol). Dado que nuestro conjunto de resultados está dado por nuestra primera línea, necesitamos hacer otra declaración. Para ello, crear una nueva línea después de la primera línea, por lo que tiene una segunda línea en blanco. + 2. A diferencia de los filtros "por etiqueta" (__by tag__), los filtros "alrededor" (__around__) están rodeados de paréntesis y siguen el formato "around:n", donde "n" es el radio de distancia en metros. Probemos a establecer el radio de distancia en 50. + 3. En la segunda línea, escribe `node` seguido de `filter`. ¡Asegúrate de seguir el formato en 2! + 4. No olvides añadir punto y coma al final de la frase. +hint: Recuerda hacer una nueva consulta. No te limites a añadir alrededor de la primera línea. +answer: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + node(around:50); + out; + +--- + +"¡Vaya, está vacío! ¿Será que no hay restaurantes cerca de mí?", pregunta Bob. + +Pues no. Verás, nuestra primera sentencia `node(2190458950)` es _ya_ un nodo, ¡así que filtrarlo más no haría nada! Y como hemos añadido un nuevo filtro (restaurantes) a una sentencia que __sabemos__ que nos da un árbol, básicamente le hemos pedido a OSM que filtre aún más nuestro conjunto de resultados (un nodo árbol) para que sólo muestre restaurantes, lo que obviamente hace que OSM no haga nada (¡ya que un árbol no es un restaurante!). + +Nuestros ejemplos anteriores funcionaron porque filtrabamos los nodos con etiquetas presentes en un __área__ (la `caja delimitadora` - `bounding box` con puntos lat/lon). Esencialmente, buscamos nodos en un área y, a continuación, utilizamos filtros para filtrarlos en un árbol. + +Ahora mismo, como nuestro nodo ya es un nodo, no podemos simplemente usar un filtro para obtener un restaurante de él. Tenemos que obtener una nueva __área__ del nodo. + +Para ello, podemos hacer un gran uso de otro filtro, llamado `around`. diff --git a/content/es/exercises/intro/6.md b/content/es/exercises/intro/6.md new file mode 100644 index 0000000..60cc926 --- /dev/null +++ b/content/es/exercises/intro/6.md @@ -0,0 +1,31 @@ +--- +date: "2015-07-06T16:35:50+08:00" +title: "Filtrar por etiqueta III" +type: "exercise" +section: "exercise" +code: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + node(around:50); + out; +instructions: | + 1. Nuestro filtro `around` nos dio un montón de nodos alrededor de nuestro primer nodo, pero no hay restaurantes en él, ¡y hay demasiados nodos! + 2. Aumenta un poco más nuestra distancia alrededor. Bob dice que ve un restaurante a unos 450 metros de distancia de él, así que sigue adelante y usa eso como filtro de distancia para alrededor. + 3. Utiliza un filtro por etiqueta para buscar restaurantes. Para ello, puedes utilizar la etiqueta `[amenity=restaurant]`. + 4. Recuerda que estamos filtrando nuestros datos desde nuestro conjunto around, así que asegúrate de añadir la etiqueta filter después de nuestro filtro around. +hint: Recuerda hacer una nueva consulta. No te limites a añadir `around` en la primera línea. +answer: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + node(around:450)[amenity=restaurant]; + out; + +--- + +"¡Guau, genial! Veo muchos nodos a mi alrededor, pero hay demasiados, ¡y no estoy seguro de cuáles son los restaurantes!". + +Usamos el filtro `around` en nuestro ejemplo anterior para buscar nodos alrededor de nuestro nodo en particular, ¡y funcionó! Como se puede ver en el visor de mapas, vemos los datos OSM alrededor de nuestra primera declaración. + +Sin embargo, es bastante problemático: en realidad no hemos encontrado ningún restaurante, ¡y hay demasiados nodos! + +De nuevo, utilizaremos el concepto que aprendimos antes para filtrar aún más nuestros datos. `around` nos dio un montón de nodos, así que tenemos que usar _filter by tag ([k=v])_ para filtrarlo a sólo restaurantes. + +Combina el filtro `around` con el filtro "por etiqueta". diff --git a/content/es/exercises/intro/7.md b/content/es/exercises/intro/7.md new file mode 100644 index 0000000..7f7c66a --- /dev/null +++ b/content/es/exercises/intro/7.md @@ -0,0 +1,52 @@ +--- +date: "2015-07-07T16:35:50+08:00" +title: "Por zona" +type: "exercise" +section: "exercise" +code: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + node(around:450)[amenity=restaurant]; + out; + + area; + out; +instructions: | + 1. Bob se dejó la cartera mientras recorría la ciudad. Recordaba perfectamente haber dejado la cartera en cierta __torre del observatorio__ en el __río Inn__. + 2. Ese observatorio está bastante lejos, así que sería mejor asegurarnos de que nuestra consulta resultante también muestra nuestra posición actual (¡para no perdernos!) Si te fijas en el editor de la derecha, tenemos dos sentencias `out`, con una línea en blanco entre ellas. Overpass QL puede usar múltiples sentencias `out`. Si piensas en las sentencias QL como _sentencias_, puedes pensar en nuestra estructura aquí como dos párrafos diferentes. Nuestro primer 'párrafo' es la consulta que hemos estado utilizando hasta ahora, y sólo imprime el restaurante donde se encuentra Bob. El segundo 'párrafo' es lo que necesitas editar. + 3. Necesitamos encontrar un nodo que sea una _torre de observación_. Para ello podemos utilizar el filtro `["tower:type"=observation]`. Observa que entrecomillamos el tipo de filtro porque contiene un carácter no alfabético (`:`). + 4. Encontrar nodos de torres de observatorio es fácil, pero ¿cómo podemos limitar nuestros resultados observatorios en el río Inn? Utilizar un _bounding box_ sería demasiado complicado. Lo que podemos optar por hacer es consultar por `área`. Como sabemos que la torre está en una zona concreta (el río Inn), podemos utilizar esa información para hacer nuestra consulta. + 5. Como puedes ver en el editor, la 5a. línea tiene la palabra clave `area`. Es igual que la palabra clave `node` que hemos utilizado hasta ahora, pero en lugar de buscar un único punto de interés como un nodo, "área" busca un... bueno, ¡un _área_! + 6. Sabemos que el nombre del río es _Inn_. Podemos utilizarlo como filtro para nuestra área. Sigue adelante y utiliza `[name=Inn]` como filtro en la sentencia `area`. + 7. En realidad no queremos consultar el área, sino que sólo queremos _utilizar_ el área para encontrar un nodo concreto en ella. Así que en la sexta línea, escribe tu declación `nodo`, junto con el filtro de tipo torre discutido en 3. + 8. Una vez hecho esto, tenemos que asegurarnos de que el nodo sólo consulta dentro del área que hemos definido. Para ello, cambia la sentencia `node` por `node(area)`. Esto le dice a overpass que sólo busque nodos dentro del área definida en la sentencia area. +hint: No olvides utilizar una consulta `area`. +answer: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + node(around:450)[amenity=restaurant]; + out; + + area[name=Inn]; + node(area)["tower:type"=observation]; + out; + +--- + +"¡Bingo!" dice Bob mientras camina hacia el restaurante. + +¿Ves lo poderoso que es Overpass QL en la consulta de datos OSM? Tiene una plétora de diferentes filtros y declaraciones, y la combinación de ellos entre sí puede crear consultas aún más específicas para sus casos de uso. + +Nuestro ejemplo anterior introduce una metáfora muy importante en el Lenguaje de Consulta de Overpass, que es el 'flujo'. Una buena manera de pensar en la API Overpass es que permite que los datos OSM (nodos, etc.) sean generados y modificados a medida que 'fluyen' de una declaración a otra. + +Como ejemplo concreto, nuestra consulta de bounding box (los puntos lat/lon) encuentra los nodos de esa zona. Los datos resultantes "fluirán" y se filtrarán como `[natural=tree]`, `[height=20]`, etc. + +Si te fijas, `(around:n)` funciona de la misma manera, en el sentido de que nuestros datos iniciales fluyen en él, y se modifica para mostrar los nodos alrededor de los datos iniciales que se producen por nuestra primera línea. + +"¡Vaya!" exclama Bob, "¡Ha sido una comida muy buena!". + +"Serían 25 euros señor" dice el camarero, vestido con un atuendo totalmente blanco. + +"¡Ya voy!" dice Bob orgulloso, cuando... + +"¡Uh oh! Parece que me he dejado la cartera en el observatorio!". + +Nervioso, Bob salió corriendo del restaurante, con la esperanza de recuperar su cartera. diff --git a/content/es/exercises/intro/8.md b/content/es/exercises/intro/8.md new file mode 100644 index 0000000..4f4e565 --- /dev/null +++ b/content/es/exercises/intro/8.md @@ -0,0 +1,39 @@ +--- +date: "2015-07-08T16:35:50+08:00" +title: "Around por Area" +type: "exercise" +section: "exercise" +code: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + node(around:450)[amenity=restaurant]; + out; + + area[name=Inn]; + node(area)["tower:type"=observation]; + out; + +instructions: | + 1. Tenemos que encontrar la bicicleta de Bob, que él sabe que está a unos 120 metros del restaurante. Tendremos que volver a utilizar el enunciado "around". + 2. Las zonas de aparcamiento de bicicletas se etiquetan como `[amenity=bicycle_parking]`. Ahora ya deberías saber qué declaración debemos utilizar. + 3. Ten en cuenta que nuestra declaración utiliza "around", así que asegúrate de colocar la declaración correctamente para que encuentre la plaza de aparcamiento alrededor de _el restaurante_ en lugar de _la torre_. Recuerda que Overpass tiene el concepto de "flujo". ¿Dónde crees que deberías colocar nuestra sentencia _around_? + 4. Una vez que lo hayas añadido, asegúrate de añadir también `out;` después de tu sentencia para imprimir el nodo de aparcamiento de bicicletas. +hint: La consulta alrededor se basa en el conjunto de resultados (en este caso, el resultado de la consulta anterior) +answer: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + node(around:450)[amenity=restaurant]; + out; + + node(around:120)[amenity=bicycle_parking]; + out; + + area[name=Inn]; + node(area)["tower:type"=observation]; + out; + +--- + +"Al menos ahora sé dónde está el observatorio", dice Bob. + +Al ver la distancia que les separa, Bob se pone nervioso. ¡Es un camino muy largo! + +Por suerte, Bob recuerda haber dejado su bicicleta en el aparcamiento más cercano. ¡Vamos a buscar la bicicleta de Bob! diff --git a/content/es/exercises/intro/9.md b/content/es/exercises/intro/9.md new file mode 100644 index 0000000..188e72b --- /dev/null +++ b/content/es/exercises/intro/9.md @@ -0,0 +1,36 @@ +--- +date: "2015-07-09T16:35:50+08:00" +title: "Consulta Way" +type: "exercise" +section: "exercise" +code: | + node(48.5657094, 13.4490548, 48.5662416, 13.4501676)[natural=tree][height=20]; + node(around:450)[amenity=restaurant]; + out; + + node(around:120)[amenity=bicycle_parking]; + out; + + area[name=Inn]; + node(area)["tower:type"=observation]; + out; + +instructions: | + 1. Borra todas las líneas del editor por ahora, no necesitaremos los nodos. + 2. Al igual que `area` podemos utilizar otro tipo de elemento OSM aquí para consultar la carretera. A saber, podemos utilizar la declaración `way`. + 3. Crea una sentencia `way` filtrada a "Innstraße". Puedes seguir la misma forma que las sentencias `node` y `area`. Ten en cuenta que deberá rodear la clave de filtro "Innstraße" con comillas, ya que contiene el carácter especial "ß". + 4. Por último, tendrías que mostrar el camino. Sin embargo, en lugar de usar simplemente `out`, tendrías que usar el modificador personalizado `geom`, para que la sentencia diga `out geom;`. +hint: El elemento way puede filtrarse igual que los nodos. +answer: | + way[name="Innstraße"]; + out geom; + +--- + +Bob examina cuidadosamente la moto en el aparcamiento, intentando encontrar la suya. "¡Ajá!", exclama Bob, mientras coge la bicicleta roja que sólo podemos suponer que es suya. + +Ahora que Bob está en su bicicleta, necesita ir al observatorio para encontrar su cartera. Como ya sabemos que Bob tiene un mal sentido de la orientación (¡se perdió!), lo mejor sería mostrarle la carretera principal que debe tomar para llegar al observatorio. + +Si miras el visor de mapas con atención, verás que entre el aparcamiento para bicicletas y la torre del observatorio se encuentra la carretera principal "Innstraße". Como la carretera principal que Bob debe tomar para llegar al observatorio. ¿Cómo podemos mostrar esto? ¿Usando `node`, y teniendo "name="Innstraße" como filtro quizás? + +Pues no. Recuerda que los `node`s son __extrictamente__ para _puntos_ de interés. No pueden cartografiar carreteras, ya que no existen como puntos individuales. diff --git a/deploy.sh b/deploy.sh index 8760d60..bb8f79f 100755 --- a/deploy.sh +++ b/deploy.sh @@ -12,7 +12,7 @@ default_username=deploy.sh default_email= #repository to deploy to. must be readable and writable. -repo=github +repo=origin # Parse arg flags while : ; do diff --git a/gulpfile.js b/gulpfile.js index 4a8af25..3938e43 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -99,7 +99,7 @@ gulp.task('build', ['jshint', 'html', 'partials'], function () { }); gulp.task('deploy', ['clean', 'build', 'scripts-deploy'], function(){ - gulp.src('').pipe($.shell(['node_modules/.bin/hugo --theme=overpass_doc --baseUrl=//osmlab.github.io/learnoverpass/'])); + gulp.src('').pipe($.shell(['node_modules/.bin/hugo --theme=overpass_doc --baseUrl=//maptimebogota.github.io/learnoverpass/'])); }); gulp.task('default', ['clean', 'build'], function () { diff --git a/package.json b/package.json index 6e09dc5..015ef48 100644 --- a/package.json +++ b/package.json @@ -34,5 +34,8 @@ "pngquant": "^0.4.0", "webpack": "^1.8.9", "webpack-stream": "^2.0.0" + }, + "overrides": { + "graceful-fs": "^4.2.10" } } diff --git a/themes/src/layouts/docs/single.html b/themes/src/layouts/docs/single.html index ba0fbfe..0b38bb7 100644 --- a/themes/src/layouts/docs/single.html +++ b/themes/src/layouts/docs/single.html @@ -23,7 +23,7 @@

{{ .Title }} {{ $cur_path := trim (substr .Permalink (len .Site.BaseURL) (len .Permalink)) "/" }} - Improve page + Improve page

{{ .Content }}

diff --git a/themes/src/layouts/exercise/single.html b/themes/src/layouts/exercise/single.html index 54e5da9..1770bce 100644 --- a/themes/src/layouts/exercise/single.html +++ b/themes/src/layouts/exercise/single.html @@ -10,7 +10,7 @@

{{ .Title }} {{ $cur_path := trim (substr .Permalink (len .Site.BaseURL) (len .Permalink)) "/" }} - Improve page + Improve page

{{ .Content }} @@ -60,7 +60,7 @@

- Data diff --git a/themes/src/layouts/front/single.html b/themes/src/layouts/front/single.html index 9e77416..297ed52 100644 --- a/themes/src/layouts/front/single.html +++ b/themes/src/layouts/front/single.html @@ -12,12 +12,6 @@

{{ .Title }}

  • Introduction
  • -
  • - RecursionComing Soon! -
  • -
  • - MapCSSComing Soon! -
  • @@ -35,8 +29,8 @@

    {{ .Title }}

    - {{ .Params.github }} - + {{ .Params.github }} +
    {{ partial "footer.html" . }} diff --git a/themes/src/layouts/partials/footer.html b/themes/src/layouts/partials/footer.html index d969c45..985720e 100644 --- a/themes/src/layouts/partials/footer.html +++ b/themes/src/layouts/partials/footer.html @@ -8,6 +8,6 @@ {{ end }} {{ $cur_path := $.Scratch.Get "path" }} English | - Deutsch + Spanish diff --git a/themes/src/layouts/partials/head.html b/themes/src/layouts/partials/head.html index b28e5f6..ec5154a 100644 --- a/themes/src/layouts/partials/head.html +++ b/themes/src/layouts/partials/head.html @@ -35,7 +35,7 @@
    - + Contribute to project
    diff --git a/themes/src/layouts/shortcodes/docs_repl.html b/themes/src/layouts/shortcodes/docs_repl.html index 804ccd2..4efaccc 100644 --- a/themes/src/layouts/shortcodes/docs_repl.html +++ b/themes/src/layouts/shortcodes/docs_repl.html @@ -6,9 +6,9 @@
    {{ if eq "=" (substr .Inner 0 1) }} -