Skip to content

Note

Click here to download the full example code

GeoAdmin API

===================================

Documentation

Intro in Rest API Real Python

Layers Metadata

This service provides metadata for all the available layers in the GeoAdmin API.

import requests
from pprint import pprint

api_url = "https://api3.geo.admin.ch/rest/services/api/MapServer"
response = requests.get(api_url)
layers = response.json()

pprint(layers.keys())
print(len(layers["layers"]))

Out:

dict_keys(['mapName', 'description', 'copyrightUnicode', 'layers', 'spatialReference', 'tileInfo', 'initialExtent', 'fullExtent', 'units', 'capabilities'])
780

Search Layer by name

search for layer url with text

param = {"searchText": "solar"}
response = requests.get("https://api3.geo.admin.ch/rest/services/api/MapServer?", param)
json = response.json()

name = json["layers"][0]["name"] 
full_name = json["layers"][0]["fullName"] 
link = json["layers"][0]["attributes"]["urlDetails"]

print(f"Name: {name}, \n Voller Name: {full_name} \n link: {link}")

Out:

Name: Solarenergie: Eignung Fassaden, 
 Voller Name: Eignung von Hausfassaden für die Nutzung von Sonnenenergie 
 link: https://www.bfe.admin.ch/solarenergie-eignung-fassaden

Get the egid of building from address

street = 'Stadthausquai'
num = '17'
plz = '8001'
place = 'Zürich'


def feature_id(search_text):
    search_url = "https://api3.geo.admin.ch/rest/services/api/SearchServer?searchText=&origins=address&type=locations"
    search_value = {
    "searchText": search_text,
    }
    r = requests.get(search_url, params=search_value)
    results = r.json()
    pprint(results)

search_txt = f"{street} {num} {place} {plz}"
param = {"searchText": search_txt}


response = requests.get("https://api3.geo.admin.ch/rest/services/api/SearchServer?&origins=address&type=locations", param)
json = response.json()

detail = json["results"][0]["attrs"]["detail"]
featureid = json["results"][0]["attrs"]["featureId"]

print(f"{detail} \n {featureid}")

pprint(json)

Out:

stadthausquai 17 8001 zuerich 261 zuerich ch zh 
 140877_0
{'results': [{'attrs': {'detail': 'stadthausquai 17 8001 zuerich 261 zuerich '
                                  'ch zh',
                        'featureId': '140877_0',
                        'geom_quadindex': '030003300013231013332',
                        'geom_st_box2d': 'BOX(683305.2009999999 '
                                         '247082.66899999787,683305.2009999999 '
                                         '247082.66899999787)',
                        'label': 'Stadthausquai 17 <b>8001 Zürich</b>',
                        'lat': 47.369319915771484,
                        'lon': 8.541560173034668,
                        'num': 17,
                        'objectclass': '',
                        'origin': 'address',
                        'rank': 7,
                        'x': 247082.671875,
                        'y': 683305.1875,
                        'zoomlevel': 10},
              'id': 2116031,
              'weight': 4}]}

Height from coordinates

docs height

url = "https://api3.geo.admin.ch/rest/services/height"
params = {
    "easting": 2600000,
    "northing": 1200000
          }
response = requests.get(url, params)
json = response.json()
print(json)

Out:

{'height': '553.6'}

gebaeude_wohnungs_register

url = f"https://api3.geo.admin.ch/rest/services/ech/MapServer/ch.bfs.gebaeude_wohnungs_register/{featureid}"

response = requests.get(url)
json = response.json()


atr = json["feature"]["attributes"]

dkode = atr["dkode"]
dkodn = atr["dkodn"] 

print(f"{dkode =        }")
print(f"{dkodn =        }")
pprint(json)

Out:

dkode =        2683305.201
dkodn =        1247082.669
{'feature': {'attributes': {'deinr': '17',
                            'dexpdat': '09.03.2023',
                            'dkode': 2683305.201,
                            'dkodn': 1247082.669,
                            'doffadr': 1,
                            'dplz4': 8001,
                            'dplzname': 'Zürich',
                            'dplzz': 0,
                            'edid': '0',
                            'egaid': 100118254,
                            'egid': '140877',
                            'egrid': 'CH327787999175',
                            'esid': 10075941,
                            'ewid': None,
                            'gabbj': None,
                            'ganzwhg': None,
                            'garea': 2272,
                            'gastw': 9,
                            'gazzi': None,
                            'gbauj': 1885,
                            'gbaum': 1,
                            'gbaup': 8011,
                            'gbez': 'Stadthaus',
                            'gdekt': 'ZH',
                            'gebf': 20448,
                            'gebnr': '1841',
                            'genh1': 7580,
                            'genh2': None,
                            'genw1': 7520,
                            'genw2': None,
                            'gexpdat': '09.03.2023',
                            'ggdename': 'Zürich',
                            'ggdenr': 261,
                            'gkat': 1060,
                            'gklas': 1220,
                            'gkode': 2683280.065,
                            'gkodn': 1247074.234,
                            'gksce': 905,
                            'gschutzr': 0,
                            'gstat': 1004,
                            'gvol': 62815,
                            'gvolnorm': 962,
                            'gvolsce': 859,
                            'gwaerdath1': '03.01.2018',
                            'gwaerdath2': '-',
                            'gwaerdatw1': '03.01.2018',
                            'gwaerdatw2': '-',
                            'gwaersceh1': 859,
                            'gwaersceh2': None,
                            'gwaerscew1': 859,
                            'gwaerscew2': None,
                            'gwaerzh1': 7460,
                            'gwaerzh2': None,
                            'gwaerzw1': 7630,
                            'gwaerzw2': None,
                            'label': 'Stadthausquai 17',
                            'lgbkr': 281,
                            'lparz': 'AA5731',
                            'lparzsx': None,
                            'ltyp': None,
                            'plz_plz6': '8001/800100',
                            'strindx': ['Sta'],
                            'strname': ['Stadthausquai'],
                            'strname_deinr': 'Stadthausquai 17',
                            'strnamk': ['Stadthausquai'],
                            'stroffiziel': '1',
                            'strsp': ['DE'],
                            'wabbj': None,
                            'warea': None,
                            'wazim': None,
                            'wbauj': None,
                            'wbez': None,
                            'weinr': None,
                            'wexpdat': None,
                            'whgnr': None,
                            'wkche': None,
                            'wmehrg': None,
                            'wstat': None,
                            'wstwk': None},
             'bbox': [683305.2, 247082.7, 683305.2, 247082.7],
             'featureId': '140877_0',
             'geometry': {'spatialReference': {'wkid': 21781},
                          'x': 683305.2,
                          'y': 247082.7},
             'id': '140877_0',
             'layerBodId': 'ch.bfs.gebaeude_wohnungs_register',
             'layerName': 'GWR: Gebäudestatus'}}

Solardach energie

solarenergie-eignung-daecher

Solardach energie

cordiantes = str(dkode) + "," + str(dkodn)

print(cordiantes)
link = "https://api3.geo.admin.ch/rest/services/all/MapServer/identify"

query = {
    "geometry": cordiantes,
    "geometryFormat": "geojson",
    "geometryType": "esriGeometryPoint",
    "imageDisplay": "1410,620,96",
    "lang": "de",
    "layers": "all:ch.bfe.solarenergie-eignung-daecher",
    "limit": "10",
    "mapExtent": "2683322.444874717,1250605.7978890815,2683674.944874717,1250760.7978890815",
    "returnGeometry": "true",
    "sr": "2056",
    "tolerance": "10"
}

response = requests.get(link, query)
pv_json = response.json()

print(f'How many: {len(pv_json["results"])}')

pprint(pv_json['results'][0]["properties"])

Out:

2683305.201,1247082.669
How many: 2
{'a_param': [0.0151209214,
             -0.0149136051,
             0.0090321821,
             0.0128238572,
             0.0143819344,
             0.1305514852,
             0.3877787688,
             0.4522255903,
             0.3557589657,
             0.0686995703,
             0.0012518123],
 'ausrichtung': -177,
 'b_param': [0.587679668,
             0.6614977069,
             0.5502412637,
             0.5296633994,
             0.4258052525,
             0.3613144388,
             0.6170816083,
             0.6298137043,
             0.6224022149,
             0.5333113988,
             0.5310760443],
 'bedarf_heizung': 1237661,
 'bedarf_warmwasser': 81792,
 'building_id': 1992633,
 'c_param': [0.8526575886,
             0.1911423204,
             1.5201611332,
             2.240268033,
             6.800010165,
             16.2462724583,
             -3.0958350372,
             -4.0721419788,
             -4.675420533,
             3.593378144,
             2.8761759857],
 'datum_aenderung': '2021-11-29T05:43:37',
 'datum_erstellung': '2021-11-29T05:43:37',
 'df_nummer': 105,
 'dg_heizung': 1,
 'dg_waermebedarf': 2,
 'duschgaenge': 65,
 'finanzertrag': 798.2,
 'flaeche': 113.1225298534,
 'flaeche_kollektoren': 113.1225298534,
 'gs_serie_start': '2023-02-01T00:00:00',
 'gstrahlung': 49887,
 'heizgradtage': [505.0,
                  560.0,
                  419.0,
                  210.0,
                  35.0,
                  1.0,
                  0.0,
                  4.0,
                  112.0,
                  208.0,
                  418.0],
 'klasse': 1,
 'klasse_text': 'Gering##Faible##Bassa##Low##Gering',
 'label': 17528405,
 'monate': [2, 1, 11, 10, 9, 8, 7, 6, 5, 4, 3],
 'monats_ertrag': [2.0825521966,
                   1.2446001289,
                   1.6613542419,
                   2.5895618331,
                   3.3593888391,
                   6.2676545785,
                   12.8516502259,
                   12.7525206066,
                   10.385519355,
                   5.2352661939,
                   3.3793176502],
 'mstrahlung': 441,
 'neigung': 54,
 'sb_datum_aenderung': '2018-06-08T12:28:45',
 'sb_datum_erstellung': '2018-06-08T12:22:39',
 'sb_objektart': 1,
 'stromertrag': 7982,
 'volumen_speicher': 7400,
 'waermeertrag': 27449}
from IPython.display import display, HTML, IFrame

feature_ids=[]
for i in pv_json["results"]:
    feature_ids.append(i["featureId"])
print(feature_ids)

Out:

[17528405, 17528404]
import matplotlib.pyplot as plt

klasse = pv_json["results"][0]["properties"]['klasse_text']
finanzertrag = pv_json["results"][0]["properties"]["finanzertrag"]
mstrahlung = pv_json["results"][0]["properties"]["mstrahlung"]
neigung = pv_json["results"][0]["properties"]["neigung"]

fig, ax = plt.subplots()
x = pv_json["results"][0]["properties"]["monate"]
y = pv_json["results"][0]["properties"]["monats_ertrag"]
ax.bar(x, y, )
ax.set_ylabel('fruit supply')
ax.set_title('Fruit supply by kind and color')

print(f"{finanzertrag = }")
print(f"{mstrahlung = }")
print(f"{neigung = }")
print(f"{klasse = }")

plt.show()

Fruit supply by kind and color

Out:

finanzertrag = 798.2
mstrahlung = 441
neigung = 54
klasse = 'Gering##Faible##Bassa##Low##Gering'

Heizgradtage

Heizgradtage werden verwendet, um den jährlichen Heizwärmebedarf auf die Kalendermonate zu verteilen. Die Heizgradtage für einen Monat berechnen sich aus der Differenz zwischen der Raumtemperatur (20°C) und der Tagesmitteltemperatur an Tagen mit einer Tagesmitteltemperatur tiefer als die Heizgrenze (< 12°C).

fig, ax = plt.subplots()

x = pv_json["results"][0]["properties"]["monate"]
y = pv_json["results"][0]["properties"]["heizgradtage"]
ax.bar(x, y, color="red")

ax.set_ylabel('Hours')
ax.set_xlabel('Months')
ax.set_title('heizgradtage')


plt.show()
print(y)

heizgradtage

Out:

[505.0, 560.0, 419.0, 210.0, 35.0, 1.0, 0.0, 4.0, 112.0, 208.0, 418.0]

Total running time of the script: ( 0 minutes 1.382 seconds)

Download Python source code: plott_4_GeoAdmin.py

Download Jupyter notebook: plott_4_GeoAdmin.ipynb

Gallery generated by mkdocs-gallery