Skip to content

Instantly share code, notes, and snippets.

@arbakker
Last active May 18, 2022 11:44
Show Gist options
  • Save arbakker/d519e3f178afa0411958876e7957afdc to your computer and use it in GitHub Desktop.
Save arbakker/d519e3f178afa0411958876e7957afdc to your computer and use it in GitHub Desktop.
Minimal self-contained docker-compose WFS example with lighttpd and pdok/mapserver docker containers #mapserver #pdok #docker-compose #minimal

README

Minimal self-contained WFS docker-compose example with lighttpd and pdok/mapserver docker containers containing all data and config required to spin up OGC WFS services.

Example exposes following accespoints:

Spin up with:

docker-compose up
version: "3.9"
services:
reverse-proxy:
tty: true
ports:
- "80:80"
image: sebp/lighttpd
environment:
LIGHTTPD_CONFIG: |-
server.modules = (
"mod_proxy",
"mod_setenv"
)
server.username = "lighttpd"
server.groupname = "lighttpd"
server.pid-file = "/run/lighttpd.pid"
server.document-root = "/var/www"
server.errorlog = "/dev/pts/0"
$$HTTP["host"] =~ "localhost" {
$$HTTP["url"] =~ "^/wfs-id.*" {
proxy.server = ( "" =>
((
"host" => "wfs-id",
"port" => 80
))
)
}
$$HTTP["url"] =~ "^/wfs-no-id.*" {
proxy.server = ( "" =>
((
"host" => "wfs-no-id",
"port" => 80
))
)
}
}
setenv.add-response-header = (
"Access-Control-Allow-Origin" => "*",
"Access-Control-Allow-Headers" => "accept, origin, x-requested-with, content-type, x-transmission-session-id",
"Access-Control-Expose-Headers" => "X-Transmission-Session-Id",
"Access-Control-Allow-Methods" => "GET, POST, OPTIONS"
)
depends_on:
- wfs-id
- wfs-no-id
command: >
/bin/ash -cx "echo $${LIGHTTPD_CONFIG} > /etc/lighttpd/lighttpd.conf && /usr/local/bin/start.sh"
wfs-id:
tty: true
image: pdok/mapserver
environment:
MS_MAPFILE: /srv/service.map
JSON: |
{"type":"FeatureCollection","name":"bagterugmeldingen","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::28992"}},"features":[{"type":"Feature","properties":{"meldingsnummer_volledig":"BAG00020575","tijdstip_registratie":"2018-02-05T10:26:04.954","status":"Nieuw","omschrijving":"!!!!!! Hier moeten nog vier boompjes staan !!!!","bronhoudercode":"DE01","bronhoudernaam":"Deventer","tijdstip_statuswijziging":"2018-02-07T12:49:01.044","toelichting":"","puuid":"3f619499-b46e-4406-8334-4330384a8829","fuuid":"bagterugmeldingen.3f619499-b46e-4406-8334-4330384a8829"},"geometry":{"type":"Point","coordinates":[205637.975,475791.40500000002794]}}]}
MAPFILE: |
MAP
NAME "" # empty so ETF geonovum test doesn't try to test it
CONFIG "MS_ERRORFILE" "stderr"
EXTENT 10000 250000 280000 625000
UNITS meters
STATUS ON
#DEBUG 5
PROJECTION
"init=epsg:28992"
END
WEB
METADATA
"ows_enable_request" "*"
"ows_fees" "NONE"
"ows_contactorganization" "PDOK"
"ows_schemas_location" "http://schemas.opengis.net"
"ows_service_onlineresource" "http://localhost/wfs-id/?service=WFS"
"ows_contactperson" "KlantContactCenter PDOK"
"ows_contactposition" "pointOfContact"
"ows_contactvoicetelephone" ""
"ows_contactfacsimiletelephone" ""
"ows_addresstype" "Work"
"ows_address" ""
"ows_city" "Apeldoorn"
"ows_stateorprovince" ""
"ows_postcode" ""
"ows_country" "Nederland"
"ows_contactelectronicmailaddress" "[email protected]"
"ows_hoursofservice" ""
"ows_contactinstructions" "https://www.pdok.nl/contact"
"ows_role" ""
"ows_srs" "EPSG:28992 EPSG:25831 EPSG:25832 EPSG:3034 EPSG:3035 EPSG:3857 EPSG:4258 EPSG:4326"
"ows_accessconstraints" "otherRestrictions;http://creativecommons.org/publicdomain/mark/1.0/deed.nl;Geen beperkingen"
END
END
OUTPUTFORMAT
NAME "GEOJSON" # format name (visible as format in the 1.0.0 capabilities)
DRIVER "OGR/GEOJSON"
MIMETYPE "application/json; subtype=geojson"
FORMATOPTION "STORAGE=stream"
FORMATOPTION "FORM=SIMPLE"
FORMATOPTION "USE_FEATUREID=true"
FORMATOPTION "LCO:ID_FIELD=fuuid"
FORMATOPTION "LCO:ID_TYPE=STRING"
END
OUTPUTFORMAT
NAME "JSON"
DRIVER "OGR/GEOJSON"
MIMETYPE "application/json"
FORMATOPTION "STORAGE=stream"
FORMATOPTION "FORM=SIMPLE"
FORMATOPTION "USE_FEATUREID=true"
FORMATOPTION "LCO:ID_FIELD=fuuid"
FORMATOPTION "LCO:ID_TYPE=STRING"
END
OUTPUTFORMAT
NAME "XML"
DRIVER "OGR/GML"
MIMETYPE "text/xml"
FORMATOPTION "STORAGE=stream"
FORMATOPTION "FORM=SIMPLE"
FORMATOPTION "USE_FEATUREID=true"
END
OUTPUTFORMAT
NAME "GML3"
DRIVER "OGR/GML"
MIMETYPE "text/xml; subtype=gml/3.1.1"
FORMATOPTION "STORAGE=stream"
FORMATOPTION "FORM=SIMPLE"
FORMATOPTION "USE_FEATUREID=true"
END
WEB
METADATA
"ows_title" "BAG Terugmeldingen WFS"
"ows_abstract" "De BAG terugmeldingenservice bevat recente meldingen op informatie uit de Basisregistratie Adressen en Gebouwen (BAG) waarover twijfel bestaat. De service toont de locatie, inhoud en status van de meldingen. Ook een vermoedelijke fout geconstateerd? Doe een melding op https://bagviewer.kadaster.nl/ of https://verbeterdekaart.kadaster.nl"
"ows_keywordlist" "Basisregistratie Adressen en Gebouwen,BAG,terugmeldingen,gebouw,adres,pand,in onderzoek register,verbeter de kaart,bagviewer"
"wfs_languages" "eng" #first default, values according ISO 639-2/B
"wfs_extent" "10000 250000 280000 625000"
"wfs_namespace_prefix" "bag"
"wfs_namespace_uri" "http://bag.geonovum.nl"
"wfs_onlineresource" "http://localhost/wfs-id"
"wfs_getfeature_formatlist" "GEOJSON,JSON,XML,GML3" # List of earlier defined outputformat names
"wfs_maxfeatures" "1000" # Limit the number of features in a single response for obvious preformance reasons, paging can be used.
"wfs_maxfeatures_ignore_for_resulttype_hits" "true"
"wfs_storedqueries" "urn:x-inspire:storedQuery:bag:FullDataset"
"wfs_urn:x-inspire:storedQuery:bag:FullDataset_filedef" "/srv/data/config/storedquery_fulldataset.xml"
"wfs_inspire_metadataurl_href" "https://www.nationaalgeoregister.nl/geonetwork/srv/dut/csw?service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&elementsetname=full&id=43a1bbb9-345a-4959-8095-227ce295401a"
"wfs_inspire_metadataurl_format" "application/vnd.ogc.csw.GetRecordByIdResponse_xml"
"wfs_inspire_capabilities" "url"
"wfs_inspire_dsid_code" "https://www.nationaalgeoregister.nl/geonetwork/srv/dut/csw?service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&elementsetname=full&id=#MD_DataIdentification"
END
END
LAYER
STATUS ON
NAME "bagterugmeldingen"
CONNECTIONTYPE OGR
CONNECTION "/srv/terugmeldingen.json"
DATA "bagterugmeldingen"
TYPE POINT
PROJECTION
"init=epsg:28992" # Define the source projection to enable repojection
END TEMPLATE void
METADATA
"wfs_title" "BAG Terugmeldingen"
"wfs_abstract" "Alle recente BAG terugmeldingen gedaan door BAG gebruikers."
"wfs_keywordlist" "bagterugmeldingen"
"wfs_srs" "EPSG:28992 EPSG:25831 EPSG:25832 EPSG:3034 EPSG:3035 EPSG:3857 EPSG:4258 EPSG:4326"
"wfs_extent" "10000 250000 280000 625000" #DEFAULT !!! belangrijk, anders is performance slecht
"wfs_include_items" "all" # required for getfeatureinfo
"wfs_bbox_extended" "true"
"wfs_enable_request" "*"
"wfs_featureid" "puuid"
"wfs_geomtype" "Point"
"wfs_use_default_extent_for_getfeature" "false"
"gml_include_items" "meldingsnummer_volledig,tijdstip_registratie,status,omschrijving,bronhoudercode,bronhoudernaam,tijdstip_statuswijziging,toelichting,fuuid" # required for getfeatureinfo
"gml_meldingsnummer_volledig_alias" "meldingsnummerVolledig"
"gml_tijdstip_registratie_alias" "tijdstipRegistratie"
"gml_status_alias" "status"
"gml_omschrijving_alias" "omschrijving"
"gml_bronhoudercode_alias" "bronhoudercode"
"gml_bronhoudernaam_alias" "bronhoudernaam"
"gml_tijdstip_statuswijziging_alias" "tijdstipStatuswijziging"
"gml_toelichting_alias" "toelichting"
"gml_fuuid_alias" "fuuid"
"gml_featureid" "puuid"
"gml_exclude_items" "puuid"
"gml_geometries" "geom"
"gml_types" "auto"
"ows_metadataurl_type" "TC211"
"ows_metadataurl_format" "text/plain"
"ows_metadataurl_href" "https://www.nationaalgeoregister.nl/geonetwork/srv/dut/csw?service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&elementsetname=full&id=ec3111da-fd07-44f7-a22f-bcb6b06a9fca"
END
END # LAYER
END # MAP
command: >
/bin/bash -cx "echo \"$${MAPFILE}\" > /srv/service.map && echo \"$${JSON}\" > /srv/terugmeldingen.json && lighttpd -D -f /lighttpd.conf"
wfs-no-id:
image: pdok/mapserver
environment:
MS_MAPFILE: /srv/service.map
JSON: |
{"type":"FeatureCollection","name":"bagterugmeldingen","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::28992"}},"features":[{"type":"Feature","properties":{"meldingsnummer_volledig":"BAG00020575","tijdstip_registratie":"2018-02-05T10:26:04.954","status":"Nieuw","omschrijving":"!!!!!! Hier moeten nog vier boompjes staan !!!!","bronhoudercode":"DE01","bronhoudernaam":"Deventer","tijdstip_statuswijziging":"2018-02-07T12:49:01.044","toelichting":"","puuid":"3f619499-b46e-4406-8334-4330384a8829","fuuid":"bagterugmeldingen.3f619499-b46e-4406-8334-4330384a8829"},"geometry":{"type":"Point","coordinates":[205637.975,475791.40500000002794]}}]}
MAPFILE: |
MAP
NAME "" # empty so ETF geonovum test doesn't try to test it
CONFIG "MS_ERRORFILE" "stderr"
EXTENT 10000 250000 280000 625000
UNITS meters
STATUS ON
#DEBUG 5
PROJECTION
"init=epsg:28992"
END
WEB
METADATA
"ows_enable_request" "*"
"ows_fees" "NONE"
"ows_contactorganization" "PDOK"
"ows_schemas_location" "http://schemas.opengis.net"
"ows_service_onlineresource" "http://localhost/wfs-no-id/?service=WFS"
"ows_contactperson" "KlantContactCenter PDOK"
"ows_contactposition" "pointOfContact"
"ows_contactvoicetelephone" ""
"ows_contactfacsimiletelephone" ""
"ows_addresstype" "Work"
"ows_address" ""
"ows_city" "Apeldoorn"
"ows_stateorprovince" ""
"ows_postcode" ""
"ows_country" "Nederland"
"ows_contactelectronicmailaddress" "[email protected]"
"ows_hoursofservice" ""
"ows_contactinstructions" "https://www.pdok.nl/contact"
"ows_role" ""
"ows_srs" "EPSG:28992 EPSG:25831 EPSG:25832 EPSG:3034 EPSG:3035 EPSG:3857 EPSG:4258 EPSG:4326"
"ows_accessconstraints" "otherRestrictions;http://creativecommons.org/publicdomain/mark/1.0/deed.nl;Geen beperkingen"
END
END
OUTPUTFORMAT
NAME "GEOJSON" # format name (visible as format in the 1.0.0 capabilities)
DRIVER "OGR/GEOJSON"
MIMETYPE "application/json; subtype=geojson"
FORMATOPTION "STORAGE=stream"
FORMATOPTION "FORM=SIMPLE"
FORMATOPTION "USE_FEATUREID=true"
FORMATOPTION "LCO:ID_FIELD=fuuid"
FORMATOPTION "LCO:ID_TYPE=STRING"
END
OUTPUTFORMAT
NAME "JSON"
DRIVER "OGR/GEOJSON"
MIMETYPE "application/json"
FORMATOPTION "STORAGE=stream"
FORMATOPTION "FORM=SIMPLE"
FORMATOPTION "USE_FEATUREID=true"
FORMATOPTION "LCO:ID_FIELD=fuuid"
FORMATOPTION "LCO:ID_TYPE=STRING"
END
OUTPUTFORMAT
NAME "XML"
DRIVER "OGR/GML"
MIMETYPE "text/xml"
FORMATOPTION "STORAGE=stream"
FORMATOPTION "FORM=SIMPLE"
FORMATOPTION "USE_FEATUREID=true"
END
OUTPUTFORMAT
NAME "GML3"
DRIVER "OGR/GML"
MIMETYPE "text/xml; subtype=gml/3.1.1"
FORMATOPTION "STORAGE=stream"
FORMATOPTION "FORM=SIMPLE"
FORMATOPTION "USE_FEATUREID=true"
END
WEB
METADATA
"ows_title" "BAG Terugmeldingen WFS"
"ows_abstract" "De BAG terugmeldingenservice bevat recente meldingen op informatie uit de Basisregistratie Adressen en Gebouwen (BAG) waarover twijfel bestaat. De service toont de locatie, inhoud en status van de meldingen. Ook een vermoedelijke fout geconstateerd? Doe een melding op https://bagviewer.kadaster.nl/ of https://verbeterdekaart.kadaster.nl"
"ows_keywordlist" "Basisregistratie Adressen en Gebouwen,BAG,terugmeldingen,gebouw,adres,pand,in onderzoek register,verbeter de kaart,bagviewer"
"wfs_languages" "eng" #first default, values according ISO 639-2/B
"wfs_extent" "10000 250000 280000 625000"
"wfs_namespace_prefix" "bag"
"wfs_namespace_uri" "http://bag.geonovum.nl"
"wfs_onlineresource" "http://localhost/wfs-no-id"
"wfs_getfeature_formatlist" "GEOJSON,JSON,XML,GML3" # List of earlier defined outputformat names
"wfs_maxfeatures" "1000" # Limit the number of features in a single response for obvious preformance reasons, paging can be used.
"wfs_maxfeatures_ignore_for_resulttype_hits" "true"
"wfs_storedqueries" "urn:x-inspire:storedQuery:bag:FullDataset"
"wfs_urn:x-inspire:storedQuery:bag:FullDataset_filedef" "/srv/data/config/storedquery_fulldataset.xml"
"wfs_inspire_metadataurl_href" "https://www.nationaalgeoregister.nl/geonetwork/srv/dut/csw?service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&elementsetname=full&id=43a1bbb9-345a-4959-8095-227ce295401a"
"wfs_inspire_metadataurl_format" "application/vnd.ogc.csw.GetRecordByIdResponse_xml"
"wfs_inspire_capabilities" "url"
"wfs_inspire_dsid_code" "https://www.nationaalgeoregister.nl/geonetwork/srv/dut/csw?service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&elementsetname=full&id=#MD_DataIdentification"
END
END
LAYER
STATUS ON
NAME "bagterugmeldingen"
CONNECTIONTYPE OGR
CONNECTION "/srv/terugmeldingen.json"
DATA "bagterugmeldingen"
TYPE POINT
PROJECTION
"init=epsg:28992" # Define the source projection to enable repojection
END TEMPLATE void
METADATA
"wfs_title" "BAG Terugmeldingen"
"wfs_abstract" "Alle recente BAG terugmeldingen gedaan door BAG gebruikers."
"wfs_keywordlist" "bagterugmeldingen"
"wfs_srs" "EPSG:28992 EPSG:25831 EPSG:25832 EPSG:3034 EPSG:3035 EPSG:3857 EPSG:4258 EPSG:4326"
"wfs_extent" "10000 250000 280000 625000" #DEFAULT !!! belangrijk, anders is performance slecht
"wfs_include_items" "all" # required for getfeatureinfo
"wfs_bbox_extended" "true"
"wfs_enable_request" "*"
"wfs_featureid" "puuid"
"wfs_geomtype" "Point"
"wfs_use_default_extent_for_getfeature" "false"
"gml_include_items" "meldingsnummer_volledig,tijdstip_registratie,status,omschrijving,bronhoudercode,bronhoudernaam,tijdstip_statuswijziging,toelichting" # required for getfeatureinfo
"gml_meldingsnummer_volledig_alias" "meldingsnummerVolledig"
"gml_tijdstip_registratie_alias" "tijdstipRegistratie"
"gml_status_alias" "status"
"gml_omschrijving_alias" "omschrijving"
"gml_bronhoudercode_alias" "bronhoudercode"
"gml_bronhoudernaam_alias" "bronhoudernaam"
"gml_tijdstip_statuswijziging_alias" "tijdstipStatuswijziging"
"gml_toelichting_alias" "toelichting"
"gml_featureid" "puuid"
"gml_exclude_items" "puuid"
"gml_geometries" "geom"
"gml_types" "auto"
"ows_metadataurl_type" "TC211"
"ows_metadataurl_format" "text/plain"
"ows_metadataurl_href" "https://www.nationaalgeoregister.nl/geonetwork/srv/dut/csw?service=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&elementsetname=full&id=ec3111da-fd07-44f7-a22f-bcb6b06a9fca"
END
END # LAYER
END
command: >
/bin/bash -cx "echo \"$${MAPFILE}\" > /srv/service.map && echo \"$${JSON}\" > /srv/terugmeldingen.json && lighttpd -D -f /lighttpd.conf"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment