4 votos

¿Superar el filtrado booleano de la API?

Así que estoy tratando de conseguir una buena lista de embajadas de Overpass, aquí está mi consulta inicial:

[out:json];
(
    node["amenity"="embassy"];
    way["amenity"="embassy"];
    relation["amenity"="embassy"]
);
out tags; 

Sin embargo, esta consulta tiene algunos problemas. Estoy buscando embajadas, pero esta consulta también incluye misiones de la ONU, consulados, residencia de embajadores, cualquier otra cosa en el diplomatic etiqueta. Una solución ingenua para esto sería añadir ["diplomatic"="embassy"] pero después de buscar en los resultados de mi consulta inicial, me he dado cuenta de que hay "embajadas" reales sin diplomatic etiqueta.

Así que esto viene a mi pregunta, ¿puedo modificar mi consulta para hacer un filtro de tipo booleano para comprobar "embassy" sólo si "diplomatic" existe o ["tag"="value_A"||"value_B"] o ["tag_A"&&"tag_B"] ¿ y así sucesivamente?

7voto

vasili111 Puntos 187

Podemos formular la respuesta de diferentes maneras:

Opción 1:

Básicamente, quieres eliminar esos amenity=embassy de su lista de resultados actual, que tienen un diplomatic valor que no sea embajada (suponiendo que tengan un diplomatic etiqueta en absoluto).

Para ello, he utilizado el - (diferencia) operador para reducir el conjunto de resultados actual para cada nodo, vía y relación:

[out:json];
(
 ( node[amenity=embassy]; -  node[amenity=embassy][diplomatic][diplomatic!=embassy]; );
 ( way[amenity=embassy];  -  way[amenity=embassy][diplomatic][diplomatic!=embassy];  );
 ( rel[amenity=embassy];  -  rel[amenity=embassy][diplomatic][diplomatic!=embassy];  );
);
out tags; 

enlace turbo del paso superior: http://overpass-turbo.eu/s/mXx


Opción 2:

Este enfoque alternativo devuelve efectivamente el mismo resultado, pero puede ser un poco más fácil de entender. En la siguiente consulta, creamos una unión de

  • todos los elementos con amenity=embassy pero no diplomatic y
  • todos los elementos con amenity=embassy y diplomatic=embassy

    [out:json]; ( node[amenity=embassy][!diplomatic]; node[amenity=embassy][diplomatic=embassy]; way[amenity=embassy][!diplomatic]; way[amenity=embassy][diplomatic=embassy]; rel[amenity=embassy][!diplomatic]; rel[amenity=embassy][diplomatic=embassy]; ); out tags;

enlace turbo del paso superior: http://overpass-turbo.eu/s/mY8


NB: Los operadores booleanos que mencionas no están disponibles como tales:

  • Las condiciones AND deben ser formuladas por una lista de filtros de etiquetas, como [tag_A][tag_B]
  • Para las condiciones OR, puede utilizar expresiones regulares o consultar cada etiqueta individual y crear una UNIÓN de los respectivos resultados.

También puede probar el asistente de turbo de overpass si no quiere jugar con esos detalles.

En el asistente de turbo overpass, puede crear fácilmente la consulta mencionada en la opción 2 anterior utilizando la siguiente expresión:

(amenity=embassy and diplomatic!=*) or (amenity=embassy and diplomatic=embassy) global

Por fin es algo fácilmente digerible.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X