commit 2a2a42fe5d08eeb5a76c126db5ba534a488215e6 Author: Edward Betts Date: Fri Feb 27 10:59:27 2026 +0000 Initial commit. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..25c4c71 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,90 @@ +# AGENTS.md + +Guidelines for AI coding agents working in this repository. + +## Project overview + +A collection of Python CLI tools for working with OpenStreetMap data. Each +tool is a standalone Python script using Click for the CLI interface and +Requests for HTTP calls. + +## Repository layout + +``` +osm-pt-geojson - Fetch a public transport route relation, list stops, export GeoJSON +README.md - User-facing documentation +AGENTS.md - This file +``` + +New tools are added as individual scripts at the repo root. + +## Code conventions + +- Python 3, shebang `#!/usr/bin/python3` +- CLI via [Click](https://click.palletsprojects.com/) +- HTTP via [Requests](https://requests.readthedocs.io/) +- Parse XML with lxml if needed; prefer the OSM JSON API where possible +- Scripts have no `.py` extension and are executable +- Errors go to stderr; data output goes to stdout +- GeoJSON output uses `ensure_ascii=False` +- All modules, functions, and test functions must have docstrings + +## OSM API + +Tools fetch data from the public OSM API: + +``` +https://www.openstreetmap.org/api/0.6/ +``` + +No authentication is required for read-only access. Include a descriptive +`User-Agent` header in all requests. + +## Type checking + +All scripts use type hints. Run mypy in strict mode to check: + +``` +mypy --strict osm-pt-geojson +``` + +## Testing + +Run the test suite with: + +``` +pytest tests/ +``` + +Tests use the `responses` library to mock HTTP calls and never hit the live OSM +API. Fixture data is stored in `tests/fixtures/` as saved API responses. + +Because tool scripts have hyphens in their names and no `.py` extension, they +cannot be imported with the normal `importlib.util.spec_from_file_location`. +Use `importlib.machinery.SourceFileLoader` instead: + +```python +import importlib.machinery +import importlib.util + +_loader = importlib.machinery.SourceFileLoader("osm_pt_geojson", "osm-pt-geojson") +_spec = importlib.util.spec_from_loader("osm_pt_geojson", _loader) +assert _spec +osm = importlib.util.module_from_spec(_spec) +_loader.exec_module(osm) +``` + +### Example relations used during development + +| ID | Description | +|----------|------------------------------------------| +| 15083963 | M11 Istanbul Metro (subway) | +| 18892969 | Bus A1: Bristol Airport → Bus Station | + +## Dependencies + +Install with pip: + +``` +pip install click requests +``` diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c87f1a --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# openstreetmap-tools + +A collection of command-line tools for working with OpenStreetMap data. + +## Tools + +### osm-pt-geojson + +Fetch an OSM public transport route relation and list its stops, or export the +route as GeoJSON. + +#### Usage + +``` +osm-pt-geojson list-stations +osm-pt-geojson route-between [-o FILE] +osm-pt-geojson full-route [-o FILE] +``` + +**List stops on a route:** +``` +$ osm-pt-geojson list-stations 18892969 +Route: Bus A1: Bristol Airport → Bristol Bus Station +Stops (21): + 1. Airport Terminal + 2. Airport Tavern + ... + 21. Bus Station +``` + +**Export a segment between two stops as GeoJSON:** +``` +$ osm-pt-geojson route-between 18892969 "Airport Terminal" "East Street" -o segment.geojson +``` + +**Export the full route as GeoJSON:** +``` +$ osm-pt-geojson full-route 18892969 -o route.geojson +``` + +**Omit stop points from GeoJSON output:** +``` +$ osm-pt-geojson full-route 18892969 --no-stops -o route.geojson +``` + +GeoJSON is written to stdout if `-o` is not given. + +#### Output format + +A GeoJSON `FeatureCollection` containing: + +- A `LineString` feature for the route geometry, with `name`, `ref`, `from`, + `to`, and `route` properties from the OSM relation tags. +- A `Point` feature for each stop, with a `name` property (omitted with + `--no-stops`). + +#### Requirements + +- Python 3 +- [Click](https://click.palletsprojects.com/) +- [Requests](https://requests.readthedocs.io/) + +Install dependencies: +``` +pip install click requests +``` + +## Licence + +MIT License. Copyright (c) 2026 Edward Betts. diff --git a/osm-pt-geojson b/osm-pt-geojson new file mode 100755 index 0000000..a58a11b --- /dev/null +++ b/osm-pt-geojson @@ -0,0 +1,274 @@ +#!/usr/bin/python3 +"""Fetch an OSM public transport route relation and export it as GeoJSON.""" +import json +import sys +from typing import Any + +import click +import requests + +OSM_API = "https://www.openstreetmap.org/api/0.6" + +# Type aliases +Coord = list[float] # [lon, lat] +OsmTags = dict[str, str] +OsmElement = dict[str, Any] +GeoJson = dict[str, Any] + + +def fetch_relation_full(relation_id: int) -> dict[str, Any]: + """Fetch the full OSM API response for a relation, including all member ways and nodes.""" + url = f"{OSM_API}/relation/{relation_id}/full.json" + try: + resp = requests.get(url, headers={"User-Agent": "osm-pt-geojson/1.0"}, timeout=30) + except requests.RequestException as e: + click.echo(f"Error: {e}", err=True) + sys.exit(1) + if resp.status_code != 200: + click.echo(f"Error: HTTP {resp.status_code} fetching relation {relation_id}", err=True) + sys.exit(1) + result: dict[str, Any] = resp.json() + return result + + +def parse_elements( + data: dict[str, Any], + relation_id: int, +) -> tuple[dict[int, OsmElement], dict[int, OsmElement], list[int], list[int], OsmTags]: + """Index nodes and ways; extract ordered stops and way IDs from the target relation.""" + nodes: dict[int, OsmElement] = {} + ways: dict[int, OsmElement] = {} + relation: OsmElement | None = None + + for elem in data["elements"]: + t = elem["type"] + if t == "node": + nodes[elem["id"]] = elem + elif t == "way": + ways[elem["id"]] = elem + elif t == "relation" and elem["id"] == relation_id: + relation = elem + + if relation is None: + click.echo(f"Error: relation {relation_id} not found in API response", err=True) + sys.exit(1) + + stop_ids: list[int] = [] + way_ids: list[int] = [] + + for member in relation["members"]: + if member["role"] in ("stop", "stop_entry_only", "stop_exit_only") and member["type"] == "node": + stop_ids.append(member["ref"]) + elif member["role"] == "" and member["type"] == "way": + way_ids.append(member["ref"]) + + tags: OsmTags = relation.get("tags", {}) + return nodes, ways, stop_ids, way_ids, tags + + +def build_route_coords( + way_ids: list[int], + ways: dict[int, OsmElement], + nodes: dict[int, OsmElement], +) -> list[Coord]: + """Chain ways into a single ordered list of [lon, lat] coordinates.""" + if not way_ids: + return [] + + def way_node_ids(way_id: int) -> list[int]: + return ways[way_id]["nodes"] if way_id in ways else [] + + chain: list[int] = list(way_node_ids(way_ids[0])) + + for way_id in way_ids[1:]: + wn = way_node_ids(way_id) + if not wn: + continue + if chain[-1] == wn[0]: + chain.extend(wn[1:]) + elif chain[-1] == wn[-1]: + chain.extend(reversed(wn[:-1])) + elif chain[0] == wn[-1]: + chain = list(wn) + chain[1:] + elif chain[0] == wn[0]: + chain = list(reversed(wn)) + chain[1:] + else: + click.echo(f"Warning: gap before way {way_id}", err=True) + chain.extend(wn) + + return [[nodes[nid]["lon"], nodes[nid]["lat"]] for nid in chain if nid in nodes] + + +def nearest_coord_index(lon: float, lat: float, route_coords: list[Coord]) -> int: + """Return the index in route_coords nearest to (lon, lat).""" + best_i = 0 + best_d = float("inf") + for i, (rlon, rlat) in enumerate(route_coords): + d = (rlon - lon) ** 2 + (rlat - lat) ** 2 + if d < best_d: + best_d = d + best_i = i + return best_i + + +def node_name(node: OsmElement) -> str: + """Return a human-readable name for a node: name tag, ref tag, or node ID.""" + tags: OsmTags = node.get("tags", {}) + return tags.get("name") or tags.get("ref") or str(node["id"]) + + +def make_geojson( + route_coords: list[Coord], + stop_ids: list[int], + nodes: dict[int, OsmElement], + route_tags: OsmTags, + idx_from: int | None = None, + idx_to: int | None = None, + no_stops: bool = False, +) -> GeoJson: + """Build a GeoJSON FeatureCollection, optionally sliced between two coord indices.""" + features: list[GeoJson] = [] + + # Map stops to their nearest position on the route + stop_positions: list[tuple[int, OsmElement]] = [] + for sid in stop_ids: + if sid not in nodes: + continue + n = nodes[sid] + idx = nearest_coord_index(n["lon"], n["lat"], route_coords) + stop_positions.append((idx, n)) + + # Apply slice + if idx_from is not None and idx_to is not None: + if idx_from > idx_to: + idx_from, idx_to = idx_to, idx_from + geom_coords = route_coords[idx_from : idx_to + 1] + stops_in_range = [(i, n) for i, n in stop_positions if idx_from <= i <= idx_to] + else: + geom_coords = route_coords + stops_in_range = stop_positions + + features.append( + { + "type": "Feature", + "geometry": {"type": "LineString", "coordinates": geom_coords}, + "properties": { + "name": route_tags.get("name"), + "ref": route_tags.get("ref"), + "from": route_tags.get("from"), + "to": route_tags.get("to"), + "route": route_tags.get("route"), + }, + } + ) + + if not no_stops: + for _, node in stops_in_range: + features.append( + { + "type": "Feature", + "geometry": {"type": "Point", "coordinates": [node["lon"], node["lat"]]}, + "properties": {"name": node_name(node)}, + } + ) + + return {"type": "FeatureCollection", "features": features} + + +def output_geojson(geojson: GeoJson, output_path: str | None) -> None: + """Write GeoJSON to a file, or to stdout if output_path is None.""" + text = json.dumps(geojson, ensure_ascii=False, indent=2) + if output_path: + with open(output_path, "w", encoding="utf-8") as f: + f.write(text) + click.echo(f"Wrote {output_path}", err=True) + else: + click.echo(text) + + +@click.group() +def cli() -> None: + """OSM public transport route → GeoJSON tool.""" + + +@cli.command("list-stations") +@click.argument("relation_id", type=int) +def list_stations(relation_id: int) -> None: + """List all stations in an OSM public transport route relation.""" + data = fetch_relation_full(relation_id) + nodes, ways, stop_ids, way_ids, tags = parse_elements(data, relation_id) + click.echo(f"Route: {tags.get('name', relation_id)}") + click.echo(f"Stops ({len(stop_ids)}):") + for i, sid in enumerate(stop_ids, 1): + if sid in nodes: + click.echo(f" {i:2}. {node_name(nodes[sid])}") + else: + click.echo(f" {i:2}. (node {sid} not in response)") + + +@cli.command("route-between") +@click.argument("relation_id", type=int) +@click.argument("from_station") +@click.argument("to_station") +@click.option("--output", "-o", type=click.Path(), default=None, help="Output file (default: stdout)") +@click.option("--no-stops", is_flag=True, default=False, help="Omit stop points from output.") +def route_between( + relation_id: int, + from_station: str, + to_station: str, + output: str | None, + no_stops: bool, +) -> None: + """Output GeoJSON for the route segment between two named stations.""" + data = fetch_relation_full(relation_id) + nodes, ways, stop_ids, way_ids, tags = parse_elements(data, relation_id) + route_coords = build_route_coords(way_ids, ways, nodes) + + def find_stop(name: str) -> int | None: + for sid in stop_ids: + if sid in nodes and node_name(nodes[sid]).lower() == name.lower(): + return sid + return None + + sid_from = find_stop(from_station) + sid_to = find_stop(to_station) + + errors = [] + if sid_from is None: + errors.append(f"Station not found: {from_station!r}") + if sid_to is None: + errors.append(f"Station not found: {to_station!r}") + if errors: + for e in errors: + click.echo(f"Error: {e}", err=True) + click.echo("Available stations:", err=True) + for sid in stop_ids: + if sid in nodes: + click.echo(f" {node_name(nodes[sid])}", err=True) + sys.exit(1) + + assert sid_from is not None and sid_to is not None + idx_from = nearest_coord_index(nodes[sid_from]["lon"], nodes[sid_from]["lat"], route_coords) + idx_to = nearest_coord_index(nodes[sid_to]["lon"], nodes[sid_to]["lat"], route_coords) + + geojson = make_geojson( + route_coords, stop_ids, nodes, tags, idx_from=idx_from, idx_to=idx_to, no_stops=no_stops + ) + output_geojson(geojson, output) + + +@cli.command("full-route") +@click.argument("relation_id", type=int) +@click.option("--output", "-o", type=click.Path(), default=None, help="Output file (default: stdout)") +@click.option("--no-stops", is_flag=True, default=False, help="Omit stop points from output.") +def full_route(relation_id: int, output: str | None, no_stops: bool) -> None: + """Output GeoJSON for the entire route, end to end.""" + data = fetch_relation_full(relation_id) + nodes, ways, stop_ids, way_ids, tags = parse_elements(data, relation_id) + route_coords = build_route_coords(way_ids, ways, nodes) + geojson = make_geojson(route_coords, stop_ids, nodes, tags, no_stops=no_stops) + output_geojson(geojson, output) + + +if __name__ == "__main__": + cli() diff --git a/tests/fixtures/15083963-full.json b/tests/fixtures/15083963-full.json new file mode 100644 index 0000000..7471e60 --- /dev/null +++ b/tests/fixtures/15083963-full.json @@ -0,0 +1,4877 @@ +{ + "version": "0.6", + "generator": "openstreetmap-cgimap 2.1.0 (2515326 spike-06.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [ + { + "type": "node", + "id": 6841250072, + "lat": 41.0884984, + "lon": 28.9613633, + "timestamp": "2021-01-03T17:17:25Z", + "version": 3, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055800, + "lat": 41.0703442, + "lon": 29.0052932, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055802, + "lat": 41.0718014, + "lon": 29.0029201, + "timestamp": "2022-10-30T17:33:24Z", + "version": 2, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055803, + "lat": 41.072536, + "lon": 29.0010513, + "timestamp": "2022-10-30T17:33:24Z", + "version": 2, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055804, + "lat": 41.0730783, + "lon": 28.9993189, + "timestamp": "2022-10-30T17:33:24Z", + "version": 2, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055805, + "lat": 41.0734661, + "lon": 28.9978908, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055806, + "lat": 41.0739082, + "lon": 28.995603, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055807, + "lat": 41.0743616, + "lon": 28.9898237, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055808, + "lat": 41.0751222, + "lon": 28.9867622, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055809, + "lat": 41.0759315, + "lon": 28.984844, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055810, + "lat": 41.0767763, + "lon": 28.9828731, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055821, + "lat": 41.1299411, + "lon": 28.9438342, + "timestamp": "2022-12-17T09:26:21Z", + "version": 4, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055822, + "lat": 41.1290932, + "lon": 28.944773, + "timestamp": "2022-12-17T09:26:21Z", + "version": 4, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055823, + "lat": 41.128509, + "lon": 28.9449844, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055824, + "lat": 41.0909482, + "lon": 28.9572808, + "timestamp": "2021-01-03T17:17:25Z", + "version": 2, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055825, + "lat": 41.0921711, + "lon": 28.9562752, + "timestamp": "2021-01-03T17:17:25Z", + "version": 2, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055826, + "lat": 41.094129, + "lon": 28.9555181, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055827, + "lat": 41.0965783, + "lon": 28.9548339, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055828, + "lat": 41.0995446, + "lon": 28.9536327, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055829, + "lat": 41.1030851, + "lon": 28.9528956, + "timestamp": "2021-01-03T17:17:25Z", + "version": 2, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055830, + "lat": 41.1069573, + "lon": 28.9513569, + "timestamp": "2021-01-03T17:17:25Z", + "version": 2, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055831, + "lat": 41.1129709, + "lon": 28.94824, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 7246055832, + "lat": 41.1200546, + "lon": 28.9469951, + "timestamp": "2020-02-26T20:08:42Z", + "version": 1, + "changeset": 81519826, + "user": "Santi2222", + "uid": 493192 + }, + { + "type": "node", + "id": 7246055833, + "lat": 41.1222125, + "lon": 28.9465231, + "timestamp": "2020-02-26T20:08:42Z", + "version": 1, + "changeset": 81519826, + "user": "Santi2222", + "uid": 493192 + }, + { + "type": "node", + "id": 7246055835, + "lat": 41.0897092, + "lon": 28.959209, + "timestamp": "2021-01-03T17:17:25Z", + "version": 2, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889947, + "lat": 41.0673927, + "lon": 29.0093904, + "timestamp": "2021-07-30T13:44:00Z", + "version": 2, + "changeset": 108894623, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889949, + "lat": 41.0690572, + "lon": 29.0068732, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889953, + "lat": 41.0714773, + "lon": 29.0036777, + "timestamp": "2022-10-30T17:33:24Z", + "version": 2, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889954, + "lat": 41.0741279, + "lon": 28.9929231, + "timestamp": "2022-10-30T17:33:24Z", + "version": 2, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889956, + "lat": 41.0736996, + "lon": 28.9968905, + "timestamp": "2022-10-30T17:33:24Z", + "version": 3, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889958, + "lat": 41.0746932, + "lon": 28.9880021, + "timestamp": "2022-10-30T17:33:24Z", + "version": 2, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889963, + "lat": 41.0827575, + "lon": 28.9716711, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889964, + "lat": 41.0816282, + "lon": 28.973648, + "timestamp": "2021-06-21T14:57:50Z", + "version": 2, + "changeset": 106723016, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889966, + "lat": 41.08534, + "lon": 28.9667195, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889967, + "lat": 41.1255711, + "lon": 28.9457102, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8286889968, + "lat": 41.129537, + "lon": 28.9444006, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889969, + "lat": 41.1311819, + "lon": 28.9411731, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889970, + "lat": 41.1329421, + "lon": 28.9371228, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889971, + "lat": 41.1353885, + "lon": 28.9319898, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889972, + "lat": 41.137247, + "lon": 28.9281918, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889973, + "lat": 41.1390569, + "lon": 28.9260047, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889974, + "lat": 41.1414809, + "lon": 28.9250806, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889975, + "lat": 41.1439353, + "lon": 28.924426, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889976, + "lat": 41.1464686, + "lon": 28.9233853, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889977, + "lat": 41.1487396, + "lon": 28.9207491, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889978, + "lat": 41.1503321, + "lon": 28.9178994, + "timestamp": "2021-01-19T17:59:35Z", + "version": 2, + "changeset": 97785532, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889979, + "lat": 41.1522184, + "lon": 28.9141668, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889980, + "lat": 41.1529141, + "lon": 28.9127103, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889981, + "lat": 41.1538671, + "lon": 28.9115715, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889982, + "lat": 41.1574273, + "lon": 28.9104969, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889983, + "lat": 41.1617741, + "lon": 28.9094807, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889984, + "lat": 41.1635301, + "lon": 28.9084983, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889985, + "lat": 41.1644269, + "lon": 28.9071587, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889986, + "lat": 41.165155, + "lon": 28.9048586, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889987, + "lat": 41.1661357, + "lon": 28.9015199, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889988, + "lat": 41.1690813, + "lon": 28.8934812, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889989, + "lat": 41.1704235, + "lon": 28.8911446, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889990, + "lat": 41.1732761, + "lon": 28.8875897, + "timestamp": "2021-06-21T15:14:10Z", + "version": 2, + "changeset": 106723777, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889991, + "lat": 41.1800026, + "lon": 28.8802033, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889992, + "lat": 41.1841604, + "lon": 28.8759853, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889993, + "lat": 41.1895671, + "lon": 28.8713849, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889994, + "lat": 41.1957184, + "lon": 28.8692821, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889995, + "lat": 41.1978442, + "lon": 28.8674111, + "timestamp": "2021-01-19T17:59:35Z", + "version": 2, + "changeset": 97785532, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889996, + "lat": 41.1995992, + "lon": 28.8645548, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889997, + "lat": 41.201829, + "lon": 28.8596799, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889998, + "lat": 41.2044407, + "lon": 28.8551313, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286889999, + "lat": 41.2065944, + "lon": 28.850858, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890000, + "lat": 41.2089928, + "lon": 28.8453222, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890001, + "lat": 41.2116897, + "lon": 28.8423734, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890002, + "lat": 41.216223, + "lon": 28.840249, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890003, + "lat": 41.2237931, + "lon": 28.8355701, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890004, + "lat": 41.2261676, + "lon": 28.8332342, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890005, + "lat": 41.230583, + "lon": 28.8292239, + "timestamp": "2021-01-19T17:59:35Z", + "version": 2, + "changeset": 97785532, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890006, + "lat": 41.2326056, + "lon": 28.8263966, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890007, + "lat": 41.2344613, + "lon": 28.8215686, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890008, + "lat": 41.2364703, + "lon": 28.8174103, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890009, + "lat": 41.2380919, + "lon": 28.815024, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890010, + "lat": 41.2422709, + "lon": 28.8095738, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890011, + "lat": 41.2465303, + "lon": 28.8010765, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890012, + "lat": 41.2503377, + "lon": 28.7888242, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890013, + "lat": 41.2518581, + "lon": 28.7865665, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890014, + "lat": 41.2554516, + "lon": 28.780048, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890015, + "lat": 41.2562098, + "lon": 28.7762285, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286890016, + "lat": 41.2563617, + "lon": 28.7723935, + "timestamp": "2021-06-28T14:14:16Z", + "version": 2, + "changeset": 107092957, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892117, + "lat": 41.256242, + "lon": 28.7545563, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892118, + "lat": 41.2557761, + "lon": 28.7352492, + "timestamp": "2021-06-28T14:37:37Z", + "version": 2, + "changeset": 107094186, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892119, + "lat": 41.2553652, + "lon": 28.7148194, + "timestamp": "2021-06-28T14:37:37Z", + "version": 3, + "changeset": 107094186, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892121, + "lat": 41.2558695, + "lon": 28.7438574, + "timestamp": "2021-06-28T14:37:37Z", + "version": 2, + "changeset": 107094186, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892122, + "lat": 41.2559597, + "lon": 28.7783314, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892123, + "lat": 41.2537255, + "lon": 28.784082, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892124, + "lat": 41.2482162, + "lon": 28.7935234, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892125, + "lat": 41.2449555, + "lon": 28.8061929, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892126, + "lat": 41.2458204, + "lon": 28.8042254, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892127, + "lat": 41.2470829, + "lon": 28.7981501, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892128, + "lat": 41.2545401, + "lon": 28.7824298, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892129, + "lat": 41.2527193, + "lon": 28.7855083, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892130, + "lat": 41.2509034, + "lon": 28.7878748, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892131, + "lat": 41.2491641, + "lon": 28.7911738, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892132, + "lat": 41.2475205, + "lon": 28.7960942, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892133, + "lat": 41.2353605, + "lon": 28.8195452, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892134, + "lat": 41.231537, + "lon": 28.8283134, + "timestamp": "2021-01-19T17:59:35Z", + "version": 2, + "changeset": 97785532, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892135, + "lat": 41.2141286, + "lon": 28.8411838, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892136, + "lat": 41.2077036, + "lon": 28.8480963, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892137, + "lat": 41.1967983, + "lon": 28.8685963, + "timestamp": "2021-01-19T17:59:35Z", + "version": 2, + "changeset": 97785532, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892138, + "lat": 41.1866069, + "lon": 28.8735713, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892139, + "lat": 41.1720556, + "lon": 28.889053, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892140, + "lat": 41.153171, + "lon": 28.9122502, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892141, + "lat": 41.1475937, + "lon": 28.9223215, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892142, + "lat": 41.144958, + "lon": 28.9241332, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892143, + "lat": 41.1380065, + "lon": 28.9270545, + "timestamp": "2021-01-03T17:17:25Z", + "version": 1, + "changeset": 96856730, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8286892144, + "lat": 41.1306461, + "lon": 28.942399, + "timestamp": "2022-12-17T09:26:21Z", + "version": 3, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428762, + "lat": 41.1629333, + "lon": 28.9089698, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428764, + "lat": 41.1641632, + "lon": 28.9076819, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428780, + "lat": 41.1918099, + "lon": 28.8706013, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428788, + "lat": 41.19439, + "lon": 28.8698097, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428793, + "lat": 41.19733, + "lon": 28.868088, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428800, + "lat": 41.2010556, + "lon": 28.8611137, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428823, + "lat": 41.2196641, + "lon": 28.8383083, + "timestamp": "2021-01-19T17:59:35Z", + "version": 1, + "changeset": 97785532, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428824, + "lat": 41.2215554, + "lon": 28.837203, + "timestamp": "2021-01-19T17:59:35Z", + "version": 1, + "changeset": 97785532, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8339428839, + "lat": 41.2320833, + "lon": 28.8275706, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474965997, + "lat": 41.255266, + "lon": 28.7100254, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474965998, + "lat": 41.2551303, + "lon": 28.7090905, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474965999, + "lat": 41.2548934, + "lon": 28.708154, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966000, + "lat": 41.2542353, + "lon": 28.7067129, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966001, + "lat": 41.2532558, + "lon": 28.7052141, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966002, + "lat": 41.2522699, + "lon": 28.7042434, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966003, + "lat": 41.2507206, + "lon": 28.7030171, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966004, + "lat": 41.2502219, + "lon": 28.7027363, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966005, + "lat": 41.2486064, + "lon": 28.7022335, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966010, + "lat": 41.2474021, + "lon": 28.7019952, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8474966011, + "lat": 41.2465193, + "lon": 28.7019817, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8474966012, + "lat": 41.2456046, + "lon": 28.7020488, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8474966013, + "lat": 41.2440984, + "lon": 28.7024664, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8474966014, + "lat": 41.2422861, + "lon": 28.7031675, + "timestamp": "2023-10-12T10:12:03Z", + "version": 3, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8474966015, + "lat": 41.2408426, + "lon": 28.7037102, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8474966016, + "lat": 41.2389273, + "lon": 28.7043591, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8474966017, + "lat": 41.2367762, + "lon": 28.7048414, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966018, + "lat": 41.2345524, + "lon": 28.7049026, + "timestamp": "2021-11-01T21:28:55Z", + "version": 2, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 8474966019, + "lat": 41.233273, + "lon": 28.7047357, + "timestamp": "2021-11-01T21:28:55Z", + "version": 2, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 8474966020, + "lat": 41.2308906, + "lon": 28.7042667, + "timestamp": "2021-11-01T21:28:55Z", + "version": 3, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 8474966021, + "lat": 41.2288057, + "lon": 28.7036134, + "timestamp": "2021-11-01T21:28:55Z", + "version": 4, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 8474966022, + "lat": 41.2265951, + "lon": 28.7031938, + "timestamp": "2021-11-01T21:28:55Z", + "version": 3, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 8474966023, + "lat": 41.2226356, + "lon": 28.7036432, + "timestamp": "2021-11-01T21:28:55Z", + "version": 2, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 8474966024, + "lat": 41.2213354, + "lon": 28.7037174, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966025, + "lat": 41.2199326, + "lon": 28.7039984, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966026, + "lat": 41.2189078, + "lon": 28.7044497, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966027, + "lat": 41.218268, + "lon": 28.7050948, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966028, + "lat": 41.2175178, + "lon": 28.7062124, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966029, + "lat": 41.2153079, + "lon": 28.7106149, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966031, + "lat": 41.2148196, + "lon": 28.7115677, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966032, + "lat": 41.2143551, + "lon": 28.7123433, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966033, + "lat": 41.2135591, + "lon": 28.7134165, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966034, + "lat": 41.2128289, + "lon": 28.7141914, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966035, + "lat": 41.2118039, + "lon": 28.7148897, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966036, + "lat": 41.2110672, + "lon": 28.7151962, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966037, + "lat": 41.2101127, + "lon": 28.7154517, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966038, + "lat": 41.2045519, + "lon": 28.7166524, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966043, + "lat": 41.2030845, + "lon": 28.7169738, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966044, + "lat": 41.2006375, + "lon": 28.7174942, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966045, + "lat": 41.1986186, + "lon": 28.7180064, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966046, + "lat": 41.1975673, + "lon": 28.7183709, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966047, + "lat": 41.1967867, + "lon": 28.7190711, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966048, + "lat": 41.1961407, + "lon": 28.7200067, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966049, + "lat": 41.1947726, + "lon": 28.7224799, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966051, + "lat": 41.1921393, + "lon": 28.7276416, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966052, + "lat": 41.1910138, + "lon": 28.7301077, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966053, + "lat": 41.18979, + "lon": 28.7327906, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966054, + "lat": 41.1878819, + "lon": 28.7365483, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966055, + "lat": 41.1871283, + "lon": 28.7378691, + "timestamp": "2021-07-11T14:08:47Z", + "version": 2, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966056, + "lat": 41.1855549, + "lon": 28.7402489, + "timestamp": "2021-07-11T14:08:47Z", + "version": 3, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966057, + "lat": 41.183936, + "lon": 28.7426427, + "timestamp": "2021-06-25T12:35:17Z", + "version": 2, + "changeset": 106962544, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966058, + "lat": 41.1863845, + "lon": 28.7389883, + "timestamp": "2021-03-01T09:14:27Z", + "version": 1, + "changeset": 100189509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966059, + "lat": 41.1827644, + "lon": 28.7444904, + "timestamp": "2021-06-25T12:35:17Z", + "version": 2, + "changeset": 106962544, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966060, + "lat": 41.1810297, + "lon": 28.7467389, + "timestamp": "2021-07-11T14:08:47Z", + "version": 3, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474966061, + "lat": 41.1799601, + "lon": 28.7474752, + "timestamp": "2021-06-28T14:02:42Z", + "version": 3, + "changeset": 107092385, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8474999417, + "lat": 41.2241643, + "lon": 28.7034297, + "timestamp": "2023-01-15T12:29:39Z", + "version": 4, + "changeset": 131296088, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8474999427, + "lat": 41.2163662, + "lon": 28.708502, + "timestamp": "2023-01-15T12:29:39Z", + "version": 3, + "changeset": 131296088, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8853285392, + "lat": 41.0808929, + "lon": 28.9748285, + "timestamp": "2021-06-21T14:57:50Z", + "version": 1, + "changeset": 106723016, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8853285395, + "lat": 41.0820134, + "lon": 28.9729737, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8853285398, + "lat": 41.0822938, + "lon": 28.9724668, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8853285400, + "lat": 41.0832056, + "lon": 28.9707338, + "timestamp": "2021-06-21T14:57:50Z", + "version": 1, + "changeset": 106723016, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8853285994, + "lat": 41.124182, + "lon": 28.9460464, + "timestamp": "2022-12-17T09:26:21Z", + "version": 2, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8853364228, + "lat": 41.1580302, + "lon": 28.9103509, + "timestamp": "2021-06-21T15:08:48Z", + "version": 1, + "changeset": 106723509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8853364229, + "lat": 41.1600911, + "lon": 28.9098826, + "timestamp": "2021-06-21T15:08:48Z", + "version": 1, + "changeset": 106723509, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8853526423, + "lat": 41.1761738, + "lon": 28.884389, + "timestamp": "2023-01-15T11:43:34Z", + "version": 2, + "changeset": 131294571, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8853526426, + "lat": 41.1734052, + "lon": 28.8874473, + "timestamp": "2023-01-15T11:43:34Z", + "version": 2, + "changeset": 131294571, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8865833278, + "lat": 41.1818887, + "lon": 28.7457122, + "timestamp": "2021-06-25T12:35:17Z", + "version": 1, + "changeset": 106962544, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8865833281, + "lat": 41.1814642, + "lon": 28.7462878, + "timestamp": "2021-06-25T12:35:17Z", + "version": 1, + "changeset": 106962544, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8865833282, + "lat": 41.1804728, + "lon": 28.747174, + "timestamp": "2021-06-25T12:35:17Z", + "version": 1, + "changeset": 106962544, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8872476308, + "lat": 41.2082282, + "lon": 28.7158341, + "timestamp": "2021-06-28T14:08:10Z", + "version": 1, + "changeset": 107092662, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8872476309, + "lat": 41.2063569, + "lon": 28.7162521, + "timestamp": "2021-06-28T14:08:10Z", + "version": 1, + "changeset": 107092662, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8872542407, + "lat": 41.2558294, + "lon": 28.7413321, + "timestamp": "2021-06-28T14:37:37Z", + "version": 1, + "changeset": 107094186, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8872578522, + "lat": 41.2553519, + "lon": 28.7142727, + "timestamp": "2021-06-28T14:37:37Z", + "version": 1, + "changeset": 107094186, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8872578530, + "lat": 41.2556221, + "lon": 28.724506, + "timestamp": "2023-01-14T13:25:58Z", + "version": 2, + "changeset": 131264917, + "user": "Claudius Henrichs", + "uid": 18069, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8872578531, + "lat": 41.2555565, + "lon": 28.7221161, + "timestamp": "2023-01-14T13:25:58Z", + "version": 2, + "changeset": 131264917, + "user": "Claudius Henrichs", + "uid": 18069, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8872578532, + "lat": 41.2554611, + "lon": 28.7194547, + "timestamp": "2021-06-28T14:37:37Z", + "version": 1, + "changeset": 107094186, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8872578533, + "lat": 41.2556222, + "lon": 28.7266306, + "timestamp": "2021-06-28T14:37:37Z", + "version": 1, + "changeset": 107094186, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8872578536, + "lat": 41.2560112, + "lon": 28.7479263, + "timestamp": "2023-01-15T11:43:34Z", + "version": 2, + "changeset": 131294571, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8872578538, + "lat": 41.2559275, + "lon": 28.7455242, + "timestamp": "2023-01-15T11:43:34Z", + "version": 2, + "changeset": 131294571, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8872578541, + "lat": 41.2563595, + "lon": 28.7720658, + "timestamp": "2022-11-07T23:53:42Z", + "version": 2, + "changeset": 128617747, + "user": "Claudius Henrichs", + "uid": 18069, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8872578543, + "lat": 41.2563432, + "lon": 28.7696405, + "timestamp": "2022-11-07T23:53:42Z", + "version": 2, + "changeset": 128617747, + "user": "Claudius Henrichs", + "uid": 18069, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8911584156, + "lat": 41.1807375, + "lon": 28.7469829, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584157, + "lat": 41.1874923, + "lon": 28.7372599, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584159, + "lat": 41.1937183, + "lon": 28.7244032, + "timestamp": "2025-02-17T20:42:39Z", + "version": 2, + "changeset": 162634392, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8911584161, + "lat": 41.1931789, + "lon": 28.7254643, + "timestamp": "2025-02-17T20:42:39Z", + "version": 2, + "changeset": 162634392, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8911584164, + "lat": 41.1954859, + "lon": 28.7211343, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584165, + "lat": 41.1958192, + "lon": 28.7205238, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584166, + "lat": 41.1964461, + "lon": 28.7195545, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584167, + "lat": 41.1971594, + "lon": 28.718651, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584168, + "lat": 41.1981047, + "lon": 28.7181575, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584178, + "lat": 41.2150784, + "lon": 28.7110718, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584179, + "lat": 41.2139454, + "lon": 28.7129032, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584180, + "lat": 41.213153, + "lon": 28.7138818, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584181, + "lat": 41.2123105, + "lon": 28.7145872, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584186, + "lat": 41.2160366, + "lon": 28.7091666, + "timestamp": "2023-01-15T12:29:39Z", + "version": 2, + "changeset": 131296088, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8911584187, + "lat": 41.2145874, + "lon": 28.7119555, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584193, + "lat": 41.2219387, + "lon": 28.7036948, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584194, + "lat": 41.2205696, + "lon": 28.7038423, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584195, + "lat": 41.2193207, + "lon": 28.7042007, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584196, + "lat": 41.2185557, + "lon": 28.7047567, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584197, + "lat": 41.2178519, + "lon": 28.7056847, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584198, + "lat": 41.2169186, + "lon": 28.7073806, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584199, + "lat": 41.2246874, + "lon": 28.70331, + "timestamp": "2023-01-15T12:29:39Z", + "version": 3, + "changeset": 131296088, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 8911584204, + "lat": 41.2277869, + "lon": 28.703379, + "timestamp": "2021-11-01T21:28:55Z", + "version": 2, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 8911584205, + "lat": 41.2320404, + "lon": 28.7045119, + "timestamp": "2021-11-01T21:28:55Z", + "version": 2, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 8911584206, + "lat": 41.2358007, + "lon": 28.7049562, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584207, + "lat": 41.2378571, + "lon": 28.7045981, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8911584208, + "lat": 41.2398706, + "lon": 28.7040569, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8911584209, + "lat": 41.2448386, + "lon": 28.7022296, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 8911584210, + "lat": 41.2493524, + "lon": 28.702413, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584213, + "lat": 41.2497833, + "lon": 28.7025593, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584214, + "lat": 41.2537533, + "lon": 28.7058916, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584215, + "lat": 41.2545682, + "lon": 28.7074027, + "timestamp": "2021-07-11T14:08:47Z", + "version": 1, + "changeset": 107784272, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 8911584223, + "lat": 41.2479867, + "lon": 28.7020882, + "timestamp": "2023-10-12T10:12:03Z", + "version": 2, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 9051609050, + "lat": 41.0678495, + "lon": 29.0086636, + "timestamp": "2022-10-30T17:33:24Z", + "version": 2, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 9051609051, + "lat": 41.0683509, + "lon": 29.0079059, + "timestamp": "2022-10-30T17:33:24Z", + "version": 2, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 9217106876, + "lat": 41.2256749, + "lon": 28.7031448, + "timestamp": "2021-11-01T21:28:55Z", + "version": 1, + "changeset": 113256041, + "user": "Jekader", + "uid": 48157 + }, + { + "type": "node", + "id": 9846916426, + "lat": 41.2275631, + "lon": 28.8319378, + "timestamp": "2022-06-25T19:55:36Z", + "version": 1, + "changeset": 122848527, + "user": "Toygar Alak", + "uid": 5703312 + }, + { + "type": "node", + "id": 9935365536, + "lat": 41.2402226, + "lon": 28.812389, + "timestamp": "2023-01-15T11:43:34Z", + "version": 3, + "changeset": 131294571, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 10140418034, + "lat": 41.0696923, + "lon": 29.0060978, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418035, + "lat": 41.0708877, + "lon": 29.0045764, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418042, + "lat": 41.0781637, + "lon": 28.9800715, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418043, + "lat": 41.0774547, + "lon": 28.9814357, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418046, + "lat": 41.0771247, + "lon": 28.9821015, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418047, + "lat": 41.0744998, + "lon": 28.9888723, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418050, + "lat": 41.0742447, + "lon": 28.9913002, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418052, + "lat": 41.0711641, + "lon": 29.0041799, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418053, + "lat": 41.0721595, + "lon": 29.0019776, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418054, + "lat": 41.0728133, + "lon": 29.000242, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10140418055, + "lat": 41.073295, + "lon": 28.9985209, + "timestamp": "2022-10-30T17:33:24Z", + "version": 1, + "changeset": 128256803, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10167775297, + "lat": 41.2553423, + "lon": 28.712731, + "timestamp": "2022-11-12T13:55:15Z", + "version": 2, + "changeset": 128813708, + "user": "Alikam", + "uid": 3997418, + "tags": { + "name": "Kargo Terminali", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 10167775299, + "lat": 41.2558497, + "lon": 28.7426107, + "timestamp": "2024-02-12T20:17:16Z", + "version": 4, + "changeset": 147383488, + "user": "iliyad", + "uid": 10891840, + "tags": { + "name": "\u0130stanbul Havaliman\u0131", + "name:it": "Aeroporto di Istanbul", + "name:tk": "Stambul Gonalgasy", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 10167775301, + "lat": 41.2563349, + "lon": 28.7683989, + "timestamp": "2025-11-08T19:28:00Z", + "version": 4, + "changeset": 174391478, + "user": "user_23424783", + "uid": 23424783, + "tags": { + "name": "Terminal 2", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 10167775303, + "lat": 41.2428674, + "lon": 28.8088492, + "timestamp": "2022-11-12T13:35:08Z", + "version": 2, + "changeset": 128813026, + "user": "Alikam", + "uid": 3997418, + "tags": { + "name": "\u0130hsaniye", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 10167775305, + "lat": 41.1590973, + "lon": 28.9101084, + "timestamp": "2022-11-27T09:45:35Z", + "version": 2, + "changeset": 129427625, + "user": "Alikam", + "uid": 3997418, + "tags": { + "name": "Kemerburgaz", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 10167775307, + "lat": 41.1212278, + "lon": 28.9467385, + "timestamp": "2022-11-12T13:35:08Z", + "version": 2, + "changeset": 128813026, + "user": "Alikam", + "uid": 3997418, + "tags": { + "name": "Hasdal", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 10167775309, + "lat": 41.1768557, + "lon": 28.8836397, + "timestamp": "2022-11-12T13:35:08Z", + "version": 2, + "changeset": 128813026, + "user": "Alikam", + "uid": 3997418, + "tags": { + "name": "G\u00f6kt\u00fcrk", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 10167775311, + "lat": 41.0800228, + "lon": 28.9764623, + "timestamp": "2022-11-12T13:35:08Z", + "version": 2, + "changeset": 128813026, + "user": "Alikam", + "uid": 3997418, + "tags": { + "name": "Ka\u011f\u0131thane", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 10269219843, + "lat": 41.0914945, + "lon": 28.9567143, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219844, + "lat": 41.0911922, + "lon": 28.9570021, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219845, + "lat": 41.0917916, + "lon": 28.9564811, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219853, + "lat": 41.0926045, + "lon": 28.956035, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219854, + "lat": 41.0930927, + "lon": 28.9558377, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219855, + "lat": 41.09356, + "lon": 28.9556875, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219875, + "lat": 41.0975684, + "lon": 28.9544629, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219876, + "lat": 41.0983114, + "lon": 28.9541243, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219877, + "lat": 41.0988559, + "lon": 28.9538862, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219878, + "lat": 41.1007901, + "lon": 28.953356, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219879, + "lat": 41.1019549, + "lon": 28.9531258, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219880, + "lat": 41.1048251, + "lon": 28.9522946, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219881, + "lat": 41.1039436, + "lon": 28.9526487, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219882, + "lat": 41.1057759, + "lon": 28.9519252, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219883, + "lat": 41.1099583, + "lon": 28.9496913, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219884, + "lat": 41.1110379, + "lon": 28.9490957, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219885, + "lat": 41.111843, + "lon": 28.9486679, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219886, + "lat": 41.1123435, + "lon": 28.9484386, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219887, + "lat": 41.129739, + "lon": 28.944148, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219888, + "lat": 41.1293065, + "lon": 28.9446212, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219889, + "lat": 41.1302853, + "lon": 28.943214, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219890, + "lat": 41.128793, + "lon": 28.9449057, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219895, + "lat": 41.1556343, + "lon": 28.9109521, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219896, + "lat": 41.1546081, + "lon": 28.9112294, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219897, + "lat": 41.1541928, + "lon": 28.9114005, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219898, + "lat": 41.1534944, + "lon": 28.9118759, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219899, + "lat": 41.1495214, + "lon": 28.9194008, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219900, + "lat": 41.1481753, + "lon": 28.9215736, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219901, + "lat": 41.1470801, + "lon": 28.9228764, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219902, + "lat": 41.1457594, + "lon": 28.9237937, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219903, + "lat": 41.1401248, + "lon": 28.9255005, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219904, + "lat": 41.1395102, + "lon": 28.9257526, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219905, + "lat": 41.1384222, + "lon": 28.9265602, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269219906, + "lat": 41.1375806, + "lon": 28.9276308, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239815, + "lat": 41.1623796, + "lon": 28.9092903, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239816, + "lat": 41.1638207, + "lon": 28.9081858, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239820, + "lat": 41.1647967, + "lon": 28.9061005, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239822, + "lat": 41.1673924, + "lon": 28.8977799, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239823, + "lat": 41.168234, + "lon": 28.8955349, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239825, + "lat": 41.1686778, + "lon": 28.8944506, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239826, + "lat": 41.1698503, + "lon": 28.8920182, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239830, + "lat": 41.1779615, + "lon": 28.8824195, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239831, + "lat": 41.1879192, + "lon": 28.8725327, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239832, + "lat": 41.1887603, + "lon": 28.8719224, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239833, + "lat": 41.1908187, + "lon": 28.8708748, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239834, + "lat": 41.1933157, + "lon": 28.8701145, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239835, + "lat": 41.1950884, + "lon": 28.8695732, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239836, + "lat": 41.1963131, + "lon": 28.8689392, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239837, + "lat": 41.1986641, + "lon": 28.8662202, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239838, + "lat": 41.1991489, + "lon": 28.8654487, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239839, + "lat": 41.2002986, + "lon": 28.8629261, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239840, + "lat": 41.2006771, + "lon": 28.861974, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239841, + "lat": 41.2023489, + "lon": 28.8587258, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239842, + "lat": 41.2031932, + "lon": 28.8572997, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239843, + "lat": 41.2055291, + "lon": 28.8530788, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239844, + "lat": 41.2081697, + "lon": 28.8469542, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239845, + "lat": 41.2085582, + "lon": 28.8460999, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239846, + "lat": 41.2095093, + "lon": 28.8445289, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239847, + "lat": 41.2100439, + "lon": 28.8438644, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239848, + "lat": 41.2107085, + "lon": 28.8431495, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239849, + "lat": 41.2111847, + "lon": 28.8427385, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239850, + "lat": 41.2123449, + "lon": 28.8420005, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239851, + "lat": 41.2130986, + "lon": 28.841661, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239852, + "lat": 41.2151009, + "lon": 28.8407853, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239853, + "lat": 41.2156677, + "lon": 28.8405325, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239854, + "lat": 41.2223634, + "lon": 28.8367003, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239855, + "lat": 41.2230149, + "lon": 28.8362423, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239856, + "lat": 41.2250293, + "lon": 28.8343486, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239857, + "lat": 41.2411455, + "lon": 28.8109771, + "timestamp": "2023-01-15T11:43:34Z", + "version": 2, + "changeset": 131294571, + "user": "Alikam", + "uid": 3997418, + "tags": { + "railway": "switch" + } + }, + { + "type": "node", + "id": 10269239861, + "lat": 41.2372207, + "lon": 28.8162439, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239862, + "lat": 41.2368254, + "lon": 28.816808, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239864, + "lat": 41.235878, + "lon": 28.8184969, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239865, + "lat": 41.2323387, + "lon": 28.8270525, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239866, + "lat": 41.2317814, + "lon": 28.8280186, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239895, + "lat": 41.2435728, + "lon": 28.8079922, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239896, + "lat": 41.2442111, + "lon": 28.807195, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239897, + "lat": 41.2445542, + "lon": 28.806769, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239898, + "lat": 41.2454742, + "lon": 28.8052474, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239899, + "lat": 41.2452206, + "lon": 28.8057431, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239900, + "lat": 41.2456818, + "lon": 28.8047288, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239903, + "lat": 41.2486217, + "lon": 28.7924123, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239904, + "lat": 41.2478478, + "lon": 28.7947679, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239905, + "lat": 41.2513876, + "lon": 28.7871615, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239906, + "lat": 41.253284, + "lon": 28.7847769, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239915, + "lat": 41.256119, + "lon": 28.7773801, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239916, + "lat": 41.254989, + "lon": 28.7813117, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10269239917, + "lat": 41.254126, + "lon": 28.7833378, + "timestamp": "2022-12-17T09:26:21Z", + "version": 1, + "changeset": 130180362, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 10282323753, + "lat": 41.2558735, + "lon": 28.7439713, + "timestamp": "2022-12-23T14:47:51Z", + "version": 1, + "changeset": 130424633, + "user": "erkinalp", + "uid": 113816 + }, + { + "type": "node", + "id": 10651569141, + "lat": 41.2553291, + "lon": 28.7110604, + "timestamp": "2023-02-12T12:34:46Z", + "version": 1, + "changeset": 132443363, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 11155607801, + "lat": 41.0740664, + "lon": 28.9936732, + "timestamp": "2023-08-30T09:18:59Z", + "version": 1, + "changeset": 140577809, + "user": "Sofie2016", + "uid": 18370762 + }, + { + "type": "node", + "id": 11257201288, + "lat": 41.2417096, + "lon": 28.7033842, + "timestamp": "2023-10-12T10:12:03Z", + "version": 1, + "changeset": 142471733, + "user": "TheAhmet", + "uid": 20108253 + }, + { + "type": "node", + "id": 11417272843, + "lat": 41.2070981, + "lon": 28.7160865, + "timestamp": "2024-03-18T21:00:22Z", + "version": 2, + "changeset": 148834704, + "user": "Claudius Henrichs", + "uid": 18069, + "tags": { + "name": "Ta\u015foluk", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 11568561815, + "lat": 41.0667555, + "lon": 29.0105059, + "timestamp": "2024-01-30T08:42:23Z", + "version": 1, + "changeset": 146853522, + "user": "Alikam", + "uid": 3997418, + "tags": { + "name": "Gayrettepe", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 11742317988, + "lat": 41.1791198, + "lon": 28.74788, + "timestamp": "2024-03-19T20:17:09Z", + "version": 2, + "changeset": 148879771, + "user": "Alikam", + "uid": 3997418, + "tags": { + "name": "Arnavutk\u00f6y Hastane", + "public_transport": "stop_position", + "railway": "stop", + "subway": "yes" + } + }, + { + "type": "node", + "id": 11746640510, + "lat": 41.2076986, + "lon": 28.7159529, + "timestamp": "2024-03-19T20:14:07Z", + "version": 1, + "changeset": 148879676, + "user": "Alikam", + "uid": 3997418 + }, + { + "type": "node", + "id": 12399639780, + "lat": 41.1877853, + "lon": 28.7366973, + "timestamp": "2024-12-06T08:00:44Z", + "version": 1, + "changeset": 159983906, + "user": "SunOfABeach", + "uid": 17738194 + }, + { + "type": "way", + "id": 891578352, + "timestamp": "2023-02-26T14:22:41Z", + "version": 26, + "changeset": 133044890, + "user": "erkinalp", + "uid": 113816, + "nodes": [ + 8286892121, + 10282323753, + 8872578538, + 8872578536, + 8286892117, + 10167775301, + 8872578543, + 8872578541, + 8286890016, + 8286890015, + 10269239915, + 8286892122, + 8286890014, + 10269239916, + 8286892128, + 10269239917, + 8286892123, + 10269239906, + 8286892129, + 8286890013, + 10269239905, + 8286892130, + 8286890012, + 8286892131, + 10269239903, + 8286892124, + 10269239904, + 8286892132, + 8286892127, + 8286890011, + 8286892126, + 10269239900, + 10269239898, + 10269239899, + 8286892125, + 10269239897, + 10269239896, + 10269239895, + 10167775303, + 8286890010, + 10269239857, + 9935365536, + 8286890009, + 10269239861, + 10269239862, + 8286890008, + 10269239864, + 8286892133, + 8286890007, + 8286890006, + 10269239865, + 8339428839, + 10269239866, + 8286892134, + 8286890005, + 9846916426, + 8286890004, + 10269239856, + 8286890003, + 10269239855, + 10269239854, + 8339428824, + 8339428823, + 8286890002, + 10269239853, + 10269239852, + 8286892135, + 10269239851, + 10269239850, + 8286890001, + 10269239849, + 10269239848, + 10269239847, + 10269239846, + 8286890000, + 10269239845, + 10269239844, + 8286892136, + 8286889999, + 10269239843, + 8286889998, + 10269239842, + 10269239841, + 8286889997, + 8339428800, + 10269239840, + 10269239839, + 8286889996, + 10269239838, + 10269239837, + 8286889995, + 8339428793, + 8286892137, + 10269239836, + 8286889994, + 10269239835, + 8339428788, + 10269239834, + 8339428780, + 10269239833, + 8286889993, + 10269239832, + 10269239831, + 8286892138, + 8286889992, + 8286889991, + 10269239830, + 10167775309, + 8853526423, + 8853526426, + 8286889990, + 8286892139, + 8286889989, + 10269239826, + 8286889988, + 10269239825, + 10269239823, + 10269239822, + 8286889987, + 8286889986, + 10269239820, + 8286889985, + 8339428764, + 10269239816, + 8286889984, + 8339428762, + 10269239815, + 8286889983, + 8853364229, + 10167775305, + 8853364228, + 8286889982, + 10269219895, + 10269219896, + 10269219897, + 8286889981, + 10269219898, + 8286892140, + 8286889980, + 8286889979, + 8286889978, + 10269219899, + 8286889977, + 10269219900, + 8286892141, + 10269219901, + 8286889976, + 10269219902, + 8286892142, + 8286889975, + 8286889974, + 10269219903, + 10269219904, + 8286889973, + 10269219905, + 8286892143, + 10269219906, + 8286889972, + 8286889971, + 8286889970, + 8286889969, + 8286892144, + 10269219889, + 7246055821, + 10269219887, + 8286889968, + 10269219888, + 7246055822, + 10269219890, + 7246055823, + 8286889967, + 8853285994, + 7246055833, + 10167775307, + 7246055832, + 7246055831, + 10269219886, + 10269219885, + 10269219884, + 10269219883, + 7246055830, + 10269219882, + 10269219880, + 10269219881, + 7246055829, + 10269219879, + 10269219878, + 7246055828, + 10269219877, + 10269219876, + 10269219875, + 7246055827, + 7246055826, + 10269219855, + 10269219854, + 10269219853, + 7246055825, + 10269219845, + 10269219843, + 10269219844, + 7246055824, + 7246055835, + 6841250072, + 8286889966, + 8853285400, + 8286889963, + 8853285398 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-2", + "maxspeed": "120", + "name": "M11 \u0130stanbul Havaliman\u0131 - Ka\u011f\u0131thane Metro Hatt\u0131", + "opening_date": "22/01/2023", + "operator": "TCDD Ta\u015f\u0131mac\u0131l\u0131k", + "owner": "TCDD", + "railway": "subway", + "tunnel": "yes", + "usage": "main", + "voltage": "1500", + "wikidata": "Q31193348", + "wikipedia": "tr:M11 (\u0130stanbul metrosu)" + } + }, + { + "type": "way", + "id": 1108299775, + "timestamp": "2025-02-17T20:42:39Z", + "version": 6, + "changeset": 162634392, + "user": "Alikam", + "uid": 3997418, + "nodes": [ + 10167775311, + 10140418042, + 10140418043, + 10140418046, + 7246055810, + 7246055809, + 7246055808, + 8286889958, + 10140418047, + 7246055807, + 10140418050, + 8286889954, + 11155607801, + 7246055806, + 8286889956, + 7246055805, + 10140418055, + 7246055804, + 10140418054, + 7246055803, + 10140418053, + 7246055802, + 8286889953, + 10140418052, + 10140418035, + 7246055800, + 10140418034, + 8286889949, + 9051609051, + 9051609050, + 8286889947, + 11568561815 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-4", + "maxspeed": "120", + "name": "M11 Gayrettepe - \u0130stanbul Havaliman\u0131 Metro Hatt\u0131", + "operator": "TCDD Ta\u015f\u0131mac\u0131l\u0131k A.\u015e.", + "railway": "subway", + "tunnel": "yes", + "usage": "main", + "voltage": "1500", + "wikidata": "Q31193348", + "wikipedia": "tr:M11 (\u0130stanbul Metrosu)" + } + }, + { + "type": "way", + "id": 1131953997, + "timestamp": "2023-10-12T10:05:02Z", + "version": 5, + "changeset": 142471474, + "user": "TheAhmet", + "uid": 20108253, + "nodes": [ + 8474999417, + 8911584199 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-3", + "operator": "TCDD", + "railway": "subway", + "tunnel": "yes", + "usage": "branch", + "voltage": "1500" + } + }, + { + "type": "way", + "id": 1131953998, + "timestamp": "2026-02-25T08:43:36Z", + "version": 8, + "changeset": 179025007, + "user": "lepoissonauchocolat", + "uid": 22395560, + "nodes": [ + 8911584199, + 9217106876, + 8474966022, + 8911584204, + 8474966021, + 8474966020, + 8911584205, + 8474966019, + 8474966018, + 8911584206, + 8474966017, + 8911584207, + 8474966016, + 8911584208, + 8474966015, + 11257201288, + 8474966014, + 8474966013, + 8911584209, + 8474966012, + 8474966011, + 8474966010, + 8911584223, + 8474966005, + 8911584210, + 8911584213, + 8474966004, + 8474966003, + 8474966002, + 8474966001, + 8911584214, + 8474966000, + 8911584215, + 8474965999, + 8474965998, + 8474965997, + 10651569141, + 10167775297 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-3", + "maxspeed": "120", + "operator": "TCDD", + "railway": "subway", + "tunnel": "yes", + "usage": "branch", + "voltage": "1500" + } + }, + { + "type": "way", + "id": 1136820624, + "timestamp": "2023-02-12T12:34:46Z", + "version": 2, + "changeset": 132443363, + "user": "Alikam", + "uid": 3997418, + "nodes": [ + 8872578530, + 8872578533, + 8286892118, + 8872542407, + 10167775299, + 8286892121 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-3", + "maxspeed": "120", + "name": "M11 \u0130stanbul Havaliman\u0131 - Ka\u011f\u0131thane Metro Hatt\u0131", + "opening_date": "22/01/2023", + "operator": "TCDD Ta\u015f\u0131mac\u0131l\u0131k", + "railway": "subway", + "tunnel": "yes", + "usage": "main", + "voltage": "1500", + "wikidata": "Q31193348", + "wikipedia": "tr:M11 (\u0130stanbul metrosu)" + } + }, + { + "type": "way", + "id": 1144334839, + "timestamp": "2025-02-17T20:42:39Z", + "version": 2, + "changeset": 162634392, + "user": "Alikam", + "uid": 3997418, + "nodes": [ + 8853285395, + 8286889964, + 8853285392, + 10167775311 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-2", + "maxspeed": "120", + "name": "M11 Gayrettepe - \u0130stanbul Havaliman\u0131 Metro Hatt\u0131", + "opening_date": "22/01/2023", + "operator": "TCDD Ta\u015f\u0131mac\u0131l\u0131k A.\u015e.", + "railway": "subway", + "tunnel": "yes", + "usage": "main", + "voltage": "1500", + "wikidata": "Q31193348", + "wikipedia": "tr:M11 (\u0130stanbul Metrosu)" + } + }, + { + "type": "way", + "id": 1144334842, + "timestamp": "2023-02-12T12:34:46Z", + "version": 1, + "changeset": 132443363, + "user": "Alikam", + "uid": 3997418, + "nodes": [ + 8853285398, + 8853285395 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-2", + "maxspeed": "120", + "name": "M11 \u0130stanbul Havaliman\u0131 - Ka\u011f\u0131thane Metro Hatt\u0131", + "opening_date": "22/01/2023", + "operator": "TCDD Ta\u015f\u0131mac\u0131l\u0131k", + "railway": "subway", + "tunnel": "yes", + "usage": "main", + "voltage": "1500", + "wikidata": "Q31193348", + "wikipedia": "tr:M11 (\u0130stanbul metrosu)" + } + }, + { + "type": "way", + "id": 1144334845, + "timestamp": "2023-02-12T12:34:46Z", + "version": 1, + "changeset": 132443363, + "user": "Alikam", + "uid": 3997418, + "nodes": [ + 10167775297, + 8872578522, + 8286892119, + 8872578532, + 8872578531 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-3", + "maxspeed": "120", + "name": "M11 \u0130stanbul Havaliman\u0131 - Ka\u011f\u0131thane Metro Hatt\u0131", + "opening_date": "22/01/2023", + "operator": "TCDD Ta\u015f\u0131mac\u0131l\u0131k", + "railway": "subway", + "tunnel": "yes", + "usage": "main", + "voltage": "1500", + "wikidata": "Q31193348", + "wikipedia": "tr:M11 (\u0130stanbul metrosu)" + } + }, + { + "type": "way", + "id": 1144334846, + "timestamp": "2023-02-12T12:34:46Z", + "version": 1, + "changeset": 132443363, + "user": "Alikam", + "uid": 3997418, + "nodes": [ + 8872578531, + 8872578530 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-3", + "maxspeed": "120", + "name": "M11 \u0130stanbul Havaliman\u0131 - Ka\u011f\u0131thane Metro Hatt\u0131", + "opening_date": "22/01/2023", + "operator": "TCDD Ta\u015f\u0131mac\u0131l\u0131k", + "railway": "subway", + "tunnel": "yes", + "usage": "main", + "voltage": "1500", + "wikidata": "Q31193348", + "wikipedia": "tr:M11 (\u0130stanbul metrosu)" + } + }, + { + "type": "way", + "id": 1263888241, + "timestamp": "2026-02-25T08:43:36Z", + "version": 5, + "changeset": 179025007, + "user": "lepoissonauchocolat", + "uid": 22395560, + "nodes": [ + 11742317988, + 8474966061, + 8865833282, + 8911584156, + 8474966060, + 8865833281, + 8865833278, + 8474966059, + 8474966057, + 8474966056, + 8474966058, + 8474966055, + 8911584157, + 12399639780, + 8474966054, + 8474966053, + 8474966052, + 8474966051, + 8911584161, + 8911584159, + 8474966049, + 8911584164, + 8911584165, + 8474966048, + 8911584166, + 8474966047, + 8911584167, + 8474966046, + 8911584168, + 8474966045, + 8474966044, + 8474966043, + 8474966038, + 8872476309, + 11417272843, + 11746640510, + 8872476308, + 8474966037, + 8474966036, + 8474966035, + 8911584181, + 8474966034, + 8911584180, + 8474966033, + 8911584179, + 8474966032, + 8911584187, + 8474966031, + 8911584178, + 8474966029, + 8911584186, + 8474999427, + 8911584198, + 8474966028, + 8911584197, + 8474966027, + 8911584196, + 8474966026, + 8911584195, + 8474966025, + 8911584194, + 8474966024, + 8911584193, + 8474966023, + 8474999417 + ], + "tags": { + "electrified": "contact_line", + "frequency": "0", + "gauge": "1435", + "layer": "-3", + "maxspeed": "120", + "name": "M11 \u0130stanbul Havaliman\u0131 - Halkal\u0131 Metro Hatt\u0131", + "railway": "subway", + "tunnel": "yes", + "voltage": "1500" + } + }, + { + "type": "relation", + "id": 12896419, + "timestamp": "2025-12-21T16:51:02Z", + "version": 4, + "changeset": 176226037, + "user": "marczoutendijk", + "uid": 606555, + "members": [ + { + "type": "way", + "ref": 958866443, + "role": "inner" + }, + { + "type": "way", + "ref": 958866444, + "role": "inner" + }, + { + "type": "way", + "ref": 958866445, + "role": "inner" + }, + { + "type": "way", + "ref": 958866446, + "role": "inner" + }, + { + "type": "way", + "ref": 912307448, + "role": "outer" + } + ], + "tags": { + "landuse": "railway", + "layer": "-3", + "public_transport": "platform", + "railway": "platform", + "subway": "yes", + "tunnel": "yes", + "type": "multipolygon" + } + }, + { + "type": "relation", + "id": 12896428, + "timestamp": "2025-12-21T16:50:35Z", + "version": 4, + "changeset": 176226022, + "user": "marczoutendijk", + "uid": 606555, + "members": [ + { + "type": "way", + "ref": 958867517, + "role": "inner" + }, + { + "type": "way", + "ref": 958867518, + "role": "inner" + }, + { + "type": "way", + "ref": 958867519, + "role": "inner" + }, + { + "type": "way", + "ref": 958867520, + "role": "inner" + }, + { + "type": "way", + "ref": 912307447, + "role": "outer" + } + ], + "tags": { + "landuse": "railway", + "layer": "-3", + "public_transport": "platform", + "railway": "platform", + "subway": "yes", + "tunnel": "yes", + "type": "multipolygon" + } + }, + { + "type": "relation", + "id": 15083963, + "timestamp": "2025-12-20T00:17:53Z", + "version": 15, + "changeset": 176161033, + "user": "EDtheWARDen", + "uid": 14025239, + "members": [ + { + "type": "node", + "ref": 11742317988, + "role": "stop" + }, + { + "type": "relation", + "ref": 12896419, + "role": "platform" + }, + { + "type": "node", + "ref": 11417272843, + "role": "stop" + }, + { + "type": "relation", + "ref": 12896428, + "role": "platform" + }, + { + "type": "node", + "ref": 10167775297, + "role": "stop" + }, + { + "type": "node", + "ref": 10167775299, + "role": "stop" + }, + { + "type": "node", + "ref": 10167775303, + "role": "stop" + }, + { + "type": "node", + "ref": 10167775309, + "role": "stop" + }, + { + "type": "node", + "ref": 10167775305, + "role": "stop" + }, + { + "type": "node", + "ref": 10167775307, + "role": "stop" + }, + { + "type": "node", + "ref": 10167775311, + "role": "stop" + }, + { + "type": "node", + "ref": 11568561815, + "role": "stop" + }, + { + "type": "way", + "ref": 1263888241, + "role": "" + }, + { + "type": "way", + "ref": 1131953997, + "role": "" + }, + { + "type": "way", + "ref": 1131953998, + "role": "" + }, + { + "type": "way", + "ref": 1144334845, + "role": "" + }, + { + "type": "way", + "ref": 1144334846, + "role": "" + }, + { + "type": "way", + "ref": 1136820624, + "role": "" + }, + { + "type": "way", + "ref": 891578352, + "role": "" + }, + { + "type": "way", + "ref": 1144334842, + "role": "" + }, + { + "type": "way", + "ref": 1144334839, + "role": "" + }, + { + "type": "way", + "ref": 1108299775, + "role": "" + } + ], + "tags": { + "from": "Arnavutk\u00f6y Hastane", + "name": "M11: Arnavutk\u00f6y Hastane\u2192 Gayrettepe", + "network": "\u0130stanbul Metrosu", + "not:network:wikidata": "Q498172", + "operator": "TCDD Ta\u015f\u0131mac\u0131l\u0131k", + "operator:wikidata": "Q344299", + "operator:wikipedia": "tr:T\u00fcrkiye Cumhuriyeti Ula\u015ft\u0131rma ve Altyap\u0131 Bakanl\u0131\u011f\u0131", + "public_transport:version": "2", + "ref": "M11", + "route": "subway", + "to": "Gayrettepe", + "type": "route", + "wikidata": "Q31193348", + "wikipedia": "tr:M11 (\u0130stanbul Metrosu)" + } + } + ] +} diff --git a/tests/test_osm_pt_geojson.py b/tests/test_osm_pt_geojson.py new file mode 100644 index 0000000..521139e --- /dev/null +++ b/tests/test_osm_pt_geojson.py @@ -0,0 +1,317 @@ +"""Tests for osm-pt-geojson.""" +import json +from pathlib import Path + +import pytest +import responses as responses_lib +from click.testing import CliRunner + +import sys +sys.path.insert(0, str(Path(__file__).parent.parent)) + +# Import the script as a module. The filename has hyphens so we use importlib. +import importlib.machinery +import importlib.util + +_loader = importlib.machinery.SourceFileLoader( + "osm_pt_geojson", str(Path(__file__).parent.parent / "osm-pt-geojson") +) +_spec = importlib.util.spec_from_loader("osm_pt_geojson", _loader) +assert _spec +osm = importlib.util.module_from_spec(_spec) +_loader.exec_module(osm) + +FIXTURES = Path(__file__).parent / "fixtures" +FULL_URL = "https://www.openstreetmap.org/api/0.6/relation/15083963/full.json" +RELATION_ID = 15083963 + + +@pytest.fixture() +def full_data() -> dict: + """Load the saved full API response for relation 15083963 (M11 Istanbul Metro).""" + return json.loads((FIXTURES / "15083963-full.json").read_text()) + + +@pytest.fixture() +def parsed(full_data: dict) -> tuple: + """Return parsed elements (nodes, ways, stop_ids, way_ids, tags) for relation 15083963.""" + return osm.parse_elements(full_data, RELATION_ID) + + +# --------------------------------------------------------------------------- +# parse_elements +# --------------------------------------------------------------------------- + +def test_parse_elements_stop_count(parsed: tuple) -> None: + """All ten stops on the M11 are extracted in order.""" + nodes, ways, stop_ids, way_ids, tags = parsed + assert len(stop_ids) == 10 + + +def test_parse_elements_first_and_last_stop(parsed: tuple) -> None: + """The first and last stops match the route terminus names.""" + nodes, ways, stop_ids, way_ids, tags = parsed + assert osm.node_name(nodes[stop_ids[0]]) == "Arnavutköy Hastane" + assert osm.node_name(nodes[stop_ids[-1]]) == "Gayrettepe" + + +def test_parse_elements_way_count(parsed: tuple) -> None: + """All ten member ways are extracted.""" + nodes, ways, stop_ids, way_ids, tags = parsed + assert len(way_ids) == 10 + + +def test_parse_elements_tags(parsed: tuple) -> None: + """Route tags are returned correctly.""" + _, _, _, _, tags = parsed + assert tags["ref"] == "M11" + assert tags["route"] == "subway" + + +def test_parse_elements_unknown_relation(full_data: dict) -> None: + """Requesting a relation ID not present in the response exits with an error.""" + runner = CliRunner() + with pytest.raises(SystemExit): + osm.parse_elements(full_data, 9999999) + + +# --------------------------------------------------------------------------- +# build_route_coords +# --------------------------------------------------------------------------- + +def test_build_route_coords_returns_coords(parsed: tuple) -> None: + """Chained coordinates are non-empty and fall within the Istanbul bounding box.""" + nodes, ways, stop_ids, way_ids, tags = parsed + coords = osm.build_route_coords(way_ids, ways, nodes) + assert len(coords) > 0 + for coord in coords: + assert len(coord) == 2 + lon, lat = coord + assert 28.0 < lon < 29.1 + assert 40.0 < lat < 42.0 + + +def test_build_route_coords_empty_ways() -> None: + """An empty way list returns an empty coordinate list.""" + assert osm.build_route_coords([], {}, {}) == [] + + +# --------------------------------------------------------------------------- +# nearest_coord_index +# --------------------------------------------------------------------------- + +def test_nearest_coord_index_exact() -> None: + """Returns the index of an exact coordinate match.""" + coords = [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]] + assert osm.nearest_coord_index(3.0, 4.0, coords) == 1 + + +def test_nearest_coord_index_approximate() -> None: + """Returns the index of the closest coordinate when there is no exact match.""" + coords = [[0.0, 0.0], [10.0, 0.0], [20.0, 0.0]] + assert osm.nearest_coord_index(9.0, 0.0, coords) == 1 + + +# --------------------------------------------------------------------------- +# node_name +# --------------------------------------------------------------------------- + +def test_node_name_uses_name_tag() -> None: + """Prefers the name tag when present.""" + node = {"id": 1, "lat": 0.0, "lon": 0.0, "tags": {"name": "Central", "ref": "C1"}} + assert osm.node_name(node) == "Central" + + +def test_node_name_falls_back_to_ref() -> None: + """Falls back to the ref tag when there is no name tag.""" + node = {"id": 1, "lat": 0.0, "lon": 0.0, "tags": {"ref": "C1"}} + assert osm.node_name(node) == "C1" + + +def test_node_name_falls_back_to_id() -> None: + """Falls back to the node ID when tags are present but empty.""" + node = {"id": 42, "lat": 0.0, "lon": 0.0, "tags": {}} + assert osm.node_name(node) == "42" + + +def test_node_name_no_tags() -> None: + """Falls back to the node ID when the tags key is absent.""" + node = {"id": 99, "lat": 0.0, "lon": 0.0} + assert osm.node_name(node) == "99" + + +# --------------------------------------------------------------------------- +# make_geojson +# --------------------------------------------------------------------------- + +def test_make_geojson_full(parsed: tuple) -> None: + """Full output contains one LineString and one Point per stop.""" + nodes, ways, stop_ids, way_ids, tags = parsed + coords = osm.build_route_coords(way_ids, ways, nodes) + geojson = osm.make_geojson(coords, stop_ids, nodes, tags) + + assert geojson["type"] == "FeatureCollection" + features = geojson["features"] + line_features = [f for f in features if f["geometry"]["type"] == "LineString"] + point_features = [f for f in features if f["geometry"]["type"] == "Point"] + + assert len(line_features) == 1 + assert len(point_features) == 10 + + +def test_make_geojson_no_stops(parsed: tuple) -> None: + """With no_stops=True, only the LineString feature is included.""" + nodes, ways, stop_ids, way_ids, tags = parsed + coords = osm.build_route_coords(way_ids, ways, nodes) + geojson = osm.make_geojson(coords, stop_ids, nodes, tags, no_stops=True) + + features = geojson["features"] + assert all(f["geometry"]["type"] == "LineString" for f in features) + + +def test_make_geojson_slice(parsed: tuple) -> None: + """Slicing by coord index produces a shorter LineString with the correct length.""" + nodes, ways, stop_ids, way_ids, tags = parsed + coords = osm.build_route_coords(way_ids, ways, nodes) + full = osm.make_geojson(coords, stop_ids, nodes, tags) + full_line_len = len(full["features"][0]["geometry"]["coordinates"]) + + sliced = osm.make_geojson(coords, stop_ids, nodes, tags, idx_from=10, idx_to=50) + sliced_line_len = len(sliced["features"][0]["geometry"]["coordinates"]) + + assert sliced_line_len == 41 # 50 - 10 + 1 + assert sliced_line_len < full_line_len + + +def test_make_geojson_linestring_properties(parsed: tuple) -> None: + """The LineString feature carries route properties from the OSM relation tags.""" + nodes, ways, stop_ids, way_ids, tags = parsed + coords = osm.build_route_coords(way_ids, ways, nodes) + geojson = osm.make_geojson(coords, stop_ids, nodes, tags) + + props = geojson["features"][0]["properties"] + assert props["ref"] == "M11" + assert props["route"] == "subway" + + +# --------------------------------------------------------------------------- +# CLI — list-stations +# --------------------------------------------------------------------------- + +@responses_lib.activate +def test_cli_list_stations(full_data: dict) -> None: + """list-stations prints the route name and all stop names.""" + responses_lib.add(responses_lib.GET, FULL_URL, json=full_data) + runner = CliRunner() + result = runner.invoke(osm.cli, ["list-stations", str(RELATION_ID)]) + assert result.exit_code == 0 + assert "M11" in result.output + assert "Arnavutköy Hastane" in result.output + assert "Gayrettepe" in result.output + + +@responses_lib.activate +def test_cli_list_stations_http_error() -> None: + """list-stations exits with code 1 on an HTTP error response.""" + responses_lib.add(responses_lib.GET, FULL_URL, status=503) + runner = CliRunner() + result = runner.invoke(osm.cli, ["list-stations", str(RELATION_ID)]) + assert result.exit_code == 1 + + +# --------------------------------------------------------------------------- +# CLI — full-route +# --------------------------------------------------------------------------- + +@responses_lib.activate +def test_cli_full_route_geojson(full_data: dict) -> None: + """full-route outputs a valid GeoJSON FeatureCollection to stdout.""" + responses_lib.add(responses_lib.GET, FULL_URL, json=full_data) + runner = CliRunner() + result = runner.invoke(osm.cli, ["full-route", str(RELATION_ID)]) + assert result.exit_code == 0 + geojson = json.loads(result.output) + assert geojson["type"] == "FeatureCollection" + + +@responses_lib.activate +def test_cli_full_route_no_stops(full_data: dict) -> None: + """full-route --no-stops omits Point features from the output.""" + responses_lib.add(responses_lib.GET, FULL_URL, json=full_data) + runner = CliRunner() + result = runner.invoke(osm.cli, ["full-route", str(RELATION_ID), "--no-stops"]) + assert result.exit_code == 0 + geojson = json.loads(result.output) + types = [f["geometry"]["type"] for f in geojson["features"]] + assert "Point" not in types + + +@responses_lib.activate +def test_cli_full_route_output_file(full_data: dict, tmp_path) -> None: + """full-route -o writes valid GeoJSON to the specified file.""" + responses_lib.add(responses_lib.GET, FULL_URL, json=full_data) + out = tmp_path / "route.geojson" + runner = CliRunner() + result = runner.invoke(osm.cli, ["full-route", str(RELATION_ID), "-o", str(out)]) + assert result.exit_code == 0 + assert out.exists() + geojson = json.loads(out.read_text()) + assert geojson["type"] == "FeatureCollection" + + +# --------------------------------------------------------------------------- +# CLI — route-between +# --------------------------------------------------------------------------- + +@responses_lib.activate +def test_cli_route_between(full_data: dict) -> None: + """route-between includes both endpoint stops in the output.""" + responses_lib.add(responses_lib.GET, FULL_URL, json=full_data) + runner = CliRunner() + result = runner.invoke( + osm.cli, + ["route-between", str(RELATION_ID), "Arnavutköy Hastane", "Gayrettepe"], + ) + assert result.exit_code == 0 + geojson = json.loads(result.output) + stop_names = [ + f["properties"]["name"] + for f in geojson["features"] + if f["geometry"]["type"] == "Point" + ] + assert "Arnavutköy Hastane" in stop_names + assert "Gayrettepe" in stop_names + + +@responses_lib.activate +def test_cli_route_between_unknown_station(full_data: dict) -> None: + """route-between exits with code 1 when a station name is not found.""" + responses_lib.add(responses_lib.GET, FULL_URL, json=full_data) + runner = CliRunner() + result = runner.invoke( + osm.cli, + ["route-between", str(RELATION_ID), "Nonexistent", "Gayrettepe"], + ) + assert result.exit_code == 1 + + +@responses_lib.activate +def test_cli_route_between_stops_subset(full_data: dict) -> None: + """route-between only includes stops between the two named stations.""" + responses_lib.add(responses_lib.GET, FULL_URL, json=full_data) + runner = CliRunner() + result = runner.invoke( + osm.cli, + ["route-between", str(RELATION_ID), "İstanbul Havalimanı", "Hasdal"], + ) + assert result.exit_code == 0 + geojson = json.loads(result.output) + stop_names = [ + f["properties"]["name"] + for f in geojson["features"] + if f["geometry"]["type"] == "Point" + ] + assert "İstanbul Havalimanı" in stop_names + assert "Hasdal" in stop_names + assert "Arnavutköy Hastane" not in stop_names + assert "Gayrettepe" not in stop_names