Screenshots
Clicking on a property in the map will show the matrikkelen information for the first hit of the properties around the clicked point.
|
|
|
|
Using Karverket's Eiendom API v1
The Eiendom API offers basic Eiendomsinformasjon, property information. A Swagger page and the endpoint of the API is available here:https://api.kartverket.no/eiendom/v1/ The service, that is a client to contact and retrieved the Eiendomsinformation for a given point that uses the
/punkt API method is shown below.
Please note that the json naming dictates we must set the Property naming policy to camelCase, as we can see from the JsonProperty naming convention used further down in the
Json POCO classes shown in KartverketResponse.cs code snippet.
KartverketService.cs
using System.Globalization;
using System.Net.Http.Json;
using System.Text.Json;
namespace MauiMapAppDemo.Services
{
public class KartverketService
{
private const string _apiKartverketEiendomV1BaseUrl = "https://api.kartverket.no/eiendom/v1/";
private readonly HttpClient _httpClient = new HttpClient
{
BaseAddress = new Uri(_apiKartverketEiendomV1BaseUrl)
};
/// <summary>
/// Retrieves matrikkel informasjon from given point (Punkt) from Kartverket's Eiendom API v1
/// </summary>
/// <param name="latitude">Latitude</param>
/// <param name="longitude">Longitude</param>
/// <param name="koordSys">Defaulting here to EUREF89 = 4258 as the coordinate system id, which Kartverket uses and is also what Google maps coords are using</param>
/// <returns></returns>
public async Task<KartverketPunktResponse?> GetMatrikkelInformationFromLocationAsync(double latitude, double longitude, int koordSys = 4258)
{
string url = $"punkt?ost={longitude.ToString(CultureInfo.InvariantCulture)}&nord={latitude.ToString(CultureInfo.InvariantCulture)}&koordsys={koordSys}&radius=10&utkoordsys={koordSys}&treffPerSide=1&side=1";
var kartverketResponseForLocation = await _httpClient.GetFromJsonAsync<KartverketPunktResponse>(url, options: new System.Text.Json.JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
return kartverketResponseForLocation;
}
}
}
About the choice of EUREF 89 = 4258 as the default coordinate system in the call above. Google maps uses actually WGS 84 which is EPSG coordinate system id 4326, but the difference is less than a meter. Since a 10 meter radius of the clicked point is used, we pass in the clicked Location point's latitude and longitude to the north and east parameters in the url call above in the KartverketService.cs sample code shown, with a given radius of 10 and although we get a result of multiple hits within the 10 meter radius, the first if any of properties or parcels found is returned from the service, by setting the side and treffPerSide parameters.
🌍 What are EUREF89 and EPSG?
🗺️ EUREF89 is a geographic coordinate reference system used across Europe, including by Kartverket in Norway. It defines how latitude and longitude positions are represented on the Earth's surface.
🔢 EPSG:4258 is the unique identifier for the EUREF89 coordinate system. EPSG codes are standardized reference numbers that mapping software, APIs, and GIS tools use to identify coordinate systems.
📍 In this project, coordinates are obtained from Google Maps and sent to Kartverket's Eiendom API v1 using EUREF89 (EPSG:4258). Using the same coordinate reference system helps ensure accurate property lookups in the Norwegian Matrikkel.
🏠 The result is that a location selected on the map can be translated directly into property and cadastral information from Kartverket.
The following Json classes will map the returned Json data from the service to objects. To create these classes, I just copied example output response from the API method/punkt and used Paste Special => Paste Json as classes in VS 2026.
KartverketPunktResponse.cs
using System.Text;
using System.Text.Json.Serialization;
namespace MauiMapAppDemo.Services
{
public class KartverketPunktResponse
{
[JsonPropertyName("eiendom")]
public List<Punkt>? Eiendom { get; set; }
[JsonPropertyName("metadata")]
public Metadata? Metadata { get; set; }
}
public class Metadata
{
[JsonPropertyName("side")]
public int Side { get; set; }
[JsonPropertyName("sokeStreng")]
public string? SokeStreng { get; set; }
[JsonPropertyName("totaltAntallTreff")]
public int TotaltAntallTreff { get; set; }
[JsonPropertyName("treffPerSide")]
public int TreffPerSide { get; set; }
[JsonPropertyName("viserFra")]
public int ViserFra { get; set; }
[JsonPropertyName("viserTil")]
public int ViserTil { get; set; }
}
public class Punkt
{
[JsonPropertyName("bruksnummer")]
public int Bruksnummer { get; set; }
[JsonPropertyName("festenummer")]
public int Festenummer { get; set; }
[JsonPropertyName("gardsnummer")]
public int Gardsnummer { get; set; }
[JsonPropertyName("hovedområde")]
public bool HovedOmrade { get; set; }
[JsonPropertyName("kommunenummer")]
public string? Kommunenummer { get; set; }
[JsonPropertyName("lokalid")]
public int Lokalid { get; set; }
[JsonPropertyName("matrikkelnummertekst")]
public string? Matrikkelnummertekst { get; set; }
[JsonPropertyName("meterFraPunkt")]
public int MeterFraPunkt { get; set; }
[JsonPropertyName("nøyaktighetsklasseteig")]
public string? Noyaktighetsklasseteig { get; set; }
[JsonPropertyName("objekttype")]
public string? Objekttype { get; set; }
[JsonPropertyName("oppdateringsdato")]
public DateTime? Oppdateringsdato { get; set; }
[JsonPropertyName("representasjonspunkt")]
public Representasjonspunkt? Representasjonspunkt { get; set; }
[JsonPropertyName("seksjonsnummer")]
public int Seksjonsnummer { get; set; }
[JsonPropertyName("teigmedflerematrikkelenheter")]
public bool Teigmedflerematrikkelenheter { get; set; }
[JsonPropertyName("uregistrertjordsameie")]
public bool Uregistrertjordsameie { get; set; }
public string FullstendigMatrikkelNummer
{
get
{
var sb = new StringBuilder();
if (!string.IsNullOrWhiteSpace(Kommunenummer))
{
sb.Append(Kommunenummer?.ToString().PadLeft(4, '0'));
}
if (Gardsnummer > 0)
{
sb.Append("/" + Gardsnummer);
}
if (Bruksnummer > 0)
{
sb.Append("/" + Bruksnummer);
}
if (Festenummer > 0)
{
sb.Append("/" + Festenummer);
}
if (Seksjonsnummer > 0)
{
sb.Append("/" + Seksjonsnummer);
}
return sb.ToString();
}
}
}
public class Representasjonspunkt
{
[JsonPropertyName("koordsys")]
public int Koordsys { get; set; }
[JsonPropertyName("nord")]
public double Nord { get; set; }
[JsonPropertyName("øst")]
public double Ost { get; set; }
}
}
Groundwork on the parts of property information for Fullstendig matrikkelnummer
🏠 Components of a Full Matrikkel Number
| Icon | Component | Abbreviation | Example | Description |
|---|---|---|---|---|
| 🏛️ | Municipality Number | Knr. | 5001 | Identifies the municipality where the property is located. An overview of Kommunenummer can be seen here : https://www.kartverket.no/til-lands/fakta-om-norge/norske-fylke-og-kommunar |
| 🌾 | Farm Number - Gårdnummer / Gardsnummer | Gnr. | 138 | Identifies the original farm or cadastral area within the municipality. |
| 🏠 | Usage Number / Bruksnummer | Bnr. | 4515 | Identifies a specific property or parcel within a farm number. |
| 📜 | Leasehold Number / Festenummer | Fnr. | 7 | Used when the property is a leased parcel of land (festetomt). The festetomt / lease agreements typically lasts very long, in the area of 80-100 years typically and can be renewed. |
| 🏢 | Section Number | Snr. | 12 | Identifies a specific section or apartment within a sectioned property. |
📋 Example
5001 / 138 / 4515 / 7 / 12
| Value | Meaning |
|---|---|
| 🏛️ 5001 | Municipality Number |
| 🌾 138 | Farm Number (Gårdsnummer) |
| 🏠 4515 | Usage Number (Bruksnummer) |
| 📜 7 | Leasehold Number (Festenummer) |
| 🏢 12 | Section Number (Seksjonsnummer) |
💡 A full matrikkel number is built in the following order:
🏛️ Municipality Number → 🌾 Farm Number → 🏠 Usage Number → 📜 Leasehold Number → 🏢 Section Number