Overpass API EBNF: Unterschied zwischen den Versionen

Aus Geoinformation HSR
Wechseln zu: Navigation, Suche
K
K
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<pre>
+
Es gibt keine EBNF Spezifikatikon für die Overpass QL. Roland weiss sicher mehr :-).
(* Overpass QL EBNF Grammar, experimental Version 0.2 by Stefan Keller *)
 
  
(* Query *)
+
Da bleibt nur ChatGPT & Co und "Learning by Example": siehe [[Overpass_API]] und v.a. [https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_API_by_Example Overpass_API_by_Example].
query                  ::= ( global_option )* ( statement )+ ( output_statement )*
 
  
(* Global Options *)
+
Hier ein erster eigener Versuch als [https://gist.githubusercontent.com/sfkeller/43800cd64014d17c55e40fa5e877fd6a/raw/3410bd8817e47c86e5695388a96ba1db5c0630a7/Overpass_QL_EBNF_v0.2_ChatGPT_generated.txt Github Gist File].
global_option          ::= '[' option ( ';' option )* ']'
 
option                ::= 'out:' format
 
                        | 'timeout:' number
 
                        | 'maxsize:' number
 
                        | 'bbox:' bbox
 
                        | 'date:' date
 
                        | 'diff:' date ',' date
 
                        | 'resolve-aliases:' boolean
 
                        | 'force:' boolean
 
  
boolean                ::= 'true' | 'false'
+
[[Kategorie:OpenStreetMap]]
 
+
[[Kategorie:Overpass]]
(* Statements *)
 
statement              ::= fetch_statement
 
                        | area_statement
 
                        | assignment_statement
 
                        | union_statement
 
                        | difference_statement
 
                        | intersection_statement
 
                        | recurse_statement
 
                        | foreach_statement
 
                        | if_statement
 
                        | print_statement
 
                        | make_statement
 
                        | count_statement
 
 
 
(* Fetch Statement *)
 
fetch_statement        ::= element_type ( filter )* ( search_area )? ( ';' | '{' ( statement )+ '}' )
 
 
 
element_type          ::= 'node' | 'way' | 'relation' | 'nwr'
 
 
 
(* Filters *)
 
filter                ::= '[' attribute_filter ']'
 
                        | '[' attribute_regexp_filter ']'
 
                        | '[' attribute_negation_filter ']'
 
                        | '(' bounding_clause ')'
 
                        | '[if:' condition ']'
 
 
 
attribute_filter      ::= key operator value
 
attribute_regexp_filter::= key operator_regex regex_value
 
attribute_negation_filter ::= '!' key
 
 
 
operator              ::= '=' | '!='
 
operator_regex        ::= '~' | '!~'
 
regex_value            ::= '"' regex_pattern '"'
 
 
 
(* Bounding Clause *)
 
bounding_clause        ::= bbox
 
                        | 'around' ':' radius ( ',' lat ',' lon )?
 
                        | 'poly' ':' '"' coordinates '"'
 
 
 
(* Search Area *)
 
search_area            ::= '(' area_selector ')'
 
 
 
area_selector          ::= 'area' ( '.' variable )?
 
                        | 'area' '(' query ')'
 
 
 
(* Assignment Statement *)
 
assignment_statement  ::= variable '=' expression ';'
 
 
 
expression            ::= fetch_statement
 
                        | union_statement
 
                        | difference_statement
 
                        | intersection_statement
 
                        | recurse_statement
 
                        | '(' statement_list ')'
 
 
 
(* Union Statement *)
 
union_statement        ::= '(' statement_list ')'
 
 
 
statement_list        ::= statement ( ';' statement )* ( ';' )?
 
 
 
(* Difference Statement *)
 
difference_statement  ::= '(' statement ';' '-' statement ( ';' )? ')'
 
 
 
(* Intersection Statement *)
 
intersection_statement ::= '(' statement ';' statement ( ';' )? ')'
 
 
 
(* Recurse Statement *)
 
recurse_statement      ::= ( variable ':' )? element_type recurse_operator ';'
 
 
 
recurse_operator      ::= '>' | '<' | '<<' | '>>' | '>' letter
 
 
 
(* Foreach Statement *)
 
foreach_statement      ::= 'foreach' '(' variable ')' '{' ( statement )+ '}'
 
 
 
(* If Statement *)
 
if_statement          ::= 'if' '(' condition ')' '{' ( statement )+ '}'
 
 
 
(* Print Statement *)
 
print_statement        ::= 'print' ( variable )? ( output_modifiers )* ';'
 
 
 
(* Make Statement *)
 
make_statement        ::= 'make' 'area' '(' statement ')' '->' variable ';'
 
 
 
(* Count Statement *)
 
count_statement        ::= 'count' '(' element_type ')' ';'
 
 
 
(* Area Statement *)
 
area_statement        ::= 'area' area_filter '->' variable ';'
 
 
 
area_filter            ::= '[' attribute_filter ']'
 
 
 
(* Output Statement *)
 
output_statement      ::= 'out' output_modifiers* ';'
 
output_modifiers      ::= 'body' | 'skel' | 'tags' | 'meta' | 'geom' | 'center' | 'ids' | 'qt' | 'count' | 'bb'
 
 
 
(* Variable *)
 
variable              ::= '.' identifier
 
 
 
(* Identifier *)
 
identifier            ::= letter ( letter | digit | '_' )*
 
 
 
(* Key and Value *)
 
key                    ::= '"' identifier '"'
 
value                  ::= '"' string '"'
 
 
 
(* Condition *)
 
condition              ::= logical_expression
 
logical_expression    ::= logical_term ( ( 'and' | 'or' ) logical_term )*
 
logical_term          ::= '(' logical_expression ')'
 
                        | comparison
 
comparison            ::= expression comparison_operator expression
 
 
 
comparison_operator    ::= '=' | '!=' | '>' | '<' | '>=' | '<='
 
 
 
(* Expressions *)
 
expression            ::= variable
 
                        | function_call
 
                        | value
 
                        | number
 
 
 
function_call          ::= function_name '(' ( expression ( ',' expression )* )? ')'
 
function_name          ::= identifier
 
 
 
(* Numbers and Strings *)
 
number                ::= digit+ ( '.' digit+ )?
 
digit                  ::= '0'..'9'
 
letter                ::= 'a'..'z' | 'A'..'Z'
 
string                ::= character*
 
character              ::= any character except '"'
 
 
 
regex_pattern          ::= character*
 
 
 
(* Bounding Box and Coordinates *)
 
bbox                  ::= number ',' number ',' number ',' number
 
radius                ::= number
 
lat                    ::= number
 
lon                    ::= number
 
coordinates            ::= number ( ' ' number )+ ( ',' number ( ' ' number )+ )*
 
 
 
(* Date *)
 
date                  ::= '"' iso8601_date '"'
 
iso8601_date          ::= year '-' month '-' day 'T' hour ':' minute ':' second 'Z'
 
year                  ::= digit digit digit digit
 
month                  ::= digit digit
 
day                    ::= digit digit
 
hour                  ::= digit digit
 
minute                ::= digit digit
 
second                ::= digit digit
 
 
 
(* Format *)
 
format                ::= 'json' | 'xml' | 'csv' | 'popup'
 
 
 
(* Terminals *)
 
character              ::= any character except '"'
 
</pre>
 

Aktuelle Version vom 15. September 2024, 23:18 Uhr

Es gibt keine EBNF Spezifikatikon für die Overpass QL. Roland weiss sicher mehr :-).

Da bleibt nur ChatGPT & Co und "Learning by Example": siehe Overpass_API und v.a. Overpass_API_by_Example.

Hier ein erster eigener Versuch als Github Gist File.