From dffb21b56ec59764ab7c16b7355785e2c4c47824 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Fri, 5 Sep 2025 11:37:19 +0200 Subject: [PATCH] add missing wiki pages from taginfo fr --- .gitignore | 3 +- src/Controller/WikiController.php | 206 ++++++++++++++++-- templates/admin/wiki.html.twig | 50 +++++ templates/admin/wiki_create_french.html.twig | 20 +- templates/public/wiki_create_french.html.twig | 20 +- .../__pycache__/wiki_compare.cpython-313.pyc | Bin 46843 -> 53282 bytes wiki_compare/wiki_compare.py | 110 ++++++++-- wiki_compare/wiki_pages.csv | 191 ++++++++-------- 8 files changed, 469 insertions(+), 131 deletions(-) diff --git a/.gitignore b/.gitignore index 053bf29..25d2ccb 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,5 @@ public/*.json .idea -html_cache/* \ No newline at end of file +html_cache/* +/html_cache/ diff --git a/src/Controller/WikiController.php b/src/Controller/WikiController.php index 36340d5..c43a7fa 100644 --- a/src/Controller/WikiController.php +++ b/src/Controller/WikiController.php @@ -778,6 +778,7 @@ class WikiController extends AbstractController $scriptPath = $this->getParameter('kernel.project_dir') . '/wiki_compare/wiki_compare.py'; $englishHtml = null; $frenchHtml = null; + $frenchCacheExists = false; if (file_exists($scriptPath)) { // Create a temporary Python script to fetch the page content @@ -788,25 +789,52 @@ class WikiController extends AbstractController import sys import json -from wiki_compare import fetch_wiki_page +import hashlib +from pathlib import Path +from wiki_compare import fetch_wiki_page, HTML_CACHE_DIR # Get the key from command line arguments key = sys.argv[1] language = sys.argv[2] -# Fetch the page -page = fetch_wiki_page(key, language) +# Check if we're just checking cache existence +check_cache_only = len(sys.argv) > 3 and sys.argv[3] == 'check_cache' -# Output the HTML content -if page and 'html_content' in page: - print(page['html_content']) +if check_cache_only and language == 'fr': + # For French pages, construct the URL to check cache + if key.startswith('http'): + url = key + else: + url = f"https://wiki.openstreetmap.org/wiki/FR:{key}" + + # Create cache key + cache_key = hashlib.md5(url.encode()).hexdigest() + cache_file = Path(HTML_CACHE_DIR) / f"{cache_key}.html" + + # Check if cache exists + if cache_file.exists(): + print("CACHE_EXISTS") + else: + print("CACHE_MISSING") else: - print("") + # Normal fetch operation + page = fetch_wiki_page(key, language) + + # Output the HTML content + if page and 'html_content' in page: + print(page['html_content']) + else: + print("") EOT; file_put_contents($tempScriptPath, $pythonCode); chmod($tempScriptPath, 0755); + // First check if French page exists in cache + $command = "cd " . $this->getParameter('kernel.project_dir') . "/wiki_compare && python3 {$tempScriptPath} {$key} fr check_cache"; + $cacheCheckResult = trim(shell_exec($command)); + $frenchCacheExists = ($cacheCheckResult === "CACHE_EXISTS"); + // Fetch English page $command = "cd " . $this->getParameter('kernel.project_dir') . "/wiki_compare && python3 {$tempScriptPath} {$key} en"; $englishHtml = shell_exec($command); @@ -834,7 +862,8 @@ EOT; 'english_url' => $englishUrl, 'french_edit_url' => $frenchEditUrl, 'english_html' => $englishHtml, - 'french_html' => $frenchHtml + 'french_html' => $frenchHtml, + 'french_cache_exists' => $frenchCacheExists ]); } @@ -1104,7 +1133,25 @@ EOT; if (file_exists($pagesUnavailableInEnglishFile)) { $pagesUnavailableInEnglishData = json_decode(file_get_contents($pagesUnavailableInEnglishFile), true); if (isset($pagesUnavailableInEnglishData['pages']) && is_array($pagesUnavailableInEnglishData['pages'])) { - $pagesUnavailableInEnglish = $pagesUnavailableInEnglishData['pages']; + // Deduplicate pages based on URL + $uniquePages = []; + $seenUrls = []; + + foreach ($pagesUnavailableInEnglishData['pages'] as $page) { + if (isset($page['url'])) { + // Use URL as the key for deduplication + $url = $page['url']; + if (!isset($seenUrls[$url])) { + $seenUrls[$url] = true; + $uniquePages[] = $page; + } + } else { + // If no URL, keep the page (shouldn't happen, but just in case) + $uniquePages[] = $page; + } + } + + $pagesUnavailableInEnglish = $uniquePages; } } @@ -1112,10 +1159,10 @@ EOT; $specificPages = []; $outdatedPagesFile = $this->getParameter('kernel.project_dir') . '/wiki_compare/outdated_pages.json'; if (file_exists($outdatedPagesFile)) { - $outdatedPagesData = json_decode(file_get_contents($outdatedPagesFile), true); - if (isset($outdatedPagesData['specific_pages']) && is_array($outdatedPagesData['specific_pages'])) { - $specificPages = $outdatedPagesData['specific_pages']; - } + // Use a memory-efficient approach to extract only the specific_pages array + // without loading the entire file into memory + $maxPages = 100; // Limit the number of pages to prevent memory exhaustion + $specificPages = $this->extractSpecificPagesFromJson($outdatedPagesFile, $maxPages); } // Load newly created French pages @@ -1137,6 +1184,16 @@ EOT; $availableTranslations = $translationsData['translations']; } } + + // Load keys without wiki pages + $keysWithoutWiki = []; + $keysWithoutWikiFile = $this->getParameter('kernel.project_dir') . '/wiki_compare/keys_without_wiki.json'; + if (file_exists($keysWithoutWikiFile)) { + $keysWithoutWikiData = json_decode(file_get_contents($keysWithoutWikiFile), true); + if (is_array($keysWithoutWikiData)) { + $keysWithoutWiki = $keysWithoutWikiData; + } + } return $this->render('admin/wiki.html.twig', [ 'wiki_pages' => $wikiPages, @@ -1147,7 +1204,8 @@ EOT; 'newly_created_pages' => $newlyCreatedPages, 'staleness_stats' => $stalenessStats, 'wiki_pages_stats' => $wikiPagesStats, - 'available_translations' => $availableTranslations + 'available_translations' => $availableTranslations, + 'keys_without_wiki' => $keysWithoutWiki ]); } @@ -1791,4 +1849,124 @@ EOT; return $contentHtml; } + + /** + * Extracts the specific_pages array from a large JSON file without loading the entire file into memory + * + * @param string $filePath Path to the JSON file + * @param int $maxPages Maximum number of pages to extract (to prevent memory exhaustion) + * @return array The extracted specific_pages array + */ + private function extractSpecificPagesFromJson(string $filePath, int $maxPages = 100): array + { + $specificPages = []; + + // For very large files, we'll use a more direct approach + // Instead of parsing the entire JSON structure, we'll extract just what we need + + // First, check if the file exists and is readable + if (!is_readable($filePath)) { + return $specificPages; + } + + // Get the file size + $fileSize = filesize($filePath); + if ($fileSize === false || $fileSize === 0) { + return $specificPages; + } + + // For very large files, we'll use a more efficient approach + // We'll search for the "specific_pages" key directly + $handle = fopen($filePath, 'r'); + if (!$handle) { + return $specificPages; + } + + // Variables to track parsing state + $inSpecificPages = false; + $bracketCount = 0; + $buffer = ''; + $pageCount = 0; + $lineCount = 0; + + // Skip ahead to find the specific_pages key more quickly + // This is a simple optimization for this specific file structure + $found = false; + while (!$found && ($line = fgets($handle)) !== false) { + $lineCount++; + if (strpos($line, '"specific_pages"') !== false) { + $found = true; + $inSpecificPages = true; + + // Find the opening bracket of the array + if (strpos($line, '[') !== false) { + $bracketCount = 1; + $buffer = '['; // Start the buffer with an opening bracket + } else { + // If the opening bracket is on the next line + $nextLine = fgets($handle); + if ($nextLine !== false && strpos($nextLine, '[') !== false) { + $bracketCount = 1; + $buffer = '['; // Start the buffer with an opening bracket + } + } + break; + } + } + + // If we didn't find the specific_pages key, return empty array + if (!$found) { + fclose($handle); + return $specificPages; + } + + // Now process the specific_pages array + while (($line = fgets($handle)) !== false) { + // Count opening and closing brackets to track array nesting + $openBrackets = substr_count($line, '[') + substr_count($line, '{'); + $closeBrackets = substr_count($line, ']') + substr_count($line, '}'); + $bracketCount += $openBrackets - $closeBrackets; + + // Add the line to our buffer + $buffer .= $line; + + // If we've reached the end of the array (bracketCount = 0) + if ($bracketCount === 0) { + // Parse the buffer as JSON + $parsedData = json_decode($buffer, true); + if (is_array($parsedData)) { + // Limit the number of pages to prevent memory exhaustion + $specificPages = array_slice($parsedData, 0, $maxPages); + } else { + // If parsing fails, log the error but don't crash + error_log('Failed to parse specific_pages JSON data in ' . $filePath); + } + break; + } + + // Check if we've found a complete page object (when we see a closing brace followed by a comma) + if (preg_match('/\}\s*,\s*$/m', $line)) { + $pageCount++; + // If we've reached the maximum number of pages, stop processing + if ($pageCount >= $maxPages) { + // Close the array properly + $buffer = rtrim($buffer, ",\r\n") . ']'; + // Parse the buffer as JSON + $parsedData = json_decode($buffer, true); + if (is_array($parsedData)) { + $specificPages = $parsedData; + } else { + // If parsing fails, log the error but don't crash + error_log('Failed to parse specific_pages JSON data in ' . $filePath . ' after reaching max pages'); + } + break; + } + } + } + + // Close the file + fclose($handle); + + return $specificPages; + } } \ No newline at end of file diff --git a/templates/admin/wiki.html.twig b/templates/admin/wiki.html.twig index 3859a8b..1cf652d 100644 --- a/templates/admin/wiki.html.twig +++ b/templates/admin/wiki.html.twig @@ -492,6 +492,56 @@ {% endif %} + {% if keys_without_wiki is defined and keys_without_wiki|length > 0 %} +
+
+

Clés sans page wiki ({{ keys_without_wiki|length }})

+
+
+

Ces clés OSM sont utilisées en France mais n'ont pas de page wiki. Vous pouvez contribuer en créant une page pour ces clés.

+
+ + + + + + + + + + {% for key in keys_without_wiki %} + + + + + + {% endfor %} + +
CléNombre d'utilisationsActions
+ {{ key.key }} + + {{ key.count|number_format(0, ',', ' ') }} + + +
+
+
+
+ {% endif %} +

le score de fraîcheur prend en compte d'avantage la différence entre le nombre de mots que l'ancienneté de modification. diff --git a/templates/admin/wiki_create_french.html.twig b/templates/admin/wiki_create_french.html.twig index c7913f9..7960164 100644 --- a/templates/admin/wiki_create_french.html.twig +++ b/templates/admin/wiki_create_french.html.twig @@ -140,7 +140,25 @@

- + {% if french_cache_exists and french_html %} +
+
+ Version française en cache : +
+ {{ french_html|raw }} +
+ {% else %} + {% if french_html %} + + {% else %} +
+
+ La page française n'existe pas dans le cache. +

Utilisez le formulaire d'édition pour créer la traduction.

+
+
+ {% endif %} + {% endif %}
diff --git a/templates/public/wiki_create_french.html.twig b/templates/public/wiki_create_french.html.twig index 52501f7..f56e515 100644 --- a/templates/public/wiki_create_french.html.twig +++ b/templates/public/wiki_create_french.html.twig @@ -97,7 +97,25 @@
- + {% if french_cache_exists and french_html %} +
+
+ Version française en cache : +
+ {{ french_html|raw }} +
+ {% else %} + {% if french_html %} + + {% else %} +
+
+ La page française n'existe pas dans le cache. +

Utilisez le formulaire d'édition pour créer la traduction.

+
+
+ {% endif %} + {% endif %}
diff --git a/wiki_compare/__pycache__/wiki_compare.cpython-313.pyc b/wiki_compare/__pycache__/wiki_compare.cpython-313.pyc index 0c059414d20eb447a0be29c0fea3831833f99270..82e2c4759d4b48817ad4730609131f6b8da815c7 100644 GIT binary patch delta 17411 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 MdzJe68W!OH1s+aizyJUM delta 12361 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 D^KsoE diff --git a/wiki_compare/wiki_compare.py b/wiki_compare/wiki_compare.py index 294b61b..789cc63 100755 --- a/wiki_compare/wiki_compare.py +++ b/wiki_compare/wiki_compare.py @@ -37,9 +37,15 @@ from bs4 import BeautifulSoup import logging import matplotlib.pyplot as plt import numpy as np -import nltk from pathlib import Path +# Try to import nltk, but make it optional +try: + import nltk + NLTK_AVAILABLE = True +except ImportError: + NLTK_AVAILABLE = False + # Configure logging logging.basicConfig( level=logging.INFO, @@ -50,11 +56,13 @@ logger = logging.getLogger(__name__) # Constants TAGINFO_API_URL = "https://taginfo.openstreetmap.org/api/4/keys/all" +TAGINFO_FRANCE_API_URL = "https://taginfo.geofabrik.de/europe:france/api/4/keys/without_wiki_page" WIKI_BASE_URL_EN = "https://wiki.openstreetmap.org/wiki/Key:" WIKI_BASE_URL_FR = "https://wiki.openstreetmap.org/wiki/FR:Key:" WIKI_BASE_URL = "https://wiki.openstreetmap.org/wiki/" WIKI_CATEGORY_URL = "https://wiki.openstreetmap.org/wiki/Category:FR:Traductions_d%C3%A9synchronis%C3%A9es" TOP_KEYS_FILE = "top_keys.json" +KEYS_WITHOUT_WIKI_FILE = "keys_without_wiki.json" WIKI_PAGES_CSV = "wiki_pages.csv" OUTDATED_PAGES_FILE = "outdated_pages.json" STALENESS_HISTOGRAM_FILE = "staleness_histogram.png" @@ -63,17 +71,18 @@ NUM_WIKI_PAGES = 2 # HTML cache folder HTML_CACHE_DIR = "html_cache" -# Initialize NLTK for sentence tokenization -try: - nltk.data.find('tokenizers/punkt') -except LookupError: - nltk.download('punkt') +# Initialize NLTK for sentence tokenization if available +if NLTK_AVAILABLE: + try: + nltk.data.find('tokenizers/punkt') + except LookupError: + nltk.download('punkt') -# Also download punkt_tab resource which is needed for sent_tokenize -try: - nltk.data.find('tokenizers/punkt_tab') -except LookupError: - nltk.download('punkt_tab') + # Also download punkt_tab resource which is needed for sent_tokenize + try: + nltk.data.find('tokenizers/punkt_tab') + except LookupError: + nltk.download('punkt_tab') # Create HTML cache directory if it doesn't exist Path(HTML_CACHE_DIR).mkdir(exist_ok=True) @@ -177,6 +186,41 @@ def fetch_top_keys(limit=NUM_WIKI_PAGES): logger.error(f"Error fetching data from TagInfo API: {e}") return [] +def fetch_keys_without_wiki_page(limit=36): + """ + Fetch keys used in France that are missing a wiki page from TagInfo API + + Args: + limit (int): Number of keys to fetch + + Returns: + list: List of dictionaries containing key information + """ + logger.info(f"Fetching top {limit} OSM keys without wiki pages used in France...") + + params = { + 'page': 1, + 'rp': limit, + 'english': 0, + 'sortname': 'count_all', + 'sortorder': 'desc' + } + + try: + response = requests.get(TAGINFO_FRANCE_API_URL, params=params) + response.raise_for_status() + data = response.json() + + # Extract just the key names and counts + keys_without_wiki = [{'key': item['key'], 'count': item['count_all']} for item in data['data']] + + logger.info(f"Successfully fetched {len(keys_without_wiki)} keys without wiki pages") + return keys_without_wiki + + except requests.exceptions.RequestException as e: + logger.error(f"Error fetching data from TagInfo France API: {e}") + return [] + def load_json_data(filename): """ Load data from a JSON file @@ -295,6 +339,13 @@ def check_grammar_with_grammalecte(text): logger.warning("Empty text provided for grammar checking") return [] + # Check if grammalecte-cli is available + try: + subprocess.run(['which', 'grammalecte-cli'], capture_output=True, check=True) + except subprocess.CalledProcessError: + logger.warning("grammalecte-cli not found, skipping grammar check") + return [] + logger.info("Checking grammar with grammalecte-cli...") try: @@ -520,9 +571,13 @@ def fetch_wiki_page(key, language='en', is_specific_page=False, check_grammar=Tr clean_text = content.get_text(separator=' ', strip=True) word_count = len(clean_text.split()) - # Count sentences using NLTK - sentences = nltk.sent_tokenize(clean_text) - sentence_count = len(sentences) + # Count sentences using NLTK if available, otherwise use a simple approximation + if NLTK_AVAILABLE and check_grammar: + sentences = nltk.sent_tokenize(clean_text) + sentence_count = len(sentences) + else: + # Simple approximation: count periods, exclamation marks, and question marks + sentence_count = len(re.findall(r'[.!?]+', clean_text)) # Check grammar for French pages grammar_suggestions = [] @@ -1098,18 +1153,19 @@ def main(): This function: 1. Fetches the top OSM keys from TagInfo API - 2. Fetches and processes wiki pages for these keys - 3. Processes specific wiki pages listed in SPECIFIC_PAGES - 4. Processes pages from the FR:Traductions_désynchronisées category - 5. Calculates staleness scores for all pages - 6. Generates a histogram of staleness scores - 7. Saves the results to CSV and JSON files - 8. Prints a list of pages that need updating + 2. Fetches keys used in France that are missing a wiki page from TagInfo API + 3. Fetches and processes wiki pages for these keys + 4. Processes specific wiki pages listed in SPECIFIC_PAGES + 5. Processes pages from the FR:Traductions_désynchronisées category + 6. Calculates staleness scores for all pages + 7. Generates a histogram of staleness scores + 8. Saves the results to CSV and JSON files + 9. Prints a list of pages that need updating """ # Parse command-line arguments parser = argparse.ArgumentParser(description='Compare OpenStreetMap wiki pages in English and French.') parser.add_argument('--no-grammar-check', action='store_true', - help='Disable grammar checking for French pages') + help='Disable grammar checking for French pages', default=False) args = parser.parse_args() # Whether to check grammar for French pages @@ -1131,6 +1187,16 @@ def main(): # Save top keys to JSON save_to_json(top_keys, TOP_KEYS_FILE) + # Fetch keys without wiki pages used in France + keys_without_wiki = fetch_keys_without_wiki_page() + + if keys_without_wiki: + # Save keys without wiki pages to JSON + save_to_json(keys_without_wiki, KEYS_WITHOUT_WIKI_FILE) + logger.info(f"Saved {len(keys_without_wiki)} keys without wiki pages to {KEYS_WITHOUT_WIKI_FILE}") + else: + logger.warning("No keys without wiki pages were fetched.") + # Fetch wiki pages for each key wiki_pages = [] diff --git a/wiki_compare/wiki_pages.csv b/wiki_compare/wiki_pages.csv index 065aa9d..ebfa7be 100644 --- a/wiki_compare/wiki_pages.csv +++ b/wiki_compare/wiki_pages.csv @@ -3,105 +3,112 @@ building,en,https://wiki.openstreetmap.org/wiki/Key:building,2025-06-10,31,3774, building,fr,https://wiki.openstreetmap.org/wiki/FR:Key:building,2025-05-22,25,3181,544,155,8.91,https://wiki.openstreetmap.org/w/images/thumb/6/61/Emptyhouse.jpg/200px-Emptyhouse.jpg source,en,https://wiki.openstreetmap.org/wiki/Key:source,2025-08-12,27,2752,314,42,113.06,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png source,fr,https://wiki.openstreetmap.org/wiki/FR:Key:source,2024-02-07,23,2593,230,35,113.06,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -highway,en,https://wiki.openstreetmap.org/wiki/Key:highway,2025-04-10,30,4126,780,314,20.35,https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Roads_in_Switzerland_%2827965437018%29.jpg/200px-Roads_in_Switzerland_%2827965437018%29.jpg -highway,fr,https://wiki.openstreetmap.org/wiki/FR:Key:highway,2025-01-05,30,4141,695,313,20.35,https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Roads_in_Switzerland_%2827965437018%29.jpg/200px-Roads_in_Switzerland_%2827965437018%29.jpg -addr:housenumber,en,https://wiki.openstreetmap.org/wiki/Key:addr:housenumber,2025-07-24,11,330,97,20,14.01,https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/Ferry_Street%2C_Portaferry_%2809%29%2C_October_2009.JPG/200px-Ferry_Street%2C_Portaferry_%2809%29%2C_October_2009.JPG -addr:housenumber,fr,https://wiki.openstreetmap.org/wiki/FR:Key:addr:housenumber,2025-08-23,15,1653,150,77,14.01,https://wiki.openstreetmap.org/w/images/thumb/e/e9/Housenumber-karlsruhe-de.png/200px-Housenumber-karlsruhe-de.png -addr:street,en,https://wiki.openstreetmap.org/wiki/Key:addr:street,2024-10-29,12,602,101,16,66.04,https://upload.wikimedia.org/wikipedia/commons/thumb/6/64/UK_-_London_%2830474933636%29.jpg/200px-UK_-_London_%2830474933636%29.jpg -addr:street,fr,https://wiki.openstreetmap.org/wiki/FR:Key:addr:street,2025-08-23,15,1653,150,77,66.04,https://wiki.openstreetmap.org/w/images/thumb/e/e9/Housenumber-karlsruhe-de.png/200px-Housenumber-karlsruhe-de.png -addr:city,en,https://wiki.openstreetmap.org/wiki/Key:addr:city,2025-07-29,15,802,105,17,9.93,https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lillerod.jpg/200px-Lillerod.jpg -addr:city,fr,https://wiki.openstreetmap.org/wiki/FR:Key:addr:city,2025-08-23,15,1653,150,77,9.93,https://wiki.openstreetmap.org/w/images/thumb/e/e9/Housenumber-karlsruhe-de.png/200px-Housenumber-karlsruhe-de.png -name,en,https://wiki.openstreetmap.org/wiki/Key:name,2025-07-25,17,2196,281,82,42.39,https://upload.wikimedia.org/wikipedia/commons/thumb/6/61/Helena%2C_Montana.jpg/200px-Helena%2C_Montana.jpg -name,fr,https://wiki.openstreetmap.org/wiki/FR:Key:name,2025-01-16,21,1720,187,60,42.39,https://wiki.openstreetmap.org/w/images/3/37/Strakers.jpg -addr:postcode,en,https://wiki.openstreetmap.org/wiki/Key:addr:postcode,2024-10-29,14,382,83,11,67.11,https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/Farrer_post_code.jpg/200px-Farrer_post_code.jpg -addr:postcode,fr,https://wiki.openstreetmap.org/wiki/FR:Key:addr:postcode,2025-08-23,15,1653,150,77,67.11,https://wiki.openstreetmap.org/w/images/thumb/e/e9/Housenumber-karlsruhe-de.png/200px-Housenumber-karlsruhe-de.png -natural,en,https://wiki.openstreetmap.org/wiki/Key:natural,2025-07-17,17,2070,535,189,22.06,https://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/VocaDi-Nature%2CGeneral.jpeg/200px-VocaDi-Nature%2CGeneral.jpeg -natural,fr,https://wiki.openstreetmap.org/wiki/FR:Key:natural,2025-04-21,13,1499,455,174,22.06,https://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/VocaDi-Nature%2CGeneral.jpeg/200px-VocaDi-Nature%2CGeneral.jpeg -surface,en,https://wiki.openstreetmap.org/wiki/Key:surface,2025-08-28,24,3475,591,238,264.64,https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Transportation_in_Tanzania_Traffic_problems.JPG/200px-Transportation_in_Tanzania_Traffic_problems.JPG -surface,fr,https://wiki.openstreetmap.org/wiki/FR:Key:surface,2022-02-22,13,2587,461,232,264.64,https://upload.wikimedia.org/wikipedia/commons/thumb/a/a2/Transportation_in_Tanzania_Traffic_problems.JPG/200px-Transportation_in_Tanzania_Traffic_problems.JPG -addr:country,en,https://wiki.openstreetmap.org/wiki/Key:addr:country,2024-12-01,9,184,65,11,22.96,https://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Europe_ISO_3166-1.svg/200px-Europe_ISO_3166-1.svg.png -addr:country,fr,https://wiki.openstreetmap.org/wiki/FR:Key:addr:country,2025-03-25,8,187,65,11,22.96,https://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Europe_ISO_3166-1.svg/200px-Europe_ISO_3166-1.svg.png -landuse,en,https://wiki.openstreetmap.org/wiki/Key:landuse,2025-03-01,17,2071,446,168,39.41,https://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Changing_landuse_-_geograph.org.uk_-_1137810.jpg/200px-Changing_landuse_-_geograph.org.uk_-_1137810.jpg -landuse,fr,https://wiki.openstreetmap.org/wiki/FR:Key:landuse,2024-08-20,19,2053,418,182,39.41,https://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Changing_landuse_-_geograph.org.uk_-_1137810.jpg/200px-Changing_landuse_-_geograph.org.uk_-_1137810.jpg -power,en,https://wiki.openstreetmap.org/wiki/Key:power,2025-02-28,20,641,127,21,124.89,https://wiki.openstreetmap.org/w/images/thumb/0/01/Power-tower.JPG/200px-Power-tower.JPG -power,fr,https://wiki.openstreetmap.org/wiki/FR:Key:power,2023-06-27,14,390,105,25,124.89,https://wiki.openstreetmap.org/w/images/thumb/0/01/Power-tower.JPG/200px-Power-tower.JPG -waterway,en,https://wiki.openstreetmap.org/wiki/Key:waterway,2025-03-10,21,1830,365,118,77.94,https://wiki.openstreetmap.org/w/images/thumb/f/fe/450px-Marshall-county-indiana-yellow-river.jpg/200px-450px-Marshall-county-indiana-yellow-river.jpg -waterway,fr,https://wiki.openstreetmap.org/wiki/FR:Key:waterway,2024-03-08,18,1291,272,113,77.94,https://wiki.openstreetmap.org/w/images/thumb/f/fe/450px-Marshall-county-indiana-yellow-river.jpg/200px-450px-Marshall-county-indiana-yellow-river.jpg -building:levels,en,https://wiki.openstreetmap.org/wiki/Key:building:levels,2025-08-13,16,1351,204,25,76.11,https://wiki.openstreetmap.org/w/images/thumb/4/47/Building-levels.png/200px-Building-levels.png -building:levels,fr,https://wiki.openstreetmap.org/wiki/FR:Key:building:levels,2024-08-01,15,1457,202,26,76.11,https://wiki.openstreetmap.org/w/images/thumb/4/47/Building-levels.png/200px-Building-levels.png -amenity,en,https://wiki.openstreetmap.org/wiki/Key:amenity,2025-08-24,29,3066,915,504,160.78,https://wiki.openstreetmap.org/w/images/thumb/a/a5/Mapping-Features-Parking-Lot.png/200px-Mapping-Features-Parking-Lot.png -amenity,fr,https://wiki.openstreetmap.org/wiki/FR:Key:amenity,2023-07-19,22,2146,800,487,160.78,https://wiki.openstreetmap.org/w/images/thumb/a/a5/Mapping-Features-Parking-Lot.png/200px-Mapping-Features-Parking-Lot.png -barrier,en,https://wiki.openstreetmap.org/wiki/Key:barrier,2025-04-15,17,2137,443,173,207.98,https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/2014_Bystrzyca_K%C5%82odzka%2C_mury_obronne_05.jpg/200px-2014_Bystrzyca_K%C5%82odzka%2C_mury_obronne_05.jpg -barrier,fr,https://wiki.openstreetmap.org/wiki/FR:Key:barrier,2022-08-16,15,542,103,18,207.98,https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/2014_Bystrzyca_K%C5%82odzka%2C_mury_obronne_05.jpg/200px-2014_Bystrzyca_K%C5%82odzka%2C_mury_obronne_05.jpg -source:date,en,https://wiki.openstreetmap.org/wiki/Key:source:date,2023-04-01,11,395,75,10,22.47,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -source:date,fr,https://wiki.openstreetmap.org/wiki/FR:Key:source:date,2023-07-21,10,419,75,11,22.47,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -service,en,https://wiki.openstreetmap.org/wiki/Key:service,2025-03-16,22,1436,218,17,83.79,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -service,fr,https://wiki.openstreetmap.org/wiki/FR:Key:service,2024-03-04,11,443,100,10,83.79,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -addr:state,en,https://wiki.openstreetmap.org/wiki/Key:addr:state,2023-06-23,12,289,74,11,100,https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/WVaCent.jpg/200px-WVaCent.jpg -access,en,https://wiki.openstreetmap.org/wiki/Key:access,2025-08-06,31,5803,708,98,66.75,https://wiki.openstreetmap.org/w/images/5/5e/WhichAccess.png -access,fr,https://wiki.openstreetmap.org/wiki/FR:Key:access,2024-11-27,33,3200,506,83,66.75,https://wiki.openstreetmap.org/w/images/5/5e/WhichAccess.png -oneway,en,https://wiki.openstreetmap.org/wiki/Key:oneway,2025-07-17,28,2318,290,30,19.4,https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/One_way_sign.JPG/200px-One_way_sign.JPG -oneway,fr,https://wiki.openstreetmap.org/wiki/FR:Key:oneway,2025-06-16,14,645,108,14,19.4,https://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/France_road_sign_C12.svg/200px-France_road_sign_C12.svg.png -height,en,https://wiki.openstreetmap.org/wiki/Key:height,2025-07-21,24,1184,184,20,8.45,https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Height_demonstration_diagram.png/200px-Height_demonstration_diagram.png -height,fr,https://wiki.openstreetmap.org/wiki/FR:Key:height,2025-06-14,21,1285,190,21,8.45,https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Height_demonstration_diagram.png/200px-Height_demonstration_diagram.png -ref,en,https://wiki.openstreetmap.org/wiki/Key:ref,2025-07-25,26,4404,782,115,11.79,https://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/UK_traffic_sign_2901.svg/200px-UK_traffic_sign_2901.svg.png -ref,fr,https://wiki.openstreetmap.org/wiki/FR:Key:ref,2025-07-30,20,3393,460,12,11.79,https://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Autoroute_fran%C3%A7aise_1.svg/200px-Autoroute_fran%C3%A7aise_1.svg.png -maxspeed,en,https://wiki.openstreetmap.org/wiki/Key:maxspeed,2025-08-20,30,4275,404,38,39.24,https://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Zeichen_274-60_-_Zul%C3%A4ssige_H%C3%B6chstgeschwindigkeit%2C_StVO_2017.svg/200px-Zeichen_274-60_-_Zul%C3%A4ssige_H%C3%B6chstgeschwindigkeit%2C_StVO_2017.svg.png -maxspeed,fr,https://wiki.openstreetmap.org/wiki/FR:Key:maxspeed,2025-05-10,25,1401,156,23,39.24,https://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Zeichen_274-60_-_Zul%C3%A4ssige_H%C3%B6chstgeschwindigkeit%2C_StVO_2017.svg/200px-Zeichen_274-60_-_Zul%C3%A4ssige_H%C3%B6chstgeschwindigkeit%2C_StVO_2017.svg.png -lanes,en,https://wiki.openstreetmap.org/wiki/Key:lanes,2025-08-21,26,2869,355,48,117.16,https://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/A55_trunk_road_looking_east_-_geograph.org.uk_-_932668.jpg/200px-A55_trunk_road_looking_east_-_geograph.org.uk_-_932668.jpg -lanes,fr,https://wiki.openstreetmap.org/wiki/FR:Key:lanes,2024-03-07,19,1492,167,19,117.16,https://wiki.openstreetmap.org/w/images/thumb/d/d4/Dscf0444_600.jpg/200px-Dscf0444_600.jpg -start_date,en,https://wiki.openstreetmap.org/wiki/Key:start_date,2025-08-01,22,1098,168,29,214.58,https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Connel_bridge_plate.jpg/200px-Connel_bridge_plate.jpg -start_date,fr,https://wiki.openstreetmap.org/wiki/FR:Key:start_date,2022-08-29,19,1097,133,22,214.58,https://upload.wikimedia.org/wikipedia/commons/thumb/d/dc/Connel_bridge_plate.jpg/200px-Connel_bridge_plate.jpg -addr:district,en,https://wiki.openstreetmap.org/wiki/Key:addr:district,2023-11-06,11,244,76,11,139.96,https://upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Hangal_Taluk.jpg/200px-Hangal_Taluk.jpg -addr:district,fr,https://wiki.openstreetmap.org/wiki/FR:Key:addr:district,2025-08-23,15,1653,150,77,139.96,https://wiki.openstreetmap.org/w/images/thumb/e/e9/Housenumber-karlsruhe-de.png/200px-Housenumber-karlsruhe-de.png -layer,en,https://wiki.openstreetmap.org/wiki/Key:layer,2025-01-02,16,1967,181,17,65.95,https://wiki.openstreetmap.org/w/images/thumb/2/26/Washington_layers.png/200px-Washington_layers.png -layer,fr,https://wiki.openstreetmap.org/wiki/FR:Key:layer,2024-02-16,15,2231,162,17,65.95,https://wiki.openstreetmap.org/w/images/thumb/2/26/Washington_layers.png/200px-Washington_layers.png -type,en,https://wiki.openstreetmap.org/wiki/Key:type,2025-05-13,20,911,200,72,334.06,https://wiki.openstreetmap.org/w/images/thumb/5/58/Osm_element_node_no.svg/30px-Osm_element_node_no.svg.png -type,fr,https://wiki.openstreetmap.org/wiki/FR:Key:type,2020-11-13,10,444,78,10,334.06,https://wiki.openstreetmap.org/w/images/thumb/5/58/Osm_element_node_no.svg/30px-Osm_element_node_no.svg.png -operator,en,https://wiki.openstreetmap.org/wiki/Key:operator,2025-08-26,24,1908,241,37,223.28,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -operator,fr,https://wiki.openstreetmap.org/wiki/FR:Key:operator,2022-09-30,15,418,89,11,223.28,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -lit,en,https://wiki.openstreetmap.org/wiki/Key:lit,2024-07-20,17,931,174,52,38.88,https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Peatonal_Bicentenario.JPG/200px-Peatonal_Bicentenario.JPG -lit,fr,https://wiki.openstreetmap.org/wiki/FR:Key:lit,2025-01-19,17,628,123,14,38.88,https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/2014_K%C5%82odzko%2C_ul._Grottgera_14.JPG/200px-2014_K%C5%82odzko%2C_ul._Grottgera_14.JPG -wall,en,https://wiki.openstreetmap.org/wiki/Key:wall,2024-05-02,14,682,206,61,100,https://wiki.openstreetmap.org/w/images/thumb/5/58/Osm_element_node_no.svg/30px-Osm_element_node_no.svg.png -tiger:cfcc,en,https://wiki.openstreetmap.org/wiki/Key:tiger:cfcc,2022-12-09,10,127,24,7,100,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -crossing,en,https://wiki.openstreetmap.org/wiki/Key:crossing,2024-02-18,25,2678,363,34,76.98,https://wiki.openstreetmap.org/w/images/thumb/7/75/Toucan.jpg/200px-Toucan.jpg -crossing,fr,https://wiki.openstreetmap.org/wiki/FR:Key:crossing,2025-01-20,15,1390,254,28,76.98,https://wiki.openstreetmap.org/w/images/thumb/7/75/Toucan.jpg/200px-Toucan.jpg -tiger:county,en,https://wiki.openstreetmap.org/wiki/Key:tiger:county,2022-12-09,10,127,24,7,100,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -source:addr,en,https://wiki.openstreetmap.org/wiki/Key:source:addr,2023-07-05,9,200,70,10,100,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -footway,en,https://wiki.openstreetmap.org/wiki/Key:footway,2025-08-20,23,2002,369,39,99.66,https://wiki.openstreetmap.org/w/images/thumb/b/b9/Sidewalk_and_zebra-crossing.jpg/200px-Sidewalk_and_zebra-crossing.jpg -footway,fr,https://wiki.openstreetmap.org/wiki/FR:Key:footway,2024-06-04,14,685,147,28,99.66,https://wiki.openstreetmap.org/w/images/thumb/b/b9/Sidewalk_and_zebra-crossing.jpg/200px-Sidewalk_and_zebra-crossing.jpg -ref:bag,en,https://wiki.openstreetmap.org/wiki/Key:ref:bag,2024-10-09,10,254,69,11,100,https://wiki.openstreetmap.org/w/images/thumb/5/58/Osm_element_node_no.svg/30px-Osm_element_node_no.svg.png -addr:place,en,https://wiki.openstreetmap.org/wiki/Key:addr:place,2025-03-28,16,1204,154,13,136.57,https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Suburb_of_Phillip.jpg/200px-Suburb_of_Phillip.jpg -addr:place,fr,https://wiki.openstreetmap.org/wiki/FR:Key:addr:place,2023-06-17,11,276,75,12,136.57,https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Suburb_of_Phillip.jpg/200px-Suburb_of_Phillip.jpg -tiger:reviewed,en,https://wiki.openstreetmap.org/wiki/Key:tiger:reviewed,2025-08-01,16,734,105,11,100,https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/US-Census-TIGERLogo.svg/200px-US-Census-TIGERLogo.svg.png -leisure,en,https://wiki.openstreetmap.org/wiki/Key:leisure,2025-02-28,12,1084,374,180,232.43,https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Hammock_-_Polynesia.jpg/200px-Hammock_-_Polynesia.jpg -leisure,fr,https://wiki.openstreetmap.org/wiki/FR:Key:leisure,2021-12-29,11,951,360,186,232.43,https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Hammock_-_Polynesia.jpg/200px-Hammock_-_Polynesia.jpg -addr:suburb,en,https://wiki.openstreetmap.org/wiki/Key:addr:suburb,2024-02-24,14,439,89,11,1.49,https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Grosvenor_Place_2_2008_06_19.jpg/200px-Grosvenor_Place_2_2008_06_19.jpg -addr:suburb,fr,https://wiki.openstreetmap.org/wiki/FR:Key:addr:suburb,2024-02-18,13,418,87,11,1.49,https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Grosvenor_Place_2_2008_06_19.jpg/200px-Grosvenor_Place_2_2008_06_19.jpg -ele,en,https://wiki.openstreetmap.org/wiki/Key:ele,2025-07-18,18,1846,165,24,104.45,https://wiki.openstreetmap.org/w/images/a/a3/Key-ele_mapnik.png -ele,fr,https://wiki.openstreetmap.org/wiki/FR:Key:ele,2024-03-02,15,1277,128,13,104.45,https://wiki.openstreetmap.org/w/images/a/a3/Key-ele_mapnik.png -tracktype,en,https://wiki.openstreetmap.org/wiki/Key:tracktype,2024-12-02,16,652,146,35,32.71,https://wiki.openstreetmap.org/w/images/thumb/1/13/Tracktype-collage.jpg/200px-Tracktype-collage.jpg -tracktype,fr,https://wiki.openstreetmap.org/wiki/FR:Key:tracktype,2025-05-03,11,463,105,29,32.71,https://wiki.openstreetmap.org/w/images/thumb/1/13/Tracktype-collage.jpg/200px-Tracktype-collage.jpg -addr:neighbourhood,en,https://wiki.openstreetmap.org/wiki/Key:addr:neighbourhood,2025-04-29,24,2020,235,83,100,https://wiki.openstreetmap.org/w/images/thumb/e/e9/Housenumber-karlsruhe-de.png/200px-Housenumber-karlsruhe-de.png -addr:hamlet,en,https://wiki.openstreetmap.org/wiki/Key:addr:hamlet,2024-12-05,9,142,64,11,100,https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Grosvenor_Place_2_2008_06_19.jpg/200px-Grosvenor_Place_2_2008_06_19.jpg -addr:province,en,https://wiki.openstreetmap.org/wiki/Key:addr:province,2022-05-04,9,156,64,11,100,https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Stamp_of_Indonesia_-_2002_-_Colnect_265917_-_Aceh_Province.jpeg/200px-Stamp_of_Indonesia_-_2002_-_Colnect_265917_-_Aceh_Province.jpeg -leaf_type,en,https://wiki.openstreetmap.org/wiki/Key:leaf_type,2025-01-22,15,739,201,57,114.46,https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Picea_abies_Nadelkissen.jpg/200px-Picea_abies_Nadelkissen.jpg -leaf_type,fr,https://wiki.openstreetmap.org/wiki/FR:Key:leaf_type,2023-07-02,14,734,220,64,114.46,https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Picea_abies_Nadelkissen.jpg/200px-Picea_abies_Nadelkissen.jpg -addr:full,en,https://wiki.openstreetmap.org/wiki/Key:addr:full,2025-04-29,24,2020,235,83,100,https://wiki.openstreetmap.org/w/images/thumb/e/e9/Housenumber-karlsruhe-de.png/200px-Housenumber-karlsruhe-de.png -Anatomie_des_étiquettes_osm,en,https://wiki.openstreetmap.org/wiki/Anatomie_des_étiquettes_osm,2025-06-08,22,963,53,0,100, +Anatomie_des_étiquettes_osm,en,https://wiki.openstreetmap.org/wiki/Anatomie_des_étiquettes_osm,2025-06-08,22,0,0,0,100, Tag:leisure=children_club,en,https://wiki.openstreetmap.org/wiki/Tag:leisure=children_club,2025-02-02,9,163,69,9,56.04,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png Tag:leisure=children_club,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:leisure=children_club,2024-05-02,8,294,67,10,56.04,https://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Dave_%26_Buster%27s_video_arcade_in_Columbus%2C_OH_-_17910.JPG/200px-Dave_%26_Buster%27s_video_arcade_in_Columbus%2C_OH_-_17910.JPG Tag:harassment_prevention=ask_angela,en,https://wiki.openstreetmap.org/wiki/Tag:harassment_prevention=ask_angela,2025-02-22,14,463,72,9,42.56,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png Tag:harassment_prevention=ask_angela,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:harassment_prevention=ask_angela,2025-09-01,20,873,166,15,42.56,https://wiki.openstreetmap.org/w/images/thumb/1/15/2024-06-27T08.40.50_ask_angela_lyon.jpg/200px-2024-06-27T08.40.50_ask_angela_lyon.jpg Key:harassment_prevention,en,https://wiki.openstreetmap.org/wiki/Key:harassment_prevention,2024-08-10,12,196,69,14,66.72,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png Key:harassment_prevention,fr,https://wiki.openstreetmap.org/wiki/FR:Key:harassment_prevention,2025-07-03,15,328,83,14,66.72,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png -Proposal process,en,https://wiki.openstreetmap.org/wiki/Proposal process,2025-08-13,46,5292,202,4,166.25,https://wiki.openstreetmap.org/w/images/thumb/c/c2/Save_proposal_first.png/761px-Save_proposal_first.png -Proposal process,fr,https://wiki.openstreetmap.org/wiki/FR:Proposal process,2023-09-22,15,1146,24,0,166.25, -Automated_Edits_code_of_conduct,en,https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct,2025-07-26,19,2062,69,0,26.35, -Automated_Edits_code_of_conduct,fr,https://wiki.openstreetmap.org/wiki/FR:Automated_Edits_code_of_conduct,2025-04-03,17,1571,16,0,26.35, +Proposal process,en,https://wiki.openstreetmap.org/wiki/Proposal process,2025-08-13,46,5292,202,4,172.34,https://wiki.openstreetmap.org/w/images/thumb/c/c2/Save_proposal_first.png/761px-Save_proposal_first.png +Proposal process,fr,https://wiki.openstreetmap.org/wiki/FR:Proposal process,2023-09-22,15,0,0,0,172.34, +Automated_Edits_code_of_conduct,en,https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct,2025-07-26,19,0,0,0,23.1, +Automated_Edits_code_of_conduct,fr,https://wiki.openstreetmap.org/wiki/FR:Automated_Edits_code_of_conduct,2025-04-03,17,0,0,0,23.1, Key:cuisine,en,https://wiki.openstreetmap.org/wiki/Key:cuisine,2025-07-23,17,3422,693,303,107.73,https://upload.wikimedia.org/wikipedia/commons/thumb/f/f0/Food_montage.jpg/200px-Food_montage.jpg Key:cuisine,fr,https://wiki.openstreetmap.org/wiki/FR:Key:cuisine,2024-02-16,15,2866,690,316,107.73,https://upload.wikimedia.org/wikipedia/commons/thumb/f/f0/Food_montage.jpg/200px-Food_montage.jpg -Libre_Charge_Map,en,https://wiki.openstreetmap.org/wiki/Libre_Charge_Map,2025-07-28,11,328,10,2,100,https://wiki.openstreetmap.org/w/images/thumb/8/8e/Screenshot_2025-07-28_at_14-40-11_LibreChargeMap_-_OSM_Bliss.png/300px-Screenshot_2025-07-28_at_14-40-11_LibreChargeMap_-_OSM_Bliss.png -OSM_Mon_Commerce,en,https://wiki.openstreetmap.org/wiki/OSM_Mon_Commerce,2025-07-29,17,418,34,3,100,https://wiki.openstreetmap.org/w/images/thumb/6/67/Villes_OSM_Mon_Commerce.png/500px-Villes_OSM_Mon_Commerce.png +Libre_Charge_Map,en,https://wiki.openstreetmap.org/wiki/Libre_Charge_Map,2025-09-03,11,328,10,2,1.34,https://wiki.openstreetmap.org/w/images/thumb/8/8e/Screenshot_2025-07-28_at_14-40-11_LibreChargeMap_-_OSM_Bliss.png/300px-Screenshot_2025-07-28_at_14-40-11_LibreChargeMap_-_OSM_Bliss.png +Libre_Charge_Map,fr,https://wiki.openstreetmap.org/wiki/FR:Libre_Charge_Map,2025-09-03,12,101,14,2,1.34,https://wiki.openstreetmap.org/w/images/thumb/8/8e/Screenshot_2025-07-28_at_14-40-11_LibreChargeMap_-_OSM_Bliss.png/300px-Screenshot_2025-07-28_at_14-40-11_LibreChargeMap_-_OSM_Bliss.png +OSM_Mon_Commerce,en,https://wiki.openstreetmap.org/wiki/OSM_Mon_Commerce,2025-07-29,17,418,34,3,8.85,https://wiki.openstreetmap.org/w/images/thumb/6/67/Villes_OSM_Mon_Commerce.png/500px-Villes_OSM_Mon_Commerce.png +OSM_Mon_Commerce,fr,https://wiki.openstreetmap.org/wiki/FR:OSM_Mon_Commerce,2025-09-03,13,256,18,3,8.85,https://wiki.openstreetmap.org/w/images/thumb/6/67/Villes_OSM_Mon_Commerce.png/500px-Villes_OSM_Mon_Commerce.png +Complète_Tes_Commerces,en,https://wiki.openstreetmap.org/wiki/Complète_Tes_Commerces,2025-08-03,9,0,0,0,5.35, +Complète_Tes_Commerces,fr,https://wiki.openstreetmap.org/wiki/FR:Complète_Tes_Commerces,2025-08-26,14,0,0,0,5.35, Tag:amenity=charging_station,en,https://wiki.openstreetmap.org/wiki/Tag:amenity=charging_station,2025-08-29,16,1509,284,62,55.72,https://wiki.openstreetmap.org/w/images/thumb/4/4d/Recharge_Vigra_charging_station.jpg/200px-Recharge_Vigra_charging_station.jpg Tag:amenity=charging_station,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:amenity=charging_station,2024-12-28,19,2662,331,58,55.72,https://wiki.openstreetmap.org/w/images/thumb/4/4d/Recharge_Vigra_charging_station.jpg/200px-Recharge_Vigra_charging_station.jpg +Organised_Editing/Activities/MapYourGrid_Initiative,en,https://wiki.openstreetmap.org/wiki/Organised_Editing/Activities/MapYourGrid_Initiative,2025-09-03,33,1872,122,2,100,https://wiki.openstreetmap.org/w/images/thumb/f/f9/Mapyourgrid-logo.png/350px-Mapyourgrid-logo.png +Key:highway,en,https://wiki.openstreetmap.org/wiki/Key:highway,2025-04-10,30,4126,780,314,20.35,https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Roads_in_Switzerland_%2827965437018%29.jpg/200px-Roads_in_Switzerland_%2827965437018%29.jpg +Key:highway,fr,https://wiki.openstreetmap.org/wiki/FR:Key:highway,2025-01-05,30,4141,695,313,20.35,https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Roads_in_Switzerland_%2827965437018%29.jpg/200px-Roads_in_Switzerland_%2827965437018%29.jpg +Quality_assurance,en,https://wiki.openstreetmap.org/wiki/Quality_assurance,2025-06-01,19,0,0,0,15.6, +Quality_assurance,fr,https://wiki.openstreetmap.org/wiki/FR:Quality_assurance,2025-08-18,19,0,0,0,15.6, +Verifiability,en,https://wiki.openstreetmap.org/wiki/Verifiability,2024-11-28,22,1440,59,1,102.48,https://wiki.openstreetmap.org/w/images/thumb/7/7d/Vernier_calipers.svg/160px-Vernier_calipers.svg.png +Verifiability,fr,https://wiki.openstreetmap.org/wiki/FR:Verifiability,2023-07-29,13,842,23,1,102.48,https://wiki.openstreetmap.org/w/images/thumb/7/7d/Vernier_calipers.svg/160px-Vernier_calipers.svg.png +Good_practice,en,https://wiki.openstreetmap.org/wiki/Good_practice,2025-07-18,34,2611,122,2,73.08,https://wiki.openstreetmap.org/w/images/thumb/8/84/Tracks_with_descriptive_name_tags.png/300px-Tracks_with_descriptive_name_tags.png +Good_practice,fr,https://wiki.openstreetmap.org/wiki/FR:Good_practice,2024-07-26,33,2791,80,1,73.08,https://wiki.openstreetmap.org/w/images/thumb/8/84/Tracks_with_descriptive_name_tags.png/300px-Tracks_with_descriptive_name_tags.png +Mapping_parties,en,https://wiki.openstreetmap.org/wiki/Mapping_parties,2023-11-12,10,512,18,3,290.75,https://wiki.openstreetmap.org/w/images/thumb/c/c3/Mappers-learning-to-gps.jpg/300px-Mappers-learning-to-gps.jpg +Mapping_parties,fr,https://wiki.openstreetmap.org/wiki/FR:Mapping_parties,2019-11-23,9,622,15,2,290.75,https://wiki.openstreetmap.org/w/images/thumb/c/c3/Mappers-learning-to-gps.jpg/300px-Mappers-learning-to-gps.jpg +State_of_the_Map,en,https://wiki.openstreetmap.org/wiki/State_of_the_Map,2025-08-22,45,2975,577,120,100,https://wiki.openstreetmap.org/w/images/thumb/a/af/Sotm_2025_coloured.png/120px-Sotm_2025_coloured.png +Diversity,en,https://wiki.openstreetmap.org/wiki/Diversity,2024-09-27,25,0,0,0,41.3, +Diversity,fr,https://wiki.openstreetmap.org/wiki/FR:Diversity,2025-04-20,27,0,0,0,41.3, +Mapping_private_information,en,https://wiki.openstreetmap.org/wiki/Mapping_private_information,2025-07-21,18,0,0,0,100, +Any_tags_you_like,en,https://wiki.openstreetmap.org/wiki/Any_tags_you_like,2025-05-14,21,0,0,0,307.45, +Any_tags_you_like,fr,https://wiki.openstreetmap.org/wiki/FR:Any_tags_you_like,2021-03-01,18,0,0,0,307.45, +Organised_Editing/Best_Practices,en,https://wiki.openstreetmap.org/wiki/Organised_Editing/Best_Practices,2025-07-18,16,501,10,1,100,https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Ambox_warning_pn.svg/40px-Ambox_warning_pn.svg.png +Map_features,en,https://wiki.openstreetmap.org/wiki/Map_features,2025-07-21,125,21926,4255,2222,507.98,https://upload.wikimedia.org/wikipedia/commons/thumb/6/6b/Bar_MXCT.JPG/100px-Bar_MXCT.JPG +Map_features,fr,https://wiki.openstreetmap.org/wiki/FR:Map_features,2018-12-27,103,23159,5516,3062,507.98,https://wiki.openstreetmap.org/w/images/c/c4/Aerialway_gondola_render.png +https://wiki.openstreetmap.org/wiki/FR:Quality_Assurance,fr,https://wiki.openstreetmap.org/wiki/FR:Quality_Assurance,2015-05-16,16,0,0,0,0, +https://wiki.openstreetmap.org/wiki/Quality_Assurance,en,https://wiki.openstreetmap.org/wiki/Quality_Assurance,2025-06-01,19,0,0,0,100, +https://wiki.openstreetmap.org/wiki/FR:Nominatim/Installation,fr,https://wiki.openstreetmap.org/wiki/FR:Nominatim/Installation,2016-08-22,32,0,0,0,0, +https://wiki.openstreetmap.org/wiki/FR:Maxheight_Map,fr,https://wiki.openstreetmap.org/wiki/FR:Maxheight_Map,2017-12-11,27,1090,74,10,0,https://wiki.openstreetmap.org/w/images/thumb/c/c7/Maxheight_Map.png/400px-Maxheight_Map.png +https://wiki.openstreetmap.org/wiki/Maxheight_Map,en,https://wiki.openstreetmap.org/wiki/Maxheight_Map,2025-08-31,34,2323,95,16,100,https://wiki.openstreetmap.org/w/images/thumb/d/d7/Maxheight_map_complex.png/200px-Maxheight_map_complex.png +https://wiki.openstreetmap.org/wiki/FR:Enregistrement_de_traces_GPS,fr,https://wiki.openstreetmap.org/wiki/FR:Enregistrement_de_traces_GPS,2018-03-20,17,1040,45,2,0,https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/GPS_Satellite_NASA_art-iif.jpg/120px-GPS_Satellite_NASA_art-iif.jpg +https://wiki.openstreetmap.org/wiki/FR:Conversion_des_traces_GPS,fr,https://wiki.openstreetmap.org/wiki/FR:Conversion_des_traces_GPS,2018-03-27,11,536,29,2,0,https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/GPS_Satellite_NASA_art-iif.jpg/120px-GPS_Satellite_NASA_art-iif.jpg +https://wiki.openstreetmap.org/wiki/FR:%C3%89l%C3%A9ments_cartographiques,fr,https://wiki.openstreetmap.org/wiki/FR:%C3%89l%C3%A9ments_cartographiques,2018-12-27,103,23159,5516,3062,0,https://wiki.openstreetmap.org/w/images/c/c4/Aerialway_gondola_render.png +https://wiki.openstreetmap.org/wiki/FR:Relation:bridge,fr,https://wiki.openstreetmap.org/wiki/FR:Relation:bridge,2019-02-22,8,190,68,10,0,https://wiki.openstreetmap.org/w/images/thumb/9/9a/Mapping-Features-Road-Bridge.png/200px-Mapping-Features-Road-Bridge.png +https://wiki.openstreetmap.org/wiki/Relation:bridge,en,https://wiki.openstreetmap.org/wiki/Relation:bridge,2024-05-28,11,426,92,15,100,https://wiki.openstreetmap.org/w/images/thumb/9/9a/Mapping-Features-Road-Bridge.png/200px-Mapping-Features-Road-Bridge.png +https://wiki.openstreetmap.org/wiki/FR:Xapi,fr,https://wiki.openstreetmap.org/wiki/FR:Xapi,2020-04-09,32,2837,58,3,0,https://wiki.openstreetmap.org/w/images/c/c9/Logo.png +https://wiki.openstreetmap.org/wiki/Xapi,en,https://wiki.openstreetmap.org/wiki/Xapi,2020-04-09,42,2760,73,2,100,https://wiki.openstreetmap.org/w/images/c/c9/Logo.png +https://wiki.openstreetmap.org/wiki/FR:Key:min_age,fr,https://wiki.openstreetmap.org/wiki/FR:Key:min_age,2020-09-23,10,248,73,12,0,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png +https://wiki.openstreetmap.org/wiki/Key:min_age,en,https://wiki.openstreetmap.org/wiki/Key:min_age,2023-06-01,15,539,126,18,100,https://wiki.openstreetmap.org/w/images/thumb/7/76/Osm_element_node.svg/30px-Osm_element_node.svg.png +https://wiki.openstreetmap.org/wiki/FR:Google_Maps_user_contributions,fr,https://wiki.openstreetmap.org/wiki/FR:Google_Maps_user_contributions,2020-10-01,16,2029,17,3,0,https://wiki.openstreetmap.org/w/images/thumb/7/7b/Simple_sad_face.svg/100px-Simple_sad_face.svg.png +https://wiki.openstreetmap.org/wiki/Google_Maps_user_contributions,en,https://wiki.openstreetmap.org/wiki/Google_Maps_user_contributions,2025-03-13,15,766,28,2,100,https://wiki.openstreetmap.org/w/images/thumb/7/7b/Simple_sad_face.svg/100px-Simple_sad_face.svg.png +https://wiki.openstreetmap.org/wiki/FR:Quality_Assurance_Tools_script,fr,https://wiki.openstreetmap.org/wiki/FR:Quality_Assurance_Tools_script,2021-01-17,18,701,50,15,0,https://wiki.openstreetmap.org/w/images/e/e0/Qat_script_logo.png +https://wiki.openstreetmap.org/wiki/Quality_Assurance_Tools_script,en,https://wiki.openstreetmap.org/wiki/Quality_Assurance_Tools_script,2020-07-24,21,1172,59,15,100,https://wiki.openstreetmap.org/w/images/thumb/f/f9/Qat_script_download_dlg_screenshot_small.png/518px-Qat_script_download_dlg_screenshot_small.png +https://wiki.openstreetmap.org/wiki/FR:Unconfirmed_user,fr,https://wiki.openstreetmap.org/wiki/FR:Unconfirmed_user,2021-02-07,8,0,0,0,0, +https://wiki.openstreetmap.org/wiki/Unconfirmed_user,en,https://wiki.openstreetmap.org/wiki/Unconfirmed_user,2025-04-18,9,0,0,0,100, +https://wiki.openstreetmap.org/wiki/FR:Key:generator:method,fr,https://wiki.openstreetmap.org/wiki/FR:Key:generator:method,2023-06-19,9,396,101,13,0,https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Huntly_Power_Station.JPG/200px-Huntly_Power_Station.JPG +https://wiki.openstreetmap.org/wiki/Key:generator:method,en,https://wiki.openstreetmap.org/wiki/Key:generator:method,2023-11-26,11,482,151,39,100,https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Huntly_Power_Station.JPG/200px-Huntly_Power_Station.JPG +https://wiki.openstreetmap.org/wiki/FR:Import/Guidelines,fr,https://wiki.openstreetmap.org/wiki/FR:Import/Guidelines,2023-07-04,23,0,0,0,0, +https://wiki.openstreetmap.org/wiki/FR:Tag:sport%3Dshooting,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:sport%3Dshooting,2023-07-18,11,393,88,15,0,https://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Hattie_Johnson_2.jpg/200px-Hattie_Johnson_2.jpg +https://wiki.openstreetmap.org/wiki/Tag:sport%3Dshooting,en,https://wiki.openstreetmap.org/wiki/Tag:sport%3Dshooting,2024-12-02,15,454,123,15,100,https://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Hattie_Johnson_2.jpg/200px-Hattie_Johnson_2.jpg +https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dcombustion,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dcombustion,2023-07-24,10,419,104,13,0,https://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Et_baal.jpg/200px-Et_baal.jpg +https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dcombustion,en,https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dcombustion,2023-11-21,10,203,97,12,100,https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/USMC-090111-M-1394J-003.jpg/200px-USMC-090111-M-1394J-003.jpg +https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dfission,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dfission,2023-07-24,10,424,105,13,0,https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Nuclear_fission.svg/200px-Nuclear_fission.svg.png +https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dfission,en,https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dfission,2023-11-21,10,156,77,12,100,https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Nuclear_fission.svg/200px-Nuclear_fission.svg.png +https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dfusion,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dfusion,2023-07-24,10,450,107,13,0,https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Deuterium-tritium_fusion.svg/200px-Deuterium-tritium_fusion.svg.png +https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dfusion,en,https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dfusion,2023-11-21,10,203,83,12,100,https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Deuterium-tritium_fusion.svg/200px-Deuterium-tritium_fusion.svg.png +https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dgasification,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dgasification,2023-07-24,10,433,103,13,0,https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Holzvergaser_G%C3%BCssing.jpg/200px-Holzvergaser_G%C3%BCssing.jpg +https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dgasification,en,https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dgasification,2023-07-16,12,299,98,13,100,https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Holzvergaser_G%C3%BCssing.jpg/200px-Holzvergaser_G%C3%BCssing.jpg +https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dthermal,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dthermal,2023-07-24,10,447,107,13,0,https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/PS10_solar_power_tower.jpg/200px-PS10_solar_power_tower.jpg +https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dthermal,en,https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dthermal,2023-11-20,15,377,135,20,100,https://upload.wikimedia.org/wikipedia/commons/thumb/6/63/Solar_Plant_kl.jpg/200px-Solar_Plant_kl.jpg +https://wiki.openstreetmap.org/wiki/FR:Key:shop,fr,https://wiki.openstreetmap.org/wiki/FR:Key:shop,2023-07-25,33,3285,754,382,0,https://wiki.openstreetmap.org/w/images/thumb/2/26/Geograph_shop.jpg/200px-Geograph_shop.jpg +https://wiki.openstreetmap.org/wiki/Key:shop,en,https://wiki.openstreetmap.org/wiki/Key:shop,2025-03-22,31,3638,816,392,100,https://wiki.openstreetmap.org/w/images/thumb/d/dc/North_london_shops.jpg/200px-North_london_shops.jpg +https://wiki.openstreetmap.org/wiki/FR:Tag:generator:source%3Dbiomass,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:generator:source%3Dbiomass,2023-07-26,10,278,80,14,0,https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Biomasse-Heizkraftwerk_Sellessen.jpg/200px-Biomasse-Heizkraftwerk_Sellessen.jpg +https://wiki.openstreetmap.org/wiki/Tag:generator:source%3Dbiomass,en,https://wiki.openstreetmap.org/wiki/Tag:generator:source%3Dbiomass,2023-11-22,15,445,117,16,100,https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/2013-05-03_Fotoflug_Leer_Papenburg_DSCF6945.jpg/200px-2013-05-03_Fotoflug_Leer_Papenburg_DSCF6945.jpg +https://wiki.openstreetmap.org/wiki/FR:OpenRailwayMap/API,fr,https://wiki.openstreetmap.org/wiki/FR:OpenRailwayMap/API,2023-10-15,12,0,0,0,0, +https://wiki.openstreetmap.org/wiki/API,en,https://wiki.openstreetmap.org/wiki/API,2022-10-05,16,0,0,0,100, +https://wiki.openstreetmap.org/wiki/FR:Internationalisation_des_cartes,fr,https://wiki.openstreetmap.org/wiki/FR:Internationalisation_des_cartes,2023-12-06,11,383,24,3,0,https://wiki.openstreetmap.org/w/images/thumb/7/7b/Schermafbeelding_2022-09-28_om_21.02.38.png/300px-Schermafbeelding_2022-09-28_om_21.02.38.png +https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dphotovoltaic,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:generator:method%3Dphotovoltaic,2024-03-02,10,452,107,13,0,https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Mafate_Marla_solar_panel_dsc00633.jpg/200px-Mafate_Marla_solar_panel_dsc00633.jpg +https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dphotovoltaic,en,https://wiki.openstreetmap.org/wiki/Tag:generator:method%3Dphotovoltaic,2025-04-22,12,225,95,14,100,https://upload.wikimedia.org/wikipedia/commons/thumb/4/45/Giant_photovoltaic_array.jpg/200px-Giant_photovoltaic_array.jpg +https://wiki.openstreetmap.org/wiki/FR:Key:distance,fr,https://wiki.openstreetmap.org/wiki/FR:Key:distance,2024-03-28,9,244,68,12,0,https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/M27_DLS.JPG/200px-M27_DLS.JPG +https://wiki.openstreetmap.org/wiki/Key:distance,en,https://wiki.openstreetmap.org/wiki/Key:distance,2024-12-29,14,568,86,12,100,https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/M27_DLS.JPG/200px-M27_DLS.JPG +https://wiki.openstreetmap.org/wiki/FR:Tag_status,fr,https://wiki.openstreetmap.org/wiki/FR:Tag_status,2024-04-02,20,0,0,0,0, +https://wiki.openstreetmap.org/wiki/Tag_status,en,https://wiki.openstreetmap.org/wiki/Tag_status,2025-05-17,25,0,0,0,100, +https://wiki.openstreetmap.org/wiki/FR:Tag:shelter_type%3Dbasic_hut,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:shelter_type%3Dbasic_hut,2024-04-10,17,448,122,23,0,https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/BivaccoBertoglioNebbia.jpg/200px-BivaccoBertoglioNebbia.jpg +https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dbasic_hut,en,https://wiki.openstreetmap.org/wiki/Tag:shelter_type%3Dbasic_hut,2024-11-08,15,441,113,16,100,https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/BivaccoBertoglioNebbia.jpg/200px-BivaccoBertoglioNebbia.jpg +https://wiki.openstreetmap.org/wiki/FR:Tag:highway%3Dmotorway_link,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:highway%3Dmotorway_link,2024-07-02,11,804,139,17,0,https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/M40_Motorway%2C_Heading_North._Junction_13_Slip_Road_For_A452_-_geograph.org.uk_-_1282061.jpg/200px-M40_Motorway%2C_Heading_North._Junction_13_Slip_Road_For_A452_-_geograph.org.uk_-_1282061.jpg +https://wiki.openstreetmap.org/wiki/Tag:highway%3Dmotorway_link,en,https://wiki.openstreetmap.org/wiki/Tag:highway%3Dmotorway_link,2025-04-10,18,1150,194,16,100,https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/M40_Motorway%2C_Heading_North._Junction_13_Slip_Road_For_A452_-_geograph.org.uk_-_1282061.jpg/200px-M40_Motorway%2C_Heading_North._Junction_13_Slip_Road_For_A452_-_geograph.org.uk_-_1282061.jpg +https://wiki.openstreetmap.org/wiki/FR:Relation:enforcement,fr,https://wiki.openstreetmap.org/wiki/FR:Relation:enforcement,2024-07-20,16,1304,128,29,0,https://wiki.openstreetmap.org/w/images/thumb/c/c5/Fixed_speed_camera.svg/200px-Fixed_speed_camera.svg.png +https://wiki.openstreetmap.org/wiki/Relation:enforcement,en,https://wiki.openstreetmap.org/wiki/Relation:enforcement,2025-02-09,33,2032,310,65,100,https://wiki.openstreetmap.org/w/images/thumb/c/c5/Fixed_speed_camera.svg/200px-Fixed_speed_camera.svg.png +https://wiki.openstreetmap.org/wiki/FR:Key:roof:material,fr,https://wiki.openstreetmap.org/wiki/FR:Key:roof:material,2024-08-01,10,597,204,83,0,https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Roof-Tile-3149.jpg/200px-Roof-Tile-3149.jpg +https://wiki.openstreetmap.org/wiki/Key:roof:material,en,https://wiki.openstreetmap.org/wiki/Key:roof:material,2025-06-21,15,1170,379,175,100,https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Roof-Tile-3149.jpg/200px-Roof-Tile-3149.jpg +https://wiki.openstreetmap.org/wiki/FR:Key:fuel,fr,https://wiki.openstreetmap.org/wiki/FR:Key:fuel,2024-10-29,9,711,147,15,0,https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/BBQ-Ulverstone-20070420-031.jpg/200px-BBQ-Ulverstone-20070420-031.jpg +https://wiki.openstreetmap.org/wiki/Key:fuel,en,https://wiki.openstreetmap.org/wiki/Key:fuel,2025-06-05,10,250,95,12,100,https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/BBQ-Ulverstone-20070420-031.jpg/200px-BBQ-Ulverstone-20070420-031.jpg +https://wiki.openstreetmap.org/wiki/FR:Tag:highway%3Dbusway,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:highway%3Dbusway,2024-12-19,13,557,132,18,0,https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Harmoni_Central_Busway_Transjakarta_2.JPG/200px-Harmoni_Central_Busway_Transjakarta_2.JPG +https://wiki.openstreetmap.org/wiki/Tag:highway%3Dbusway,en,https://wiki.openstreetmap.org/wiki/Tag:highway%3Dbusway,2025-09-04,20,1801,257,31,100,https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Harmoni_Central_Busway_Transjakarta_2.JPG/200px-Harmoni_Central_Busway_Transjakarta_2.JPG +https://wiki.openstreetmap.org/wiki/FR:Tag:railway%3Dtram,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:railway%3Dtram,2024-12-21,11,302,87,15,0,https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Praha%2C_Hloub%C4%9Bt%C3%ADn%2C_Lehovec%2C_tram_KT8D5.JPG/200px-Praha%2C_Hloub%C4%9Bt%C3%ADn%2C_Lehovec%2C_tram_KT8D5.JPG +https://wiki.openstreetmap.org/wiki/Tag:railway%3Dtram,en,https://wiki.openstreetmap.org/wiki/Tag:railway%3Dtram,2023-05-24,16,699,181,14,100,https://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Praha%2C_Hloub%C4%9Bt%C3%ADn%2C_Lehovec%2C_tram_KT8D5.JPG/200px-Praha%2C_Hloub%C4%9Bt%C3%ADn%2C_Lehovec%2C_tram_KT8D5.JPG +https://wiki.openstreetmap.org/wiki/FR:Key:building:material,fr,https://wiki.openstreetmap.org/wiki/FR:Key:building:material,2025-01-05,10,336,90,27,0,https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/M%C3%BCnster%2C_LVM_--_2017_--_6351-7.jpg/200px-M%C3%BCnster%2C_LVM_--_2017_--_6351-7.jpg +https://wiki.openstreetmap.org/wiki/Key:building:material,en,https://wiki.openstreetmap.org/wiki/Key:building:material,2025-08-18,15,640,162,68,100,https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/M%C3%BCnster%2C_LVM_--_2017_--_6351-7.jpg/200px-M%C3%BCnster%2C_LVM_--_2017_--_6351-7.jpg +https://wiki.openstreetmap.org/wiki/FR:Android,fr,https://wiki.openstreetmap.org/wiki/FR:Android,2025-05-09,36,6795,781,161,0,https://wiki.openstreetmap.org/w/images/thumb/a/a7/Turn-by-turn-bike-navigation.jpg/112px-Turn-by-turn-bike-navigation.jpg +https://wiki.openstreetmap.org/wiki/Android,en,https://wiki.openstreetmap.org/wiki/Android,2025-06-16,27,1784,257,24,100,https://wiki.openstreetmap.org/w/images/thumb/e/e2/Vespucci_screenshot.png/112px-Vespucci_screenshot.png +https://wiki.openstreetmap.org/wiki/FR:Tag:amenity%3Dloading_dock,fr,https://wiki.openstreetmap.org/wiki/FR:Tag:amenity%3Dloading_dock,2025-08-27,13,425,122,15,0,https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Loading_dock.jpg/200px-Loading_dock.jpg +https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dloading_dock,en,https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dloading_dock,2025-07-27,16,776,164,25,100,https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Loading_dock.jpg/200px-Loading_dock.jpg