|
|
| (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>
| |
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.