marco/app/services/osm.js

53 lines
1.5 KiB
JavaScript

import Service from '@ember/service';
export default class OsmService extends Service {
async getNearbyPois(lat, lon, radius = 50) {
const query = `
[out:json][timeout:25];
(
nwr["amenity"](around:${radius},${lat},${lon});
nwr["shop"](around:${radius},${lat},${lon});
nwr["tourism"](around:${radius},${lat},${lon});
nwr["leisure"](around:${radius},${lat},${lon});
nwr["historic"](around:${radius},${lat},${lon});
);
out center;
`.trim();
const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(
query
)}`;
const res = await fetch(url);
if (!res.ok) throw new Error('Overpass request failed');
const data = await res.json();
return data.elements;
}
async getPoiById(id) {
// Assuming 'id' is just the numeric ID.
// Overpass needs type(id). But we might not know the type (node, way, relation).
// We can query all types for this ID.
// However, typical usage often passes just the numeric ID.
// A query for just ID(numeric) is tricky without type.
// Let's assume 'node' first or try to query all three types by ID.
const query = `
[out:json][timeout:25];
(
node(${id});
way(${id});
relation(${id});
);
out center;
`.trim();
const url = `https://overpass-api.de/api/interpreter?data=${encodeURIComponent(
query
)}`;
const res = await fetch(url);
if (!res.ok) throw new Error('Overpass request failed');
const data = await res.json();
return data.elements[0]; // Return the first match
}
}