{ "cells": [ { "cell_type": "markdown", "id": "8bcfb831-8f42-4b48-9f87-e99e3ea40874", "metadata": {}, "source": [ "# Introduction to Web Feature Service (WFS)\n", "\n", "The Web Feature Service (WFS) is a standard created by the Open Geospatial Consortium (OGC) for creating, modifying and exchanging geospatial data in vector format. A WFS encodes and transfers information in Geography Markup Language (GML) which is a subset of XML. The current version of WFS is 2.0.0, but there are also earlier versions 1.1.0 and 1.0.0 which are also still in use. Although there are some differences between the versions, the syntax between versions often remains the same.\n", "\n" ] }, { "cell_type": "markdown", "id": "59fdb10a-56b0-4138-9ff0-00b807d9107c", "metadata": {}, "source": [ "## Where to find WFS providers?\n", "\n", "\n", "### Global coverage\n", "- [Spatineo Directory](https://directory.spatineo.com/):\n", " - Very useful service to explore WFS providers in different countries. \n", " - You can easily find the WFS endpoint address for each provider.\n", " - Includes information about the stability and quality of the service. \n", "\n", "### European coverage\n", "\n", "- [Inspire Geoportal](https://inspire-geoportal.ec.europa.eu/index.html)\n", " - You can easily explore the Inspire providers.\n", " - Not possible to find WFS endpoint URLs ..(??)\n", "\n", "### Finnish coverage\n", "\n", "- [Avoindata.fi](https://www.avoindata.fi/en)\n", "- [Helsinki Region Infoshare](https://hri.fi/data/en_GB/group/59b85a25-5cf1-4eb8-a0b7-92ffe34efdad?res_format=WFS)\n", "\n", "### Estonian coverage\n", "\n", "- [Estonian Open Data portal](https://avaandmed.eesti.ee/)\n", "\n", "\n" ] }, { "cell_type": "markdown", "id": "ede0ddf5-80ac-412d-a10e-b7264b3695e2", "metadata": {}, "source": [ "## Retreaving data via WFS to geopandas\n", "\n", "To work with OGC APIs in Python, there is a library called [**OWSLib**](https://geopython.github.io/OWSLib/index.html) which works with standards such as [WFS](https://geopython.github.io/OWSLib/usage.html#wfs), [WMS](https://geopython.github.io/OWSLib/usage.html#wms) etc. It supports all (or at least majority) of the functionalities specified in the OGC standards. \n", "\n", "To make things a bit easier to work, there is also an experimental library called `geostream` which is built on top of OWSLib. The [geostream](https://github.com/geostream-org/geostream) library directly converts the data into geopandas GeoDataFrames and overall makes it a bit easier to work with WFS APIs. The library is in the early days of development and still experimental by nature. In the following we will see how it works:" ] }, { "cell_type": "code", "execution_count": 1, "id": "6d676554-09c8-4955-9829-aa28a9444fb2", "metadata": {}, "outputs": [], "source": [ "from geostream import WFS\n", "import geopandas as gpd" ] }, { "cell_type": "code", "execution_count": 2, "id": "301956aa-0bb3-44d2-8618-0dc6b2172d15", "metadata": {}, "outputs": [], "source": [ "endpoint = \"https://inspire.geoportaal.ee/geoserver/TN_teeregister/wfs\"\n", "api = WFS(endpoint)" ] }, { "cell_type": "code", "execution_count": 3, "id": "48c6f167-c030-4793-ac13-69346af9bdd2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Sisaldab Eesti teeregistri teid.'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Via .wfs object we can access all the functionalities provided by OWSLib, such as seeing the abstract description for the WFS\n", "api.wfs.identification.abstract" ] }, { "cell_type": "code", "execution_count": 4, "id": "04173cfd-9e9f-4bc9-8318-31b62001f59a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['TN_teeregister:TN.RoadTransportNetwork.RoadLink_eteed',\n", " 'TN_teeregister:TN.RoadTransportNetwork.FunctionalRoadClass',\n", " 'TN_teeregister:TN.RoadTransportNetwork.NumberOfLanes',\n", " 'TN_teeregister:TN.RoadTransportNetwork.Road',\n", " 'TN_teeregister:TN.RoadTransportNetwork.RoadSurfaceCategory',\n", " 'TN_teeregister:TN.RoadTransportNetwork.Roadwidth',\n", " 'TN_teeregister:TN.RoadTransportNetwork.RoadLink']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "layers = api.get_layers()\n", "layers" ] }, { "cell_type": "code", "execution_count": 5, "id": "0f2c272a-af28-4578-bd02-4b11afae58f3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'crsOptions': [urn:ogc:def:crs:EPSG::3301],\n", " 'boundingBox': (23.41994981394858,\n", " 57.55461990262201,\n", " 28.208216378676774,\n", " 59.478274255322894,\n", " urn:ogc:def:crs:EPSG::3301),\n", " 'boundingBoxWGS84': (20.776261739109742,\n", " 6.571349317973539,\n", " 20.776291969635007,\n", " 6.571363185346309),\n", " 'title': 'Eesti teeregister (E-teed)',\n", " 'id': 'TN_teeregister:TN.RoadTransportNetwork.RoadLink_eteed',\n", " 'crs_code': 3301,\n", " 'abstract': 'Sisaldab Eesti teeregister rahvusvahelisi teid.',\n", " 'keywords': [None],\n", " 'styles': None}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "api.get_layer_info(layers[0])" ] }, { "cell_type": "code", "execution_count": 6, "id": "e50ac94b-7139-4048-8313-1cb5335c27c2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'TN_teeregister:TN.RoadTransportNetwork.Road'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Pick one of the layers\n", "layer_id = layers[3]\n", "layer_id" ] }, { "cell_type": "markdown", "id": "f2b461c5-13b1-43ab-9b85-507c58570509", "metadata": {}, "source": [ "### Extract data from specific area based on a bounding box\n", "\n", "WFS supports limiting the data request based on bounding box. The `geostream` library provides some useful functionalities to extract geographic extent Polygons for any part of the world based on OpenStreetMap. In the following, we will use the tool to download the boundaries for Tallinn using the `.get_gdf_from_place()` method which returns the boundaries as an output:" ] }, { "cell_type": "code", "execution_count": 7, "id": "8750bb36-bfcd-4ec3-a453-5ac9c710386c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/hentenka/.conda/envs/mamba/envs/python-gis-book/lib/python3.9/site-packages/osmnx/geocoder.py:110: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", " gdf = gdf.append(_geocode_query_to_gdf(q, wr, by_osmid))\n" ] }, { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get the area of interest as GeoDataFrame\n", "tallinn = api.get_gdf_from_place(\"Tallinn\")\n", "tallinn.explore()" ] }, { "cell_type": "markdown", "id": "1754edc1-4b1a-4d49-9f93-64f400abb337", "metadata": {}, "source": [ "### Download the data based on bounding box\n", "\n", "After we have retrieved the extent for our request, we can easily **download the data** using the `.load_wfs()` method which takes the layer_id as input and the `bounding_box` as another parameter. The tool automatically creates the WFS call request and returns the data only for the chosen area of interest:" ] }, { "cell_type": "code", "execution_count": 8, "id": "a49b75c8-3fbc-4a44-8d38-13debee93a3e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "======================================\n", "Downloading data for: TN_teeregister:TN.RoadTransportNetwork.Road\n", "======================================\n", "\n" ] } ], "source": [ "# Load data for given layer_id via WFS\n", "data = api.load_wfs(layer_id, bounding_box=tallinn)" ] }, { "cell_type": "code", "execution_count": 9, "id": "8283fb7b-d589-42ed-b956-96124da600e2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idgml_idgml_metadataproperty_xlink_hrefgml_metadataproperty_xlink_titlegml_original_coordinate_systemgml_parent_propertygml_descriptioninspireid_identifier_localidinspireid_identifier_namespacebeginlifespanversionnationalroadcodegeographicalname_geographicalname_languagegeographicalname_geographicalname_spelling_spellingofname_textxml_ns_urigeometry
0TN.RoadTransportNetwork.Road.tee_6206830tee_6206830https://metadata.geoportaal.ee/geonetwork/srv/...Eesti teeregisterhttp://www.opengis.net/def/crs/EPSG/0/3301featureMemberLast update:2023-01-23tee_6206830ee.transpordiamet.tn.teeregister-teed2020-11-091980663estSalu põikhttp://inspire.ec.europa.eu/schemas/tn-ro/4.0LINESTRING (531689.240 6588344.611, 531731.610...
1TN.RoadTransportNetwork.Road.tee_6865295tee_6865295https://metadata.geoportaal.ee/geonetwork/srv/...Eesti teeregisterhttp://www.opengis.net/def/crs/EPSG/0/3301featureMemberLast update:2023-01-23tee_6865295ee.transpordiamet.tn.teeregister-teed2020-12-182451893estKopra teehttp://inspire.ec.europa.eu/schemas/tn-ro/4.0LINESTRING (551561.940 6591713.542, 551547.010...
2TN.RoadTransportNetwork.Road.tee_40351tee_40351https://metadata.geoportaal.ee/geonetwork/srv/...Eesti teeregisterhttp://www.opengis.net/def/crs/EPSG/0/3301featureMemberLast update:2023-01-23tee_40351ee.transpordiamet.tn.teeregister-teed2021-09-247841203estLaagna teehttp://inspire.ec.europa.eu/schemas/tn-ro/4.0LINESTRING (544279.138 6588124.715, 544282.156...
3TN.RoadTransportNetwork.Road.tee_7001773tee_7001773https://metadata.geoportaal.ee/geonetwork/srv/...Eesti teeregisterhttp://www.opengis.net/def/crs/EPSG/0/3301featureMemberLast update:2023-01-23tee_7001773ee.transpordiamet.tn.teeregister-teed2021-03-181982736estKünka teehttp://inspire.ec.europa.eu/schemas/tn-ro/4.0LINESTRING (533661.199 6588468.106, 533633.977...
4TN.RoadTransportNetwork.Road.tee_6416tee_6416https://metadata.geoportaal.ee/geonetwork/srv/...Eesti teeregisterhttp://www.opengis.net/def/crs/EPSG/0/3301featureMemberLast update:2023-01-23tee_6416ee.transpordiamet.tn.teeregister-teed2021-09-287844298estMustamäe - Tee 26http://inspire.ec.europa.eu/schemas/tn-ro/4.0LINESTRING (537908.806 6585656.426, 537989.845...
\n", "
" ], "text/plain": [ " id gml_id \\\n", "0 TN.RoadTransportNetwork.Road.tee_6206830 tee_6206830 \n", "1 TN.RoadTransportNetwork.Road.tee_6865295 tee_6865295 \n", "2 TN.RoadTransportNetwork.Road.tee_40351 tee_40351 \n", "3 TN.RoadTransportNetwork.Road.tee_7001773 tee_7001773 \n", "4 TN.RoadTransportNetwork.Road.tee_6416 tee_6416 \n", "\n", " gml_metadataproperty_xlink_href \\\n", "0 https://metadata.geoportaal.ee/geonetwork/srv/... \n", "1 https://metadata.geoportaal.ee/geonetwork/srv/... \n", "2 https://metadata.geoportaal.ee/geonetwork/srv/... \n", "3 https://metadata.geoportaal.ee/geonetwork/srv/... \n", "4 https://metadata.geoportaal.ee/geonetwork/srv/... \n", "\n", " gml_metadataproperty_xlink_title \\\n", "0 Eesti teeregister \n", "1 Eesti teeregister \n", "2 Eesti teeregister \n", "3 Eesti teeregister \n", "4 Eesti teeregister \n", "\n", " gml_original_coordinate_system gml_parent_property \\\n", "0 http://www.opengis.net/def/crs/EPSG/0/3301 featureMember \n", "1 http://www.opengis.net/def/crs/EPSG/0/3301 featureMember \n", "2 http://www.opengis.net/def/crs/EPSG/0/3301 featureMember \n", "3 http://www.opengis.net/def/crs/EPSG/0/3301 featureMember \n", "4 http://www.opengis.net/def/crs/EPSG/0/3301 featureMember \n", "\n", " gml_description inspireid_identifier_localid \\\n", "0 Last update:2023-01-23 tee_6206830 \n", "1 Last update:2023-01-23 tee_6865295 \n", "2 Last update:2023-01-23 tee_40351 \n", "3 Last update:2023-01-23 tee_7001773 \n", "4 Last update:2023-01-23 tee_6416 \n", "\n", " inspireid_identifier_namespace beginlifespanversion \\\n", "0 ee.transpordiamet.tn.teeregister-teed 2020-11-09 \n", "1 ee.transpordiamet.tn.teeregister-teed 2020-12-18 \n", "2 ee.transpordiamet.tn.teeregister-teed 2021-09-24 \n", "3 ee.transpordiamet.tn.teeregister-teed 2021-03-18 \n", "4 ee.transpordiamet.tn.teeregister-teed 2021-09-28 \n", "\n", " nationalroadcode geographicalname_geographicalname_language \\\n", "0 1980663 est \n", "1 2451893 est \n", "2 7841203 est \n", "3 1982736 est \n", "4 7844298 est \n", "\n", " geographicalname_geographicalname_spelling_spellingofname_text \\\n", "0 Salu põik \n", "1 Kopra tee \n", "2 Laagna tee \n", "3 Künka tee \n", "4 Mustamäe - Tee 26 \n", "\n", " xml_ns_uri \\\n", "0 http://inspire.ec.europa.eu/schemas/tn-ro/4.0 \n", "1 http://inspire.ec.europa.eu/schemas/tn-ro/4.0 \n", "2 http://inspire.ec.europa.eu/schemas/tn-ro/4.0 \n", "3 http://inspire.ec.europa.eu/schemas/tn-ro/4.0 \n", "4 http://inspire.ec.europa.eu/schemas/tn-ro/4.0 \n", "\n", " geometry \n", "0 LINESTRING (531689.240 6588344.611, 531731.610... \n", "1 LINESTRING (551561.940 6591713.542, 551547.010... \n", "2 LINESTRING (544279.138 6588124.715, 544282.156... \n", "3 LINESTRING (533661.199 6588468.106, 533633.977... \n", "4 LINESTRING (537908.806 6585656.426, 537989.845... " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Show the first rows\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 10, "id": "db1f0a6f-60ca-4517-bbef-0bd166b80242", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Plot the data as a static map\n", "data.plot()" ] }, { "cell_type": "code", "execution_count": 11, "id": "85648529-48a7-467e-8c7a-baccf480363b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Explore the data on an interactive map\n", "data[[\"id\", \"geometry\"]].explore()" ] }, { "cell_type": "code", "execution_count": 12, "id": "1d4422da-0697-46d4-8b54-c0dd6567e384", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Ensure that the Tallinn boundary is in the same CRS\n", "tallinn = tallinn.to_crs(crs=data.crs)\n", "\n", "# Limit the data to only areas within the extent of Tallinn\n", "selected = gpd.sjoin(data, tallinn[[\"geometry\"]], predicate=\"within\")\n", "\n", "# One of the data types is in datetime format which does not work well with folium..\n", "selected[\"beginlifespanversion\"] = selected[\"beginlifespanversion\"].astype(str)\n", "\n", "# Look on the map\n", "selected.explore()" ] }, { "cell_type": "markdown", "id": "7badbdb8-e66d-419a-816d-7f23ec8ce1b3", "metadata": {}, "source": [ "### Data for Helsinki\n", "\n", "In the following example, we download some building data from Helsinki Region." ] }, { "cell_type": "code", "execution_count": 34, "id": "5d86a532-fdcb-4bfc-924f-ff35c9d50a2a", "metadata": {}, "outputs": [], "source": [ "from geostream import WFS\n", "\n", "# Endpoint for WFS API of the City of Helsinki\n", "endpoint = \"https://kartta.hel.fi/ws/geoserver/avoindata/wfs\"\n", "\n", "# Initialize WFS reader\n", "api = WFS(endpoint, version=\"2.0.0\")\n", "\n", "# See all available layers\n", "layers = api.get_layers()" ] }, { "cell_type": "code", "execution_count": 17, "id": "1c318a12-0db2-4ed2-a387-022aae3fad7c", "metadata": {}, "outputs": [], "source": [ "# Check all layers (uncomment)\n", "# layers" ] }, { "cell_type": "code", "execution_count": 18, "id": "ee5ed2e3-3e68-444d-82b7-a8782f6ab59a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'crsOptions': [urn:ogc:def:crs:EPSG::3879,\n", " urn:ogc:def:crs:EPSG::3067,\n", " urn:ogc:def:crs:EPSG::4326,\n", " urn:ogc:def:crs:EPSG::3857],\n", " 'boundingBox': (24.764732945863038,\n", " 59.90927898645569,\n", " 25.289558715996222,\n", " 60.322459856333225,\n", " urn:ogc:def:crs:EPSG::4326),\n", " 'boundingBoxWGS84': (24.764732945863038,\n", " 59.90927898645569,\n", " 25.289558715996222,\n", " 60.322459856333225),\n", " 'title': 'Rakennukset_alue',\n", " 'id': 'avoindata:Rakennukset_alue',\n", " 'crs_code': 3879,\n", " 'abstract': 'Helsingin rakennukset paikkatietoaineisto perustuu kantakartan rakennuskohteisiin, jotka ovat geometrialtaan alueita (polygon). Aineistossa on mukana kaikki kantakartan aluemaiset kohteet.',\n", " 'keywords': [],\n", " 'styles': None}" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Define the layer name (based on the list from previous api.get_layers() command)\n", "layer_id = 'avoindata:Rakennukset_alue'\n", "\n", "# Find info for specific layer\n", "api.get_layer_info(layer_id)" ] }, { "cell_type": "code", "execution_count": 35, "id": "53d18bf7-c3be-43e5-a580-fecc201b88c2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/hentenka/.conda/envs/mamba/envs/python-gis-book/lib/python3.9/site-packages/osmnx/geocoder.py:110: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n", " gdf = gdf.append(_geocode_query_to_gdf(q, wr, by_osmid))\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "======================================\n", "Downloading data for: avoindata:Rakennukset_alue\n", "======================================\n", "\n" ] } ], "source": [ "# Download a GeoDataFrame with Kamppi district as the extent\n", "extent = api.get_gdf_from_place(\"Kamppi, Helsinki\")\n", "\n", "# Download the data into GeoDataFrame from the given area\n", "data = api.load_wfs(layer_id=layer_id, bounding_box=extent)" ] }, { "cell_type": "code", "execution_count": 36, "id": "f8b01c25-6ded-49f4-af32-9da39cff1f38", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idkuntarekisteri_idratuvtj_prtratu_vastaavuusratu_vastaavuus_koodiratu_laaturatu_laatu_kooditilatila_koodi...tyyppi_koodiluontipvmmuokkauspvmkatunimi_suomikatunimi_ruotsiosoitenumeropostinumerodatanomistajapaivitetty_tietopalveluungeometry
0739911405.0405.010304617881/1 = 1 geometria / 1 RATU1määritelty luotettavasti1voimassa2...22012-06-092012-09-19Asema-aukioStationsplatsen200100Helsinki/Kami2023-01-24POLYGON ((25496555.653 6673103.544, 25496554.5...
1739940401.0401.010304617661/1 = 1 geometria / 1 RATU1määritelty luotettavasti1voimassa2...62012-06-092012-09-19MikonkatuMikaelsgatan1000100Helsinki/Kami2023-01-24POLYGON ((25496883.768 6673042.832, 25496883.7...
2739779406.0406.0103046180A1/1 = 1 geometria / 1 RATU1määritelty luotettavasti1voimassa2...62014-02-132014-03-11MannerheiminaukioMannerheimplatsen100100Helsinki/Kami2023-01-24POLYGON ((25496556.798 6673232.594, 25496556.8...
3740139396.0396.0103046168X1/1 = 1 geometria / 1 RATU1määritelty luotettavasti1voimassa2...22013-04-192015-05-05KeskuskatuCentralgatan600100Helsinki/Kami2023-01-24POLYGON ((25496813.564 6672987.661, 25496750.0...
4739801588.0588.0103056015K1/1 = 1 geometria / 1 RATU1määritelty luotettavasti1voimassa2...22013-08-302015-05-05MannerheimintieMannerheimvägen2000100Helsinki/Kami2023-01-24POLYGON ((25496515.052 6672882.406, 25496516.1...
\n", "

5 rows × 21 columns

\n", "
" ], "text/plain": [ " id kuntarekisteri_id ratu vtj_prt ratu_vastaavuus \\\n", "0 739911 405.0 405.0 1030461788 1/1 = 1 geometria / 1 RATU \n", "1 739940 401.0 401.0 1030461766 1/1 = 1 geometria / 1 RATU \n", "2 739779 406.0 406.0 103046180A 1/1 = 1 geometria / 1 RATU \n", "3 740139 396.0 396.0 103046168X 1/1 = 1 geometria / 1 RATU \n", "4 739801 588.0 588.0 103056015K 1/1 = 1 geometria / 1 RATU \n", "\n", " ratu_vastaavuus_koodi ratu_laatu ratu_laatu_koodi \\\n", "0 1 määritelty luotettavasti 1 \n", "1 1 määritelty luotettavasti 1 \n", "2 1 määritelty luotettavasti 1 \n", "3 1 määritelty luotettavasti 1 \n", "4 1 määritelty luotettavasti 1 \n", "\n", " tila tila_koodi ... tyyppi_koodi luontipvm muokkauspvm \\\n", "0 voimassa 2 ... 2 2012-06-09 2012-09-19 \n", "1 voimassa 2 ... 6 2012-06-09 2012-09-19 \n", "2 voimassa 2 ... 6 2014-02-13 2014-03-11 \n", "3 voimassa 2 ... 2 2013-04-19 2015-05-05 \n", "4 voimassa 2 ... 2 2013-08-30 2015-05-05 \n", "\n", " katunimi_suomi katunimi_ruotsi osoitenumero postinumero \\\n", "0 Asema-aukio Stationsplatsen 2 00100 \n", "1 Mikonkatu Mikaelsgatan 10 00100 \n", "2 Mannerheiminaukio Mannerheimplatsen 1 00100 \n", "3 Keskuskatu Centralgatan 6 00100 \n", "4 Mannerheimintie Mannerheimvägen 20 00100 \n", "\n", " datanomistaja paivitetty_tietopalveluun \\\n", "0 Helsinki/Kami 2023-01-24 \n", "1 Helsinki/Kami 2023-01-24 \n", "2 Helsinki/Kami 2023-01-24 \n", "3 Helsinki/Kami 2023-01-24 \n", "4 Helsinki/Kami 2023-01-24 \n", "\n", " geometry \n", "0 POLYGON ((25496555.653 6673103.544, 25496554.5... \n", "1 POLYGON ((25496883.768 6673042.832, 25496883.7... \n", "2 POLYGON ((25496556.798 6673232.594, 25496556.8... \n", "3 POLYGON ((25496813.564 6672987.661, 25496750.0... \n", "4 POLYGON ((25496515.052 6672882.406, 25496516.1... \n", "\n", "[5 rows x 21 columns]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Show first rows\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 37, "id": "afb71731-1458-4af3-84af-acf8e4b83b13", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Make this Notebook Trusted to load map: File -> Trust Notebook
" ], "text/plain": [ "" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Explore the data on a map\n", "data.explore()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }