10cd964ede
Wer auf dem Kartenreiter die Einstellungen oeffnete und eine Stadt eingab,
bekam danach nur noch ein graues Fenster. Drei Fehler wirkten zusammen:
1. getCityCoords() rief Nominatim ohne eigenen User-Agent auf. Nominatim
beantwortet den axios-Default mit 403, und zwar fuer jede Stadt. Die
Schwesterfunktion getAddress() setzt seit jeher einen User-Agent -
deshalb funktionierten die Adressen an den Sensoren, nur die
Stadtsuche nicht. Beide nutzen jetzt dieselbe Konstante.
2. cityCoords() lieferte im Fehlerfall den String "no coordinates". Der
landete als Kartenzentrum in L.map().setView(), Leaflet warf "Invalid
LatLng object" - und weil showMap() die alte Karte vorher schon
entfernt hat, blieb der Container leer. Daher grau statt Fehlermeldung.
cityCoords() liefert jetzt {coords, err}; schlaegt die Suche fehl,
bleibt das bisherige Zentrum stehen und der Text wird angezeigt.
3. Der Proxy in noise/routes/api.js kodierte die bereits prozentkodierte
req.originalUrl ein zweites Mal. 'Goettingen' kam als 'G%c3%b6ttingen'
an. Das fiel bisher nicht auf, weil schon Punkt 1 alles abfing.
Ausserdem: Tippfehler getCityCoord.name, fehlendes encodeURI bei der
Stadtsuche, Koordinaten als Zahl statt String, und eine eigene Meldung
(ENOCITY), wenn Nominatim den Ort nicht kennt.
Geprueft ueber die volle Kette noise -> sensorapi -> Nominatim:
Stuttgart, Goettingen (Umlaut), Bad Cannstatt (Leerzeichen) liefern
Koordinaten, ein erfundener Ort eine saubere Meldung.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
91 lines
3.3 KiB
JavaScript
91 lines
3.3 KiB
JavaScript
import {returnOnError} from "../utilities/reporterror.js"
|
|
import axios from 'axios'
|
|
import {logit} from "../utilities/logit.js"
|
|
import {getOneProperty} from "./getproperties.js"
|
|
import { response } from "express"
|
|
|
|
const NOMINATIM_URL = `https://nominatim.openstreetmap.org/reverse?lat=${'xx'}&lon=${'yy'}&format=json`
|
|
const NOMINATIM_CITY_URL = `https://nominatim.openstreetmap.org/?q="${'xx'}"&format=json`
|
|
// Nominatim verlangt laut Nutzungsbedingungen einen eigenen User-Agent und
|
|
// beantwortet den Default von axios ('axios/1.x') mit 403.
|
|
const NOMINATIM_UA = 'laermsensor-stack (rxf@gmx.de)'
|
|
|
|
export const getCityCoords = async (params) => {
|
|
let ret = {coords: [], city: params.city, err: null}
|
|
let url = NOMINATIM_CITY_URL.replace('xx', params.city)
|
|
// let url = 'https://nominatim.openstreetmap.org/?q="K%C3%B6ln"&format=json'
|
|
try {
|
|
const response = await axios(encodeURI(url), {
|
|
headers: {
|
|
'User-Agent': NOMINATIM_UA
|
|
}
|
|
})
|
|
if (response.status !== 200) {
|
|
return returnOnError(ret, 'RESPSTATUS', getCityCoords.name, response.status)
|
|
}
|
|
if (!response.data.length) { // Stadt nicht gefunden
|
|
return returnOnError(ret, 'ENOCITY', getCityCoords.name, params.city)
|
|
}
|
|
ret.coords = [parseFloat(response.data[0].lat), parseFloat(response.data[0].lon)]
|
|
logit(JSON.stringify(ret.coords))
|
|
} catch (e) {
|
|
return returnOnError(ret, e, getCityCoords.name)
|
|
}
|
|
return ret
|
|
}
|
|
|
|
export const getAddress = async (params) => {
|
|
let ret = {address: "", err: null}
|
|
let {props, err} = await getOneProperty(params)
|
|
if (err) {
|
|
return returnOnError(ret, err, getAddress.name)
|
|
}
|
|
let coord = props.location[0].loc.coordinates
|
|
let url = NOMINATIM_URL.replace('xx', coord[1]).replace('yy', coord[0])
|
|
try {
|
|
const response = await axios(encodeURI(url),{
|
|
headers: {
|
|
'User-Agent': NOMINATIM_UA
|
|
}
|
|
});
|
|
if (response.status !== 200) {
|
|
return returnOnError(ret, 'RESPSTATUS', getAddress.name, response.status)
|
|
}
|
|
let akt = response.data.address
|
|
// logit(JSON.stringify(akt))
|
|
const CITY = ['city', 'town', 'village', 'suburb', 'county']
|
|
let city = "unknown"
|
|
for (let c of CITY) {
|
|
if(akt[c] !== undefined) {
|
|
city = akt[c]
|
|
break
|
|
}
|
|
}
|
|
// ret.address = `${(akt.road ? akt.road : "")} ${(akt.postcode ? akt.postcode : "")} ${city}`;
|
|
ret.address = {
|
|
street: `${(akt.road ? akt.road : "")}`,
|
|
plz: `${(akt.postcode ? akt.postcode : "")}`,
|
|
city: `${city}`}
|
|
} catch (e) {
|
|
return returnOnError(ret, e, getAddress.name)
|
|
}
|
|
return ret
|
|
}
|
|
/*
|
|
let addr = "Addr";
|
|
try {
|
|
let ret = await $.get("api/getprops?sensorid=" + marker.options.name);
|
|
if(ret.values[0].address.city == null) {
|
|
addr += " unbekannt !"
|
|
} else {
|
|
let akt = ret.values[0].address;
|
|
addr = (akt.street ? akt.street : "") + " " + (akt.plz ? akt.plz : "") + " " + akt.city;
|
|
}
|
|
} catch (e) {
|
|
console.log("onMarker - getpops", e)
|
|
}
|
|
console.log("addr:", addr);
|
|
return addr;
|
|
|
|
*/
|