Find adresser i en radius eller et polygon

Hent alle adresser inden for en cirkel eller et tegnet område med cirkel og polygon, URL-encod polygonet korrekt og bladr gennem store resultater.

3 min Niveau: Øvet ✓ Kode testet

Et forsyningsselskab skal varsle alle husstande inden for 300 meter af et ledningsbrud. En kommune vil have adresserne i et lokalplanområde. En ejendomsmægler vil vise alle huse i et tegnet område på kortet. Det er rumlige søgninger, og /adgangsadresser og /adresser har to filtre til dem: cirkel og polygon.

Brug /adgangsadresser, når du vil have én række pr. bygningsindgang (en husstand pr. hus, et punkt pr. opgang). Brug /adresser, når du skal have hver lejlighed med.

Cirkel

Formatet er cirkel=længdegrad,breddegrad,radius_i_meter:

Shell#cirkel-curl
curl -s "https://api.danadresse.dk/adgangsadresser?cirkel=12.5683,55.6761,100&struktur=mini&per_side=5" \
  -H "X-Api-Key: $DANADRESSE_API_KEY"
  • Resultaterne er sorteret efter afstand, nærmeste først. Afstanden står ikke i svaret.
  • Radius skal være mellem 1 og 50 000 meter. Andre værdier giver 400 med koden invalid_cirkel.
  • Med srid=25832 angiver du centrum i UTM32-meter: cirkel=724400,6175700,100&srid=25832. Koordinaterne i svaret kommer så også i meter.
  • Du kan kombinere med postnr, kommunekode, status og medtagnedlagte. Uden status og medtagnedlagte får du gældende og foreløbige adresser.

Polygon

polygon tager den ydre ring af et GeoJSON-polygon som JSON: [[[lon,lat],[lon,lat],…]]. Ringen skal have mindst tre punkter, og det er god skik at lukke den ved at gentage det første punkt til sidst.

Polygonet indeholder [, ] og ,, så det skal URL-encodes. Lad dit HTTP-bibliotek gøre det:

Python#polygon-python
import json
import os
import requests

ring = [
    [12.5665, 55.6750], [12.5700, 55.6750],
    [12.5700, 55.6770], [12.5665, 55.6770],
    [12.5665, 55.6750],
]
polygon = json.dumps([ring], separators=(",", ":"))

s = requests.Session()
s.headers["X-Api-Key"] = os.environ["DANADRESSE_API_KEY"]

alle, side, per_side = [], 1, 100
while side <= 5:
    r = s.get(
        "https://api.danadresse.dk/adgangsadresser",
        params={"polygon": polygon, "struktur": "mini", "per_side": per_side, "side": side},
        timeout=30,
    )
    r.raise_for_status()
    rows = r.json()
    alle.extend(rows)
    if len(rows) < per_side:
        break
    side += 1

print(f"{len(alle)} adgangsadresser i polygonet")
for a in alle[:3]:
    print(" ", a["betegnelse"])

Med curl kan du bruge -G --data-urlencode, så klarer curl encodingen:

Shell#polygon-curl
curl -s -G "https://api.danadresse.dk/adgangsadresser" \
  --data-urlencode 'polygon=[[[12.5665,55.6750],[12.5700,55.6750],[12.5700,55.6770],[12.5665,55.6750]]]' \
  --data-urlencode "struktur=mini" \
  --data-urlencode "per_side=3" \
  -H "X-Api-Key: $DANADRESSE_API_KEY"

Regler for polygon:

  • Kun den ydre ring bruges. Huller i polygonet (indre ringe) ignoreres.
  • Færre end tre punkter eller ugyldig JSON giver 400 med koden invalid_polygon.
  • Med srid=25832 er punkterne i UTM32-meter.
  • Resultaterne er sorteret efter id, så siderne aldrig overlapper. De er ikke sorteret efter afstand.
  • Polygonet sendes i URL'en, og der findes ingen POST-variant. Forenkl store polygoner til få hundrede punkter, så URL'en holder sig under cirka 8 KB.

Bladr gennem resultaterne

per_side er højst 1000 (standard 100), og side starter ved 1. Der er ingen header med det samlede antal, så bliv ved, til du får en side med færre rækker end per_side.

På /adresser med cirkel eller polygon tæller per_side adresser (lejligheder), som på alle andre lister. Adresserne kommer bygning for bygning, med den nærmeste bygning først ved cirkel.

JavaScript#cirkel-node
const url = new URL("https://api.danadresse.dk/adresser");
url.searchParams.set("cirkel", "12.5757,55.7326,40");
url.searchParams.set("struktur", "mini");
url.searchParams.set("per_side", "20");

const alle = [];
for (let side = 1; side <= 10; side++) {
  url.searchParams.set("side", String(side));
  const res = await fetch(url, { headers: { "X-Api-Key": process.env.DANADRESSE_API_KEY } });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  const rows = await res.json();
  alle.push(...rows);
  if (rows.length < 20) break; // sidste side
}
console.log(`${alle.length} adresser i alt`);
console.log(alle.slice(0, 3).map((a) => a.betegnelse).join("\n"));

Direkte på et kort

Med format=geojson får du en FeatureCollection, som Leaflet, MapLibre og QGIS kan læse direkte. crs angiver koordinatsystemet (EPSG:25832 med srid=25832), og properties har de samme felter som det almindelige JSON-svar (forkortet her):

JSON#geojson-svar
{
  "type": "FeatureCollection",
  "crs": { "type": "name", "properties": { "name": "EPSG:4326" } },
  "features": [
    {
      "type": "Feature",
      "geometry": { "type": "Point", "coordinates": [12.56823601, 55.67611003] },
      "properties": {
        "id": "0a3f507a-ec03-32b8-e044-0003ba298018",
        "kvh": "01016152___3",
        "status": 1,
        "betegnelse": "Rådhuspladsen 3, 1550 København V"
      }
    }
  ]
}

Se Formater: JSON, CSV, GeoJSON og NDJSON for de andre formater.

Store områder

En cirkel eller et polygon må højst dække 50 000 adgangsadresser (målt på det omsluttende rektangel). Er området større, svarer API'et 400 med koden area_too_large i stedet for at returnere et ufuldstændigt resultat. Del store områder op i mindre stykker (f.eks. én cirkel pr. postnummer-område eller et gitter af polygoner), eller tilføj postnr eller kommunekode, og fjern dubletter på id bagefter. Skal du bruge alle adresser i en kommune eller et postnummer, så brug filtrene kommunekode eller postnr i stedet.

Næste skridt

Relaterede guides

Markdown-kilde Fejl i guiden? Skriv til os API-reference (Swagger)

Prøv det med en gratis nøgle

2 000 kald/måned på gratisplanen. Intet kreditkort.

Opret konto →