@masterportal/masterportalapi 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/.editorconfig +15 -0
  2. package/.eslintignore +6 -0
  3. package/.eslintrc +184 -0
  4. package/.husky/pre-push +4 -0
  5. package/CHANGELOG.md +217 -0
  6. package/License.txt +21 -0
  7. package/README.md +24 -0
  8. package/babel.config.json +6 -0
  9. package/example/README.md +7 -0
  10. package/example/config/localGeoJSON.js +956 -0
  11. package/example/config/portal.json +35 -0
  12. package/example/config/services.json +79 -0
  13. package/example/index.html +27 -0
  14. package/example/index.js +210 -0
  15. package/example/style.scss +59 -0
  16. package/jest.config.js +18 -0
  17. package/jest.setup.js +5 -0
  18. package/jsdoc.json +15 -0
  19. package/package.json +62 -0
  20. package/public/marker.svg +1 -0
  21. package/public/stringMarker.js +5 -0
  22. package/src/crs.js +122 -0
  23. package/src/defaults.js +38 -0
  24. package/src/index.js +30 -0
  25. package/src/layer/geojson/index.js +109 -0
  26. package/src/layer/geojson/style.js +61 -0
  27. package/src/layer/lib.js +32 -0
  28. package/src/layer/oaf.js +207 -0
  29. package/src/layer/terrain.js +72 -0
  30. package/src/layer/tileset.js +71 -0
  31. package/src/layer/vector.js +48 -0
  32. package/src/layer/vectorBase.js +39 -0
  33. package/src/layer/wfs.js +218 -0
  34. package/src/layer/wms.js +185 -0
  35. package/src/lib/coordsToPairs.js +15 -0
  36. package/src/lib/getInitialLayers.js +22 -0
  37. package/src/lib/load3DScript.js +22 -0
  38. package/src/lib/oafUtil.js +22 -0
  39. package/src/lib/setBackgroundImage.js +23 -0
  40. package/src/lib/wfsUtil.js +75 -0
  41. package/src/lib/zoomTo.js +40 -0
  42. package/src/maps/api.js +5 -0
  43. package/src/maps/map.js +35 -0
  44. package/src/maps/mapView.js +54 -0
  45. package/src/maps/ol/olMap.js +124 -0
  46. package/src/maps/olcs/3dUtils/fixedOverlaySynchronizer.js +39 -0
  47. package/src/maps/olcs/3dUtils/wmsRasterSynchronizer.js +348 -0
  48. package/src/maps/olcs/olcsMap.js +212 -0
  49. package/src/rawLayerList.js +88 -0
  50. package/src/searchAddress/gazetteerUrl.js +22 -0
  51. package/src/searchAddress/index.js +13 -0
  52. package/src/searchAddress/parse.js +196 -0
  53. package/src/searchAddress/search.js +184 -0
  54. package/src/searchAddress/searchGazetteer.js +52 -0
  55. package/src/searchAddress/showGeographicIdentifier.js +20 -0
  56. package/src/searchAddress/types.js +17 -0
  57. package/test/.eslintrc +7 -0
  58. package/test/crs.test.js +109 -0
  59. package/test/layer/geojson/index.test.js +133 -0
  60. package/test/layer/geojson/style.test.js +46 -0
  61. package/test/layer/lib.test.js +83 -0
  62. package/test/layer/oaf.test.js +245 -0
  63. package/test/layer/resources/oafFeatures.js +105 -0
  64. package/test/layer/resources/wfsFeatures.js +26 -0
  65. package/test/layer/resources/wfsFilter.js +17 -0
  66. package/test/layer/terrain.test.js +106 -0
  67. package/test/layer/tileset.test.js +116 -0
  68. package/test/layer/vector.test.js +76 -0
  69. package/test/layer/vectorBase.test.js +48 -0
  70. package/test/layer/wfs.test.js +388 -0
  71. package/test/layer/wms.test.js +256 -0
  72. package/test/lib/coordsToPairs.test.js +9 -0
  73. package/test/lib/getInitialLayers.test.js +28 -0
  74. package/test/lib/oafUtil.test.js +24 -0
  75. package/test/lib/setBackgroundImage.test.js +49 -0
  76. package/test/lib/wfsUtil.test.js +28 -0
  77. package/test/lib/zoomTo.test.js +74 -0
  78. package/test/map.test.js +258 -0
  79. package/test/mapView.test.js +59 -0
  80. package/test/rawLayerList.test.js +48 -0
  81. package/test/searchAddress/gazetteerSearchResults/address.js +175 -0
  82. package/test/searchAddress/gazetteerSearchResults/district.js +71 -0
  83. package/test/searchAddress/gazetteerSearchResults/houseNumber.js +32 -0
  84. package/test/searchAddress/gazetteerSearchResults/index.js +19 -0
  85. package/test/searchAddress/gazetteerSearchResults/parcel.js +44 -0
  86. package/test/searchAddress/gazetteerSearchResults/street.js +46 -0
  87. package/test/searchAddress/gazetteerSearchResults/streetKey.js +51 -0
  88. package/test/searchAddress/gazetteerUrl.test.js +22 -0
  89. package/test/searchAddress/parse.test.js +110 -0
  90. package/test/searchAddress/search.test.js +150 -0
  91. package/test/searchAddress/searchGazetteer.test.js +58 -0
  92. package/test/searchAddress/showGeographicIdentifier.test.js +22 -0
@@ -0,0 +1,32 @@
1
+ // https://geodienste.hamburg.de/HH_WFS_GAGES?service=WFS&request=GetFeature&version=2.0.0&StoredQuery_ID=HausnummernZuStrasse&strassenname=Pflugacker
2
+ export default `<?xml version='1.0' encoding='UTF-8'?>
3
+ <wfs:FeatureCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.hamburg.de/namespaces/gages https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=DescribeFeatureType&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;TYPENAME=gages:Hauskoordinaten&amp;NAMESPACES=xmlns(gages,http%3A%2F%2Fwww.hamburg.de%2Fnamespaces%2Fgages)" xmlns:wfs="http://www.opengis.net/wfs/2.0" timeStamp="2018-12-17T13:00:52Z" xmlns:gml="http://www.opengis.net/gml/3.2" numberMatched="unknown" numberReturned="0">
4
+ <!--NOTE: numberReturned attribute should be 'unknown' as well, but this would not validate against the current version of the WFS 2.0 schema (change upcoming). See change request (CR 144): https://portal.opengeospatial.org/files?artifact_id=43925.-->
5
+ <wfs:member>
6
+ <gages:Hauskoordinaten xmlns:gages="http://www.hamburg.de/namespaces/gages" gml:id="HH_H_256224167">
7
+ <iso19112:geographicIdentifier xmlns:iso19112="http://www.opengis.net/iso19112">Pflugacker 11a, 22523 Hamburg(OT Eidelstedt)</iso19112:geographicIdentifier>
8
+ <iso19112:geographicExtent xmlns:iso19112="http://www.opengis.net/iso19112">
9
+ <gmd:EX_BoundingPolygon xmlns:gmd="http://www.isotc211.org/2005/gmd">
10
+ <gmd:polygon>
11
+ <gml:Polygon gml:id="HH_H_256224167_ISO19112_GEOGRAPHICEXTENT" srsName="urn:ogc:def:crs:EPSG::25832">
12
+ <gml:exterior>
13
+ <gml:LinearRing>
14
+ <gml:posList>559562.466 5940928.639 559562.466 5940978.639 559612.466 5940978.639 559612.466 5940928.639 559562.466 5940928.639</gml:posList>
15
+ </gml:LinearRing>
16
+ </gml:exterior>
17
+ </gml:Polygon>
18
+ </gmd:polygon>
19
+ </gmd:EX_BoundingPolygon>
20
+ </iso19112:geographicExtent>
21
+ <iso19112:position xmlns:iso19112="http://www.opengis.net/iso19112">
22
+ <!--Inlined geometry 'HH_H_256224167_ISO19112_POSITION'-->
23
+ <gml:Point gml:id="HH_H_256224167_ISO19112_POSITION" srsName="urn:ogc:def:crs:EPSG::25832">
24
+ <gml:pos>559587.466 5940953.639</gml:pos>
25
+ </gml:Point>
26
+ </iso19112:position>
27
+ <iso19112:locationType xmlns:iso19112="http://www.opengis.net/iso19112" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=GetFeature&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById&amp;ID=HH_SILC_1#HH_SILC_1"/>
28
+ <dog:hausnummer xmlns:dog="http://www.adv-online.de/namespaces/adv/dog">11</dog:hausnummer>
29
+ <dog:hausnummernzusatz xmlns:dog="http://www.adv-online.de/namespaces/adv/dog">a</dog:hausnummernzusatz>
30
+ </gages:Hauskoordinaten>
31
+ </wfs:member>
32
+ </wfs:FeatureCollection>`;
@@ -0,0 +1,19 @@
1
+ import * as addressResults from "./address";
2
+ import districtResult from "./district";
3
+ import houseNumberResult from "./houseNumber";
4
+ import parcelResult from "./parcel";
5
+ import streetResult from "./street";
6
+ import streetKeyResult from "./streetKey";
7
+
8
+ /**
9
+ * Group of example HH gazetteer results for testing.
10
+ * @ignore
11
+ */
12
+ export {
13
+ addressResults,
14
+ districtResult,
15
+ houseNumberResult,
16
+ parcelResult,
17
+ streetResult,
18
+ streetKeyResult
19
+ };
@@ -0,0 +1,44 @@
1
+ // https://geodienste.hamburg.de/HH_WFS_GAGES?service=WFS&request=GetFeature&version=2.0.0&StoredQuery_ID=Flurstueck&gemarkung=0147&flurstuecksnummer=12561
2
+ export default `<?xml version='1.0' encoding='UTF-8'?>
3
+ <wfs:FeatureCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.adv-online.de/namespaces/adv/dog https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=DescribeFeatureType&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;TYPENAME=dog:Flurstueckskoordinaten&amp;NAMESPACES=xmlns(dog,http%3A%2F%2Fwww.adv-online.de%2Fnamespaces%2Fadv%2Fdog)" xmlns:wfs="http://www.opengis.net/wfs/2.0" timeStamp="2018-12-17T14:30:50Z" xmlns:gml="http://www.opengis.net/gml/3.2" numberMatched="unknown" numberReturned="0">
4
+ <!--NOTE: numberReturned attribute should be 'unknown' as well, but this would not validate against the current version of the WFS 2.0 schema (change upcoming). See change request (CR 144): https://portal.opengeospatial.org/files?artifact_id=43925.-->
5
+ <wfs:member>
6
+ <dog:Flurstueckskoordinaten xmlns:dog="http://www.adv-online.de/namespaces/adv/dog" gml:id="HH_FLURSTUECK_227875032">
7
+ <iso19112:geographicIdentifier xmlns:iso19112="http://www.opengis.net/iso19112">02;0147;;12561;;</iso19112:geographicIdentifier>
8
+ <iso19112:geographicExtent xmlns:iso19112="http://www.opengis.net/iso19112">
9
+ <gmd:EX_BoundingPolygon xmlns:gmd="http://www.isotc211.org/2005/gmd">
10
+ <gmd:polygon>
11
+ <gml:Polygon gml:id="HH_FLURSTUECK_227875032_ISO19112_GEOGRAPHICEXTENT" srsName="urn:ogc:def:crs:EPSG::25832">
12
+ <gml:exterior>
13
+ <gml:LinearRing>
14
+ <gml:posList>566458.579 5928101.330 566458.579 5928151.330 566508.579 5928151.330 566508.579 5928101.330 566458.579 5928101.330</gml:posList>
15
+ </gml:LinearRing>
16
+ </gml:exterior>
17
+ </gml:Polygon>
18
+ </gmd:polygon>
19
+ </gmd:EX_BoundingPolygon>
20
+ </iso19112:geographicExtent>
21
+ <iso19112:position xmlns:iso19112="http://www.opengis.net/iso19112">
22
+ <!--Inlined geometry 'HH_FLURSTUECK_227875032_ISO19112_POSITION'-->
23
+ <gml:Point gml:id="HH_FLURSTUECK_227875032_ISO19112_POSITION" srsName="urn:ogc:def:crs:EPSG::25832">
24
+ <gml:pos>566483.579 5928126.330</gml:pos>
25
+ </gml:Point>
26
+ </iso19112:position>
27
+ <iso19112:gazetteer xmlns:iso19112="http://www.opengis.net/iso19112" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=GetFeature&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById&amp;ID=HH_SIGA_2#HH_SIGA_2"/>
28
+ <iso19112:locationType xmlns:iso19112="http://www.opengis.net/iso19112" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=GetFeature&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById&amp;ID=HH_SILC_9#HH_SILC_9"/>
29
+ <iso19112:parent xmlns:iso19112="http://www.opengis.net/iso19112">02;0147</iso19112:parent>
30
+ <dog:land>02</dog:land>
31
+ <dog:gemarkung>0147</dog:gemarkung>
32
+ <dog:flurstuecksnummer>12561</dog:flurstuecksnummer>
33
+ <dog:flurstueck_lang>12561</dog:flurstueck_lang>
34
+ <dog:flurstuecksflaeche>25</dog:flurstuecksflaeche>
35
+ <dog:status>0</dog:status>
36
+ <dog:regierungsbezirk>1</dog:regierungsbezirk>
37
+ <dog:kreis>16</dog:kreis>
38
+ <dog:gemeinde>137</dog:gemeinde>
39
+ <dog:verwaltungsart>Flurstueck</dog:verwaltungsart>
40
+ <dog:gemeindename>Wilhelmsburg</dog:gemeindename>
41
+ <dog:kreisname>Wilhelmsburg</dog:kreisname>
42
+ </dog:Flurstueckskoordinaten>
43
+ </wfs:member>
44
+ </wfs:FeatureCollection>`;
@@ -0,0 +1,46 @@
1
+ // https://geodienste.hamburg.de/HH_WFS_GAGES?service=WFS&request=GetFeature&version=2.0.0&StoredQuery_ID=findeStrasse&strassenname=bargkoppelweg
2
+ export default `<?xml version='1.0' encoding='UTF-8'?>
3
+ <wfs:FeatureCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.adv-online.de/namespaces/adv/dog https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=DescribeFeatureType&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;TYPENAME=dog:Strassen&amp;NAMESPACES=xmlns(dog,http%3A%2F%2Fwww.adv-online.de%2Fnamespaces%2Fadv%2Fdog)" xmlns:wfs="http://www.opengis.net/wfs/2.0" timeStamp="2018-12-17T12:48:49Z" xmlns:gml="http://www.opengis.net/gml/3.2" numberMatched="unknown" numberReturned="0">
4
+ <!--NOTE: numberReturned attribute should be 'unknown' as well, but this would not validate against the current version of the WFS 2.0 schema (change upcoming). See change request (CR 144): https://portal.opengeospatial.org/files?artifact_id=43925.-->
5
+ <wfs:member>
6
+ <dog:Strassen xmlns:dog="http://www.adv-online.de/namespaces/adv/dog" gml:id="HH_STR_7610147">
7
+ <iso19112:geographicIdentifier xmlns:iso19112="http://www.opengis.net/iso19112">Bargkoppelweg (OT Rahlstedt) , Hamburg (22145)</iso19112:geographicIdentifier>
8
+ <iso19112:geographicExtent xmlns:iso19112="http://www.opengis.net/iso19112">
9
+ <gmd:EX_BoundingPolygon xmlns:gmd="http://www.isotc211.org/2005/gmd">
10
+ <gmd:polygon>
11
+ <gml:Polygon gml:id="HH_STR_7610147_ISO19112_GEOGRAPHICEXTENT" srsName="urn:ogc:def:crs:EPSG::25832">
12
+ <gml:exterior>
13
+ <gml:LinearRing>
14
+ <gml:posList>576020.921 5941871.589 576777.652 5941871.589 576777.652 5942463.286 576020.921 5942463.286 576020.921 5941871.589</gml:posList>
15
+ </gml:LinearRing>
16
+ </gml:exterior>
17
+ </gml:Polygon>
18
+ </gmd:polygon>
19
+ </gmd:EX_BoundingPolygon>
20
+ </iso19112:geographicExtent>
21
+ <iso19112:position xmlns:iso19112="http://www.opengis.net/iso19112">
22
+ <!--Inlined geometry 'HH_STR_7610147_ISO19112_POSITION'-->
23
+ <gml:Point gml:id="HH_STR_7610147_ISO19112_POSITION" srsName="urn:ogc:def:crs:EPSG::25832">
24
+ <gml:pos>576399.286 5942167.438</gml:pos>
25
+ </gml:Point>
26
+ </iso19112:position>
27
+ <iso19112:position_strassenachse xmlns:iso19112="http://www.opengis.net/iso19112">
28
+ <!--Inlined geometry 'HH_STR_7610147_ISO19112_POSITION_STRASSENACHSE'-->
29
+ <gml:Point gml:id="HH_STR_7610147_ISO19112_POSITION_STRASSENACHSE" srsName="urn:ogc:def:crs:EPSG::25832">
30
+ <gml:pos>576096.393 5941919.653</gml:pos>
31
+ </gml:Point>
32
+ </iso19112:position_strassenachse>
33
+ <iso19112:locationType xmlns:iso19112="http://www.opengis.net/iso19112" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=GetFeature&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById&amp;ID=HH_SILC_2#HH_SILC_2"/>
34
+ <dog:land>02</dog:land>
35
+ <dog:strassenschluessel>02;5;18;526;0526;B0610</dog:strassenschluessel>
36
+ <dog:strassenname>Bargkoppelweg</dog:strassenname>
37
+ <dog:ortsteilname>OT 0526</dog:ortsteilname>
38
+ <dog:ortsteilname_normalisiert>OT0526</dog:ortsteilname_normalisiert>
39
+ <dog:gemeindename_normalisiert>OT0526</dog:gemeindename_normalisiert>
40
+ <dog:postOrtsteil>Rahlstedt</dog:postOrtsteil>
41
+ <dog:postOrtsteil_normalisiert>RAHLSTEDT</dog:postOrtsteil_normalisiert>
42
+ <dog:ortsnamePost>Hamburg</dog:ortsnamePost>
43
+ <dog:ortsnamePost_normalisiert>HAMBURG</dog:ortsnamePost_normalisiert>
44
+ </dog:Strassen>
45
+ </wfs:member>
46
+ </wfs:FeatureCollection>`;
@@ -0,0 +1,51 @@
1
+ // https://geodienste.hamburg.de/HH_WFS_GAGES?service=WFS&request=GetFeature&version=2.0.0&StoredQuery_ID=findeStrassenSchluessel&strassenschluessel=A1270
2
+ export default `<?xml version='1.0' encoding='UTF-8'?>
3
+ <wfs:FeatureCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd http://www.adv-online.de/namespaces/adv/dog https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=DescribeFeatureType&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;TYPENAME=dog:Strassen&amp;NAMESPACES=xmlns(dog,http%3A%2F%2Fwww.adv-online.de%2Fnamespaces%2Fadv%2Fdog)" xmlns:wfs="http://www.opengis.net/wfs/2.0" timeStamp="2018-12-17T13:04:04Z" xmlns:gml="http://www.opengis.net/gml/3.2" numberMatched="unknown" numberReturned="0">
4
+ <!--NOTE: numberReturned attribute should be 'unknown' as well, but this would not validate against the current version of the WFS 2.0 schema (change upcoming). See change request (CR 144): https://portal.opengeospatial.org/files?artifact_id=43925.-->
5
+ <wfs:member>
6
+ <dog:Strassen xmlns:dog="http://www.adv-online.de/namespaces/adv/dog" gml:id="HH_STR_7612101">
7
+ <iso19112:geographicIdentifier xmlns:iso19112="http://www.opengis.net/iso19112">Alte Marsch (OT Neugraben-Fischbek) , Hamburg (21149)</iso19112:geographicIdentifier>
8
+ <iso19112:geographicExtent xmlns:iso19112="http://www.opengis.net/iso19112">
9
+ <gmd:EX_BoundingPolygon xmlns:gmd="http://www.isotc211.org/2005/gmd">
10
+ <gmd:polygon>
11
+ <gml:Polygon gml:id="HH_STR_7612101_ISO19112_GEOGRAPHICEXTENT" srsName="urn:ogc:def:crs:EPSG::25832">
12
+ <gml:exterior>
13
+ <gml:LinearRing>
14
+ <gml:posList>555024.929 5925215.300 555158.132 5925215.300 555158.132 5925409.413 555024.929 5925409.413 555024.929 5925215.300</gml:posList>
15
+ </gml:LinearRing>
16
+ </gml:exterior>
17
+ </gml:Polygon>
18
+ </gmd:polygon>
19
+ </gmd:EX_BoundingPolygon>
20
+ </iso19112:geographicExtent>
21
+ <iso19112:position xmlns:iso19112="http://www.opengis.net/iso19112">
22
+ <!--Inlined geometry 'HH_STR_7612101_ISO19112_POSITION'-->
23
+ <gml:Point gml:id="HH_STR_7612101_ISO19112_POSITION" srsName="urn:ogc:def:crs:EPSG::25832">
24
+ <gml:pos>555091.531 5925312.357</gml:pos>
25
+ </gml:Point>
26
+ </iso19112:position>
27
+ <iso19112:position_strassenachse xmlns:iso19112="http://www.opengis.net/iso19112">
28
+ <!--Inlined geometry 'HH_STR_7612101_ISO19112_POSITION_STRASSENACHSE'-->
29
+ <gml:Point gml:id="HH_STR_7612101_ISO19112_POSITION_STRASSENACHSE" srsName="urn:ogc:def:crs:EPSG::25832">
30
+ <gml:pos>555108.287 5925298.269</gml:pos>
31
+ </gml:Point>
32
+ </iso19112:position_strassenachse>
33
+ <iso19112:gazetteer xmlns:iso19112="http://www.opengis.net/iso19112" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=GetFeature&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById&amp;ID=HH_SIGA_2#HH_SIGA_2"/>
34
+ <iso19112:locationType xmlns:iso19112="http://www.opengis.net/iso19112" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://geodienste.hamburg.de/HH_WFS_GAGES?SERVICE=WFS&amp;VERSION=2.0.0&amp;REQUEST=GetFeature&amp;OUTPUTFORMAT=application%2Fgml%2Bxml%3B+version%3D3.2&amp;STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById&amp;ID=HH_SILC_2#HH_SILC_2"/>
35
+ <dog:land>02</dog:land>
36
+ <dog:strassenschluessel>02;7;14;715;0715;A1270</dog:strassenschluessel>
37
+ <dog:strassenname>Alte Marsch</dog:strassenname>
38
+ <dog:strassenname_normalisiert>ALTEMARSCH</dog:strassenname_normalisiert>
39
+ <dog:strassenname_soundex>A435</dog:strassenname_soundex>
40
+ <dog:ortsteilname>OT 0715</dog:ortsteilname>
41
+ <dog:ortsteilname_normalisiert>OT0715</dog:ortsteilname_normalisiert>
42
+ <dog:gemeindename_normalisiert>OT0715</dog:gemeindename_normalisiert>
43
+ <dog:postleitzahl>21149</dog:postleitzahl>
44
+ <dog:postOrtsteil>Neugraben-Fischbek</dog:postOrtsteil>
45
+ <dog:postOrtsteil_normalisiert>NEUGRABENFISCHBEK</dog:postOrtsteil_normalisiert>
46
+ <dog:postleitzahl>21149</dog:postleitzahl>
47
+ <dog:ortsnamePost>Hamburg</dog:ortsnamePost>
48
+ <dog:ortsnamePost_normalisiert>HAMBURG</dog:ortsnamePost_normalisiert>
49
+ </dog:Strassen>
50
+ </wfs:member>
51
+ </wfs:FeatureCollection>`;
@@ -0,0 +1,22 @@
1
+ import {getGazetteerUrl, setGazetteerUrl} from "../../src/searchAddress";
2
+ import defaults from "../../src/defaults";
3
+
4
+ describe("searchAddress", function () {
5
+ describe("setGazetteerUrl/getGazetteerUrl", function () {
6
+ it("gazetteer url can be setted and getted, is initially default", function () {
7
+ const initialUrl = getGazetteerUrl();
8
+
9
+ expect(initialUrl).toEqual(defaults.gazetteerUrl);
10
+ setGazetteerUrl("test");
11
+ expect(getGazetteerUrl()).toEqual("test");
12
+ setGazetteerUrl(initialUrl);
13
+ });
14
+
15
+ it("setting gazetteer url with falsy value means not changing previous value", function () {
16
+ const initialUrl = getGazetteerUrl();
17
+
18
+ setGazetteerUrl(undefined);
19
+ expect(getGazetteerUrl()).toEqual(initialUrl);
20
+ });
21
+ });
22
+ });
@@ -0,0 +1,110 @@
1
+ import * as gazetteerSearchResults from "./gazetteerSearchResults/index";
2
+
3
+ import {parse} from "../../src/searchAddress/parse";
4
+ import {searchTypes} from "../../src/searchAddress";
5
+
6
+ describe("searchAddress", function () {
7
+ describe("parse", function () {
8
+ it("parses district results as expected", function (done) {
9
+ parse(searchTypes.DISTRICT, gazetteerSearchResults.districtResult)
10
+ .then(x => {
11
+ expect(x[0].name).toBe("Barmbek-Nord");
12
+ expect(x[0].type).toBe(searchTypes.DISTRICT);
13
+ expect(x[0].properties.bundeslandname).toBe("Hamburg");
14
+ expect(x[0].geometry.type).toBe("Point");
15
+ expect(x[0].geometry.coordinates).toEqual([
16
+ "569569.732", "5939046.574"
17
+ ]);
18
+
19
+ expect(x[1].name).toBe("Barmbek-Süd");
20
+ expect(x[1].type).toBe(searchTypes.DISTRICT);
21
+ expect(x[1].properties.bundeslandname).toBe("Hamburg");
22
+ expect(x[1].geometry.coordinates).toEqual([
23
+ "568729.508", "5937017.649"
24
+ ]);
25
+ done();
26
+ });
27
+ });
28
+
29
+ it("parses street key results as expected", function (done) {
30
+ parse(searchTypes.STREET_KEY, gazetteerSearchResults.streetKeyResult)
31
+ .then(x => {
32
+ expect(x[0].name).toBe("Alte Marsch");
33
+ expect(x[0].type).toBe(searchTypes.STREET_KEY);
34
+ expect(x[0].properties.postOrtsteil).toBe("Neugraben-Fischbek");
35
+ expect(x[0].geometry.type).toBe("Point");
36
+ expect(x[0].geometry.coordinates).toEqual([
37
+ "555108.287", "5925298.269"
38
+ ]);
39
+ done();
40
+ });
41
+ });
42
+
43
+ it("parses street results as expected", function (done) {
44
+ parse(searchTypes.STREET, gazetteerSearchResults.streetResult)
45
+ .then(x => {
46
+ expect(x[0].name).toBe("Bargkoppelweg");
47
+ expect(x[0].type).toBe(searchTypes.STREET);
48
+ expect(x[0].properties.postOrtsteil).toBe("Rahlstedt");
49
+ expect(x[0].geometry.type).toBe("Point");
50
+ expect(x[0].geometry.coordinates).toEqual([
51
+ "576096.393", "5941919.653"
52
+ ]);
53
+ done();
54
+ });
55
+ });
56
+
57
+ it("parses parcel results as expected", function (done) {
58
+ parse(searchTypes.PARCEL, gazetteerSearchResults.parcelResult)
59
+ .then(x => {
60
+ expect(x[0].name).toBe("0147/12561");
61
+ expect(x[0].type).toBe(searchTypes.PARCEL);
62
+ expect(x[0].properties.gemeindename).toBe("Wilhelmsburg");
63
+ expect(x[0].geometry.type).toBe("Point");
64
+ expect(x[0].geometry.coordinates).toEqual([
65
+ "566483.579", "5928126.330"
66
+ ]);
67
+ done();
68
+ });
69
+ });
70
+
71
+ it("parses houseNumber results as expected", function (done) {
72
+ parse(searchTypes.HOUSE_NUMBERS_FOR_STREET, gazetteerSearchResults.houseNumberResult)
73
+ .then(x => {
74
+ expect(x[0].name).toBe("Pflugacker 11a");
75
+ expect(x[0].type).toBe(searchTypes.HOUSE_NUMBERS_FOR_STREET);
76
+ expect(x[0].geometry.type).toBe("Point");
77
+ expect(x[0].geometry.coordinates).toEqual([
78
+ "559587.466", "5940953.639"
79
+ ]);
80
+ done();
81
+ });
82
+ });
83
+
84
+ it("parses address (with addition) results as expected", function (done) {
85
+ parse(searchTypes.ADDRESS_AFFIXED, gazetteerSearchResults.addressResults.adresseMitZusatz)
86
+ .then(x => {
87
+ expect(x[0].name).toBe("Pflugacker 13b");
88
+ expect(x[0].type).toBe(searchTypes.ADDRESS_AFFIXED);
89
+ expect(x[0].geometry.type).toBe("Point");
90
+ expect(x[0].geometry.coordinates).toEqual([
91
+ "559578.353", "5941044.732"
92
+ ]);
93
+ done();
94
+ });
95
+ });
96
+
97
+ it("parses address (without addition) results as expected", function (done) {
98
+ parse(searchTypes.ADDRESS_UNAFFIXED, gazetteerSearchResults.addressResults.adresseOhneZusatz)
99
+ .then(x => {
100
+ expect(x[0].name).toBe("Bargkoppelweg 1");
101
+ expect(x[0].type).toBe(searchTypes.ADDRESS_UNAFFIXED);
102
+ expect(x[0].geometry.type).toBe("Point");
103
+ expect(x[0].geometry.coordinates).toEqual([
104
+ "576071.966", "5941920.455"
105
+ ]);
106
+ done();
107
+ });
108
+ });
109
+ });
110
+ });
@@ -0,0 +1,150 @@
1
+ import {search} from "../../src/searchAddress";
2
+ import {searchTypes as types} from "../../src/searchAddress/types";
3
+
4
+ // mock implementation for search gazetteer just returns example values by type and ignores search value
5
+ jest.mock("../../src/searchAddress/searchGazetteer", () => {
6
+ // must disable this rule since jest.mock requires import within mock https://github.com/facebook/jest/issues/2567#issuecomment-271937555
7
+ /* eslint-disable global-require */
8
+ const {searchTypes} = require("../../src/searchAddress/types"),
9
+ {addressResults, districtResult, houseNumberResult, parcelResult, streetResult, streetKeyResult} = require("./gazetteerSearchResults");
10
+ /* eslint-enable global-require */
11
+
12
+ return {
13
+ searchGazetteer: jest.fn((type, value) => new Promise((resolve, reject) => {
14
+ const exampleResult = {
15
+ [searchTypes.PARCEL]: parcelResult,
16
+ [searchTypes.STREET]: streetResult,
17
+ [searchTypes.STREET_KEY]: streetKeyResult,
18
+ [searchTypes.HOUSE_NUMBERS_FOR_STREET]: houseNumberResult,
19
+ [searchTypes.DISTRICT]: districtResult,
20
+ [searchTypes.ADDRESS_AFFIXED]: addressResults.adresseMitZusatz,
21
+ [searchTypes.ADDRESS_UNAFFIXED]: addressResults.adresseOhneZusatz
22
+ }[type];
23
+
24
+ if (exampleResult) {
25
+ resolve(exampleResult);
26
+ }
27
+ else {
28
+ reject(`No test data for type/value '${type}/${value}'.`);
29
+ }
30
+ }))
31
+ };
32
+ });
33
+
34
+ import {searchGazetteer as mockedSearchGazetteer} from "../../src/searchAddress/searchGazetteer";
35
+
36
+ describe("searchAddress", function () {
37
+ describe("search", function () {
38
+ it("rejects if missing configuration of what to search for", function (done) {
39
+ search("Pflugacker", {}).catch(e => {
40
+ expect(typeof e.error).toBe("string");
41
+ done();
42
+ });
43
+ });
44
+
45
+ it("rejects if string is below default minimum length", function (done) {
46
+ search("P", {searchStreets: true})
47
+ .catch(e => {
48
+ expect(typeof e.error).toBe("string");
49
+ done();
50
+ });
51
+ });
52
+
53
+ it("rejects if string is below defined length", function (done) {
54
+ search("Pflugacker", {minCharacters: 20, searchStreets: true})
55
+ .catch(e => {
56
+ expect(typeof e.error).toBe("string");
57
+ done();
58
+ });
59
+ });
60
+
61
+ it("forwards the expected type and string to the searchGazetteer method", function (done) {
62
+ jest.clearAllMocks(); // reset mock calls
63
+
64
+ const searches = [
65
+ search("Address 7", {searchAddress: true}),
66
+ search("Address 7b", {searchAddress: true}),
67
+ search("Streetname", {searchStreets: true}),
68
+ search("StreetnameAndHnrs", {searchStreets: true, searchHouseNumbers: true}),
69
+ search("Districtname", {searchDistricts: true}),
70
+ search("1234/1234", {searchParcels: true}),
71
+ search("12345678", {searchParcels: true}),
72
+ search("A12345", {searchStreetKey: true})
73
+ ],
74
+ abortController = new AbortController();
75
+
76
+ Promise.all(searches)
77
+ .then(results => {
78
+ // order of calls may vary, hence using expect.arrayContaining
79
+ const expected = [
80
+ [types.ADDRESS_UNAFFIXED, ["Address", "7"], abortController],
81
+ [types.ADDRESS_AFFIXED, ["Address", "7", "b"], abortController],
82
+ [types.STREET, "Streetname", abortController],
83
+ [types.STREET, "StreetnameAndHnrs", abortController],
84
+ [types.HOUSE_NUMBERS_FOR_STREET, "Bargkoppelweg", abortController],
85
+ [types.DISTRICT, "Districtname", abortController],
86
+ [types.PARCEL, ["1234", "1234"], abortController],
87
+ [types.PARCEL, ["1234", "5678"], abortController],
88
+ [types.STREET_KEY, "A12345", abortController]
89
+ ];
90
+
91
+ expect(results[0]).toHaveLength(1);
92
+ expect(results[1]).toHaveLength(1);
93
+ expect(results[2]).toHaveLength(1);
94
+ expect(results[3]).toHaveLength(2);
95
+ expect(results[4]).toHaveLength(2);
96
+ expect(results[5]).toHaveLength(1);
97
+ expect(results[6]).toHaveLength(1);
98
+ expect(results[7]).toHaveLength(1);
99
+ expect(mockedSearchGazetteer.mock.calls).toHaveLength(9);
100
+ expect(mockedSearchGazetteer.mock.calls).toEqual(expect.arrayContaining(expected));
101
+ done();
102
+ })
103
+ .catch(e => console.error(e));
104
+ });
105
+
106
+ it("calls zoomTo if params indicate to zoom and there is exactly one result", function (done) {
107
+ const fitMock = jest.fn(),
108
+ zoomToParams = {x: 0};
109
+
110
+ search("Streetname", {
111
+ searchStreets: true,
112
+ zoom: true,
113
+ zoomToParams,
114
+ map: {
115
+ getView: () => ({
116
+ fit: fitMock
117
+ })
118
+ }
119
+ })
120
+ .then(results => {
121
+ expect(results).toHaveLength(1);
122
+ expect(fitMock).toHaveBeenCalledWith(expect.any(Object), zoomToParams);
123
+ done();
124
+ })
125
+ .catch(e => console.error(e));
126
+ });
127
+
128
+ it("does not call zoomTo if params indicate to zoom, but there is not exactly one result", function (done) {
129
+ const fitMock = jest.fn();
130
+
131
+ search("StreetnameAndHnrs", {
132
+ searchStreets: true,
133
+ searchHouseNumbers: true,
134
+ zoom: true,
135
+ zoomToParams: {x: 0},
136
+ map: {
137
+ getView: () => ({
138
+ fit: fitMock
139
+ })
140
+ }
141
+ })
142
+ .then(results => {
143
+ expect(results).toHaveLength(2);
144
+ expect(fitMock).not.toHaveBeenCalled();
145
+ done();
146
+ })
147
+ .catch(e => console.error(e));
148
+ });
149
+ });
150
+ });
@@ -0,0 +1,58 @@
1
+ import {encode, getIdQuery, searchGazetteer} from "../../src/searchAddress/searchGazetteer";
2
+ import {searchTypes} from "../../src/searchAddress/types";
3
+ import defaults from "../../src/defaults";
4
+
5
+ describe("searchAddress", function () {
6
+ describe("encode", function () {
7
+ it("encodes a string or an array of strings for URi use", function () {
8
+ const a = "\"hello world\"",
9
+ arr = [a, a, a];
10
+
11
+ expect(encode(a)).toEqual("%22hello%20world%22");
12
+ expect(encode(arr)).toEqual([encode(a), encode(a), encode(a)]);
13
+ });
14
+ });
15
+
16
+ describe("getIdQuery", function () {
17
+ it("encodes given search phrase(s) and builds query fragment from it", function () {
18
+ expect(getIdQuery(searchTypes.STREET, "hello world")).toEqual("&StoredQuery_ID=findeStrasse&strassenname=*hello%20world");
19
+ expect(getIdQuery(searchTypes.DISTRICT, "hello world")).toEqual("&StoredQuery_ID=findeStadtteil&stadtteilname=hello%20world");
20
+ expect(getIdQuery(searchTypes.PARCEL, ["1 a", "1 b"])).toEqual("&StoredQuery_ID=Flurstueck&gemarkung=1%20a&flurstuecksnummer=1%20b");
21
+ expect(getIdQuery(searchTypes.STREET_KEY, "A12345")).toEqual("&StoredQuery_ID=findeStrassenSchluessel&strassenschluessel=A12345");
22
+ expect(getIdQuery(searchTypes.ADDRESS_AFFIXED, ["Street", "1", "b"])).toEqual("&StoredQuery_ID=AdresseMitZusatz&strassenname=Street&hausnummer=1&zusatz=b");
23
+ expect(getIdQuery(searchTypes.ADDRESS_UNAFFIXED, ["Street", "1"])).toEqual("&StoredQuery_ID=AdresseOhneZusatz&strassenname=Street&hausnummer=1");
24
+ expect(getIdQuery(searchTypes.HOUSE_NUMBERS_FOR_STREET, "Street")).toEqual("&StoredQuery_ID=HausnummernZuStrasse&strassenname=Street");
25
+ });
26
+ });
27
+
28
+ describe("searchGazetteer", function () {
29
+ const consoleError = console.error;
30
+
31
+ beforeEach(() => {
32
+ if (global.fetch) {
33
+ fetch.mockClear();
34
+ }
35
+ });
36
+
37
+ // to reset show error on load in console
38
+ afterEach(() => {
39
+ console.error = consoleError;
40
+ });
41
+
42
+ it("constructs an URL and requests it", async function () {
43
+ global.fetch = jest.fn().mockImplementationOnce(() => {
44
+ return new Promise((resolve) => {
45
+ resolve({
46
+ ok: true,
47
+ status: 200,
48
+ text: () => "Gazetteer Response"
49
+ });
50
+ });
51
+ });
52
+
53
+ await searchGazetteer("district", "district name");
54
+
55
+ expect(fetch).toHaveBeenCalledWith(`${defaults.gazetteerUrl}&StoredQuery_ID=findeStadtteil&stadtteilname=district%20name`, {"signal": undefined, "timeout": 6000});
56
+ });
57
+ });
58
+ });
@@ -0,0 +1,22 @@
1
+ import {setShowGeographicIdentifier, getShowGeographicIdentifier} from "../../src/searchAddress";
2
+ import defaults from "../../src/defaults";
3
+
4
+ describe("searchAddress", () => {
5
+ describe("setShowGeographicIdentifier/showGeographicIdentifier", () => {
6
+ it("showGeographicIdentifier url can be setted and getted, is initially default", () => {
7
+ const initialState = getShowGeographicIdentifier();
8
+
9
+ expect(initialState).toEqual(defaults.showGeographicIdentifier);
10
+ setShowGeographicIdentifier(true);
11
+ expect(getShowGeographicIdentifier()).toEqual(true);
12
+ setShowGeographicIdentifier(initialState);
13
+ });
14
+
15
+ it("setting showGeographicIdentifier with falsy value means not changing previous value", () => {
16
+ const initialState = getShowGeographicIdentifier();
17
+
18
+ setShowGeographicIdentifier(undefined);
19
+ expect(getShowGeographicIdentifier()).toEqual(initialState);
20
+ });
21
+ });
22
+ });