diff --git a/docs/MapColonies/3D/Guides/3D_getting_started.md b/docs/MapColonies/3D/Guides/3D_getting_started.md
index c48d0f8b06..5f81b4df57 100644
--- a/docs/MapColonies/3D/Guides/3D_getting_started.md
+++ b/docs/MapColonies/3D/Guides/3D_getting_started.md
@@ -42,7 +42,7 @@ flowchart LR
Query **3D CSW catalog** service to find item(s) according to desired filter [example are here](/docs/ogc/protocols/ogc-csw/ogc-csw-examples)
-Filter should be based on [3D profile](/docs/MapColonies/3D/services/catalog/catalog-profile-v2)
+Filter should be based on [3D profile](/docs/MapColonies/3D/services/catalog/catalog-profile-v2).
:::warning
Pay attention to set the following parameter 'outputSchema="http://schema.mapcolonies.com/3d"' in order to get full catalog data
@@ -197,99 +197,7 @@ In the Response, look for
:::
## Get terrain provider URI (Step 2.1, optional)
-This section explains how to query "Best" terrain for complementing the `3D models` and giving a true 3D visualization. If you wish to get a specifc terrain please use [DEM Getting Started Guide](/docs/MapColonies/DEM/Guides/DEM_getting_started.md)
-
-To query the "Best" terrain, use the following:
-```xml title="GetRecords Request For Terrain"
-POST Request
-
-url:
-'<3D_CATALOG_SERVICE_URL>/csw'
-
-body (XML):
-
-
-
- full
-
-
-
-
-
- mc:productType
-
-
-
- QuantizedMeshDTMBest
-
-
-
-
-
-
-
-```
-
-You will get GetRecords XML Response with product **metadata**.
-
-
- Response example
-
-```xml title="Search Results Example"
-
-
-
-
-
- 4.0
- 5
- 2022-10-24
- {"type":"Polygon","coordinates":[[[34.98,32.8],[35.1,32.8],[35.1,32.7],[34.98,32.7],[34.98,32.8]]]}
- North
- 999.0
- 33333333-3333-3333-3333-333333333333
- 2022-10-24
- https://tiles.mapcolonies.net/api/dem/v1/terrains/srtm100
- producer
- 35.2670012825,32.5856881598,35.3105702702,32.6300363309
- 33333333-3333-3333-3333-333333333333
- srtm100
-
- PUBLISHED
- QuantizedMeshDTMBest
- Test subtype
- 1
-
- 1
- region
- UNDEFINED
- 2022-10-24
- 2022-10-24
- 4326
- WGS84GEO
- RECORD_3D
- 2022-10-25T16:48:17Z
-
- 32.7 34.98
- 32.8 35.1
-
-
-
-
-```
-
-
-
-```xml title="Extract link for terrain provider"
-
- http://tiles.com/terrains/srtm100/layer.json
-
-```
-
-
-:::info
-**You need to save `` element value as TERRAIN_URL, which is a terrain provider consumption URL.**
-:::
+Read more in the [DEM Terrain Provider Guide](/docs/MapColonies/DEM/Guides/terrain-provider).
## Step 3
### Construct Client side Layer
diff --git a/docs/MapColonies/DEM/Guides/DEM_getting_started.md b/docs/MapColonies/DEM/Guides/DEM_getting_started.md
deleted file mode 100644
index e7c5573bf1..0000000000
--- a/docs/MapColonies/DEM/Guides/DEM_getting_started.md
+++ /dev/null
@@ -1,202 +0,0 @@
----
-id: dem-getting-started
-slug: dem-getting-started
-title: Getting started
-tags:
- - guide
- - DEM
- - DTM
- - DSM
- - terrain
- - getting-started
----
-
-## Step by step guide
-The following guide will help you understand, ***Step-by-step*** the best practices of how to work with the Map Colonies **DEM** Catalog and how to consume mapping products in a ***dynamic way*** (materials might be changed or added)
-
-## Flow diagram
-```mermaid
-flowchart LR
- subgraph Prerequisite
- direction LR
- a1[Define filter]
- a2[Get Auth Token]
- end
-
- a1 -- filter --> B[STEP 1
Query CSW catalog]
- a2 -- token --> B
- subgraph Metadata drill-down
- direction LR
- c1[STEP 2
Get DEM metadata]
- c2[STEP 2.1 optional
Get terrain provider URI]
- end
- B -- xml --> c1
- B -- xml --> c2
- c1 -. IN DEVELOPMENT
metadata
of available for export data .-> E[STEP 3
Your system]
- c2 -- terrain_URI --> D[STEP 3.1
Cesium]
-
- linkStyle 4 color:green,stroke:#f4cccc,stroke-width:5px %% Arrow
-```
-
-## Query CSW catalog (Step 1)
-Query **DEM CSW catalog** service to find item(s) according to desired filter [examples are here](/docs/ogc/protocols/ogc-csw/ogc-csw-examples)
-
-Filter should be based on [DEM profile](/docs/MapColonies/DEM/Services/catalog/catalog-profile-v1)
-
-Example query based on `mc:classification` profile field
-```xml title="GetRecords Request"
-POST Request
-
-url:
-'/csw'
-
-body (XML):
-
-
-
- full
-
-
-
-
- mc:classification
- 5
-
-
- mc:productType
- DTM
-
-
-
-
-
-
-```
-
-You will get GetRecords XML Response with product **metadata**.
-
-
- Response example
-
-```xml title="Search Results Example"
-
-
-
-
-
- 999.0
- 5
- {"type":"Polygon","coordinates":[[[31.2603,33.4345],[31.2603,34.4888],[32.3353,34.4888],[32.3353,33.4345],[31.2603,33.4345]]]}
- ישראל
- 999.0
- c2bbeeee-6081-4e69-918c-287f48ea244d
- http://dem-server/15211-65da-4523-9d6f-08016ad51b0d....
- DAVID
- 31.2603,33.4345,32.3353,34.4888
- c2bbeeee-6081-4e69-918c-287f48ea244d
- מודל פריז
- DTM
- 1
- photogrammetric
- P-30
- 1
- צפון
- sensor1
- 2022-06-15T10:39:00Z
- 2022-06-15T10:39:00Z
- 4567
- WGS24GEO
- RECORD_DEM
-
- 33.4345 31.2603
- 34.4888 32.3353
-
-
-
- 999.0
- 5
- 2022-06-15
- srtm100
- {"type":"Polygon","coordinates":[[[35.2670012825,32.5856881598],[35.2670012825,32.6300363309],[35.3105702702,32.6300363309],[35.3105702702,32.5856881598],[35.2670012825,32.5856881598]]]}
- North
- 999.0
- 11111111-1111-1111-1111-111111111111
- http://terrain-server.com/terrains/srtm100
- MIKI
- 35.2670012825,32.5856881598,35.3105702702,32.6300363309
- 11111111-1111-1111-1111-111111111111
- srtm100
- DTM
- 1
-
-
- 1
- Israel
- UNDEFINED
- 2022-06-15
- 2022-06-15
- 4326
- WGS84GEO
- RECORD_DEM
-
- 32.5856881598 35.2670012825
- 32.6300363309 35.3105702702
-
-
-
-
-```
-
-
-:::info
-**Authentication must be integrated in order to communicate with Catalog services.**
-**See the principles [here](/docs/MapColonies/authentication)**
-:::
-
-## Get DEM metadata (Step 2)
-In the Response, look for desired data according to profile definition.
-
-## Get terrain provider URI (Step 2.1, optional)
-In the Response, look for
-
-```xml title="Extract link for terrain provider"
-
- http://terrain-server.com/terrains/srtm100
-
-```
-
-:::info
-**You should extract the `` element value as TERRAIN_URL variable, which is a terrain provider consumption URL for the following steps.**
-:::
-
-## Using catalog data (Step 3)
-In the future, you'll be able to export catalog data( elevation raw data in TIFF format ) after filtering.
-
-## Construct Client (Step 3.1)
-Now, after you got all product metadata that you need by querying our Catalog, lets actually use it in your client application.
-
-:::warning
-**Below examples are based on `Pseudo code`, you will have to adapt it in your own application to make it work.**
-:::
-
-### Cesium
-
-:::info
-**The minimum required version for cesium is v84.**
-:::
-
-```javascript
-// **Optional** add to Cesium terrain provider in order to clamp 3d models to the ground or investigate terrain
-viewer.terrainProvider = new Cesium.TerrainProvider({
- url: new Cesium.Resource({
- url: "",
- queryParameters: {
- "token": "",
- },
- }),
-});
-...
-```
-Replace `` with the URL link that you got from **Step 2.1 (optional)**.
-
-Replace `` with the token you have.
diff --git a/docs/MapColonies/DEM/Guides/height_extraction.md b/docs/MapColonies/DEM/Guides/height_extraction.md
new file mode 100644
index 0000000000..47b91257f3
--- /dev/null
+++ b/docs/MapColonies/DEM/Guides/height_extraction.md
@@ -0,0 +1,967 @@
+---
+id: height-extraction
+slug: height-extraction
+title: Height Extraction
+tags:
+ - guide
+ - DEM
+ - DTM
+ - DSM
+ - getting-started
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+## Step by step guide
+The following guide will help you understand ***Step-by-step*** how to work with the Map Colonies Height Extraction service, from the [Catalog](/docs/MapColonies/DEM/Services/catalog/dem-catalog) to the WCS protocol.
+
+:::warning
+This guide is intended for algorithmic design, not visual presentation.
+:::
+
+:::warning
+**Any** request to our services should include a `token` as a form of [authentication](/docs/MapColonies/authentication).
+:::
+
+:::note
+Please note the [obligations](/docs/MapColonies/obligations) you need to follow while using our services.
+:::
+
+## Flow diagram
+```mermaid
+flowchart LR
+ subgraph sub1 [Prerequisites]
+ direction LR
+ a1[Define filter]
+ a2[Get Auth Token]
+ end
+
+ c[Step 1
Catalog] --> d
+ d[Step 2
Get Capabilities] --> e
+ e[Step 2
Describe Coverage] --> f
+ f[Step 3
Get Coverage]
+
+ sub1 -- request --> c
+ c -- Metadata --> e
+ c -- Metadata --> f
+```
+
+## Query the DEM catalog (Step 1)
+
+Query the **DEM catalog** service to find item(s) according to a desired filter [examples are here](/docs/ogc/protocols/ogc-csw/ogc-csw-examples).
+
+Filter should be based on fields in the [DEM profile](/docs/MapColonies/DEM/Services/catalog/dem-catalog-profile-v2).
+
+
+
+When we want to get all of the records in the catalog we can make the following query:
+
+```bash
+curl --location --request POST '{DEM_CATALOG_SERVICE_URL}/csw?token=' \
+--header 'Content-Type: application/xml' \
+--data-raw '
+
+
+ full
+
+'
+```
+
+
+ Response
+ ```xml
+
+
+
+
+
+ 2019-12-31T11:00:00Z
+ 2019-12-31T11:00:00Z
+ Area
+ 0
+ FLOAT32
+
+ {"type":"Polygon","coordinates":[[[0,0],[10,0],[10,10],[0,0]]]}
+ Orthometric
+ 5773
+ EGM96
+ e2d812ba-40b7-4dfe-b3e7-869356467d3a
+ 2025-12-31T10:17:16Z
+ 2020-12-31T11:00:00Z
+ {WCS_SERVICE_URL}/wcs?request=GetCapabilities
+ {WCS_SERVICE_URL}/wcs
+ {WFS_SERVICE_URL}/wfs?request=GetCapabilities
+ {DOWNLOAD_SERVICE_URL}/path/to/file.ext
+ 2
+ 6
+ 4
+ 0.0004
+ 40
+ 1
+ 5
+ 3
+ 0.0004
+ 40
+ -32768
+ PRODUCER
+ product
+ product
+ DSM
+ 1
+ region
+ sensors
+ 4326
+ WGS84GEO
+ RECORD_DEM
+ 2020-12-31T11:00:00Z
+
+ 0.0 0.0
+ 10.0 10.0
+
+
+
+
+ ```
+
+
+
+
+To fetch a specific layer you need the following values:
+1. `productId`
+2. `productType`
+
+Usually you make this kind of request when you know there's a specific product that you want.
+
+When you have these values in hand you can make a `POST` request to `{DEM_CATALOG_SERVICE_URL}/csw` with the following body (replace `productId` and `productType` with real values):
+```bash
+curl --location --request POST '{DEM_CATALOG_SERVICE_URL}/csw?token=' \
+--header 'Content-Type: application/xml' \
+--data-raw '
+
+
+ full
+
+
+
+
+ mc:productId
+ product
+
+
+ mc:productType
+ DSM
+
+
+
+
+
+'
+```
+
+
+ Response
+ ```xml
+
+
+
+
+
+ 2019-12-31T11:00:00Z
+ 2019-12-31T11:00:00Z
+ Area
+ 0
+ FLOAT32
+
+ {"type":"Polygon","coordinates":[[[0,0],[10,0],[10,10],[0,0]]]}
+ Orthometric
+ 5773
+ EGM96
+ e2d812ba-40b7-4dfe-b3e7-869356467d3a
+ 2025-12-31T10:17:16Z
+ 2020-12-31T11:00:00Z
+ {WCS_SERVICE_URL}/wcs?request=GetCapabilities
+ {WCS_SERVICE_URL}/wcs
+ {WFS_SERVICE_URL}/wfs?request=GetCapabilities
+ {DOWNLOAD_SERVICE_URL}/path/to/file.ext
+ 2
+ 6
+ 4
+ 0.0004
+ 40
+ 1
+ 5
+ 3
+ 0.0004
+ 40
+ -32768
+ PRODUCER
+ product
+ product
+ DSM
+ 1
+ region
+ sensors
+ 4326
+ WGS84GEO
+ RECORD_DEM
+ 2020-12-31T11:00:00Z
+
+ 0.0 0.0
+ 10.0 10.0
+
+
+
+
+ ```
+
+
+
+Fetch all products with productType DTM.
+```bash
+curl --location --request POST '{DEM_CATALOG_SERVICE_URL}/csw?token=' \
+--header 'Content-Type: application/xml' \
+--data-raw '
+
+
+ full
+
+
+
+ mc:productType
+ DTM
+
+
+
+
+'
+```
+
+
+ Response
+ ```xml
+
+
+
+
+
+ 2024-12-31T11:00:00Z
+ 2024-12-31T11:00:00Z
+ Area
+ 0
+ FLOAT32
+ {"type":"Polygon","coordinates":[[[0,0],[10,0],[10,10],[0,0]]]}
+ Orthometric
+ 5773
+ EGM96
+ d2d812ba-40b7-4dfe-b3e7-869356467d3a
+ 2025-12-31T09:55:51Z
+ 2025-12-31T11:00:00Z
+ {WCS_SERVICE_URL}/wcs?request=GetCapabilities
+ {WCS_SERVICE_URL}/wcs
+ {WFS_SERVICE_URL}/wfs?request=GetCapabilities
+ {DOWNLOAD_SERVICE_URL}/path/to/file.ext
+ 2
+ 6
+ 4
+ 0.0004
+ 40
+ 1
+ 5
+ 3
+ 0.0004
+ 40
+ -32768
+ PRODUCER
+ srtm30
+ srtm30
+ DTM
+ 1
+ region
+ sensors
+ 4326
+ WGS84GEO
+ RECORD_DEM
+ 2025-12-31T11:00:00Z
+
+ 0.0 0.0
+ 10.0 10.0
+
+
+
+
+ ```
+
+
+
+Fetch all products with productType DTM and contained in a given BBOX.
+```bash
+curl --location --request POST '{DEM_CATALOG_SERVICE_URL}/csw?token=' \
+--data-raw '
+
+
+ full
+
+
+
+
+ mc:productType
+ DTM
+
+
+ ows:BoundingBox
+
+ -10 -10
+ 20 20
+
+
+
+
+
+
+'
+```
+
+
+Fetch all products with productType DTM and intersect with a given Polygon.
+:::info
+A polygon must contain **at least 4 points**, where the first and last point are identical (a closed ring). Any number of additional points is allowed.
+
+Coordinates go in a single space-separated `gml:posList`, in **latitude longitude** order for `EPSG:4326`. The GML2 form (`gml:outerBoundaryIs` / `gml:coordinates`) is not supported.
+:::
+```bash
+curl --location --request POST '{DEM_CATALOG_SERVICE_URL}/csw?token=' \
+--data-raw '
+
+
+ full
+
+
+
+
+ mc:productType
+ DTM
+
+
+ ows:BoundingBox
+
+
+
+
+ [COORD1_LAT] [COORD1_LON] [COORD2_LAT] [COORD2_LON] [COORD3_LAT] [COORD3_LON] ... [COORDN_LAT] [COORDN_LON] [COORD1_LAT] [COORD1_LON]
+
+
+
+
+
+
+
+
+
+'
+```
+
+
+Fetch all products with productType DTM that intersect with a given Point.
+```bash
+curl --location '{DEM_CATALOG_SERVICE_URL}/csw?token=' \
+--data '
+
+
+ full
+
+
+
+
+ mc:productType
+ DTM
+
+
+ ows:BoundingBox
+
+ 5 5
+
+
+
+
+
+
+'
+```
+
+
+
+Notice the attributes `startPosition` and `maxRecords`, both of them help us to implement the `pagination` concept. In result, we get the following attributes in the response:
+
+- `numberOfRecordsMatched` indicating the total amount of records in the catalog matching our filters
+- `numberOfRecordsReturned` indicating the amount of records returned for this request (may be less than `maxRecords` given in the request)
+- `nextRecord` the value that should be passed for `startPosition` in the following request
+
+In case we are fetching the full profile without any filters our next request should look like this:
+
+```bash
+curl --location --request POST '{DEM_CATALOG_SERVICE_URL}/csw?token=' \
+--header 'Content-Type: application/xml' \
+--data-raw '
+
+
+ full
+
+'
+```
+
+## Get metadata (Step 2)
+
+In the Response, look for desired data according to profile definition.
+
+For the next steps you may want to examine the information returned from the `catalog` and extraction service additional requests in order to make calculated decisions about which `product` to use.
+
+### Catalog service
+
+:::info
+For details about each field read more [here](/docs/MapColonies/DEM/Services/catalog/dem-catalog-profile-v2).
+:::
+
+Fields you may want to filter by:
+| **Field name / Partial name** | **Filter purpose** |
+| ----------- | ----------- |
+| footprint | Specific geographical area |
+| ...Accuracy... | |
+| ...Resolution... | Min and Max resolution |
+| productType | Specific product type (for example: only DTM) |
+| srsId / srsName | Wanted horizontal SRS |
+| verticalSrsId / verticalSrsName | Wanted vertical SRS |
+| verticalType | Orthometric / Ellipsoidal heights |
+| ingestionDateUTC | Layers that were ingested before / after a given time |
+| updateDateUTC | Layers that were updated before / after a given time |
+
+### Extraction service capabilities {#capabilities}
+
+:::info
+Read more about this request [here](/docs/ogc/protocols/ogc-wcs#getcapabilities).
+:::
+
+```bash
+{WCS_SERVICE_URL}/wcs?request=GetCapabilities&token=
+```
+
+
+ Response
+ ```xml
+
+
+
+
+
+ urn:ogc:service:wcs
+ 2.0.1
+ 1.1.1
+ 1.1.0
+ http://www.opengis.net/spec/WCS/2.0/conf/core
+ http://www.opengis.net/spec/WCS_protocol-binding_get-kvp/1.0.1
+ http://www.opengis.net/spec/WCS_protocol-binding_post-xml/1.0
+ http://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crs-gridded-coverage
+
+
+
+ http://www.opengis.net/spec/GMLCOV/1.0/conf/gml-coverage
+ http://www.opengis.net/spec/GMLCOV/1.0/conf/special-format
+ http://www.opengis.net/spec/GMLCOV/1.0/conf/multipart
+ http://www.opengis.net/spec/WCS_service-extension_scaling/1.0/conf/scaling
+ http://www.opengis.net/spec/WCS_service-extension_crs/1.0/conf/crs
+ http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/interpolation
+ http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/interpolation-per-axis
+ http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/nearest-neighbor
+ http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/linear
+ http://www.opengis.net/spec/WCS_service-extension_interpolation/1.0/conf/cubic
+ http://www.opengis.net/spec/WCS_service-extension_range-subsetting/1.0/conf/record-subsetting
+ NONE
+ NONE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ XML
+
+
+
+
+ application/gml+xml
+ image/jpeg
+ image/png
+ image/tiff
+ image/tiff;application=geotiff
+ text/plain
+
+
+ ...
+ http://www.opengis.net/def/crs/EPSG/0/3857
+ ...
+ http://www.opengis.net/def/crs/EPSG/0/4326
+ ...
+ http://www.opengis.net/def/crs/EPSG/0/32600
+ http://www.opengis.net/def/crs/EPSG/0/32601
+ http://www.opengis.net/def/crs/EPSG/0/32602
+ http://www.opengis.net/def/crs/EPSG/0/32603
+ http://www.opengis.net/def/crs/EPSG/0/32604
+ http://www.opengis.net/def/crs/EPSG/0/32605
+ http://www.opengis.net/def/crs/EPSG/0/32606
+ http://www.opengis.net/def/crs/EPSG/0/32607
+ http://www.opengis.net/def/crs/EPSG/0/32608
+ http://www.opengis.net/def/crs/EPSG/0/32609
+ http://www.opengis.net/def/crs/EPSG/0/32610
+ http://www.opengis.net/def/crs/EPSG/0/32611
+ http://www.opengis.net/def/crs/EPSG/0/32612
+ http://www.opengis.net/def/crs/EPSG/0/32613
+ http://www.opengis.net/def/crs/EPSG/0/32614
+ http://www.opengis.net/def/crs/EPSG/0/32615
+ http://www.opengis.net/def/crs/EPSG/0/32616
+ http://www.opengis.net/def/crs/EPSG/0/32617
+ http://www.opengis.net/def/crs/EPSG/0/32618
+ http://www.opengis.net/def/crs/EPSG/0/32619
+ http://www.opengis.net/def/crs/EPSG/0/32620
+ http://www.opengis.net/def/crs/EPSG/0/32621
+ http://www.opengis.net/def/crs/EPSG/0/32622
+ http://www.opengis.net/def/crs/EPSG/0/32623
+ http://www.opengis.net/def/crs/EPSG/0/32624
+ http://www.opengis.net/def/crs/EPSG/0/32625
+ http://www.opengis.net/def/crs/EPSG/0/32626
+ http://www.opengis.net/def/crs/EPSG/0/32627
+ http://www.opengis.net/def/crs/EPSG/0/32628
+ http://www.opengis.net/def/crs/EPSG/0/32629
+ http://www.opengis.net/def/crs/EPSG/0/32630
+ http://www.opengis.net/def/crs/EPSG/0/32631
+ http://www.opengis.net/def/crs/EPSG/0/32632
+ http://www.opengis.net/def/crs/EPSG/0/32633
+ http://www.opengis.net/def/crs/EPSG/0/32634
+ http://www.opengis.net/def/crs/EPSG/0/32635
+ http://www.opengis.net/def/crs/EPSG/0/32636
+ http://www.opengis.net/def/crs/EPSG/0/32637
+ http://www.opengis.net/def/crs/EPSG/0/32638
+ http://www.opengis.net/def/crs/EPSG/0/32639
+ http://www.opengis.net/def/crs/EPSG/0/32640
+ http://www.opengis.net/def/crs/EPSG/0/32641
+ http://www.opengis.net/def/crs/EPSG/0/32642
+ http://www.opengis.net/def/crs/EPSG/0/32643
+ http://www.opengis.net/def/crs/EPSG/0/32644
+ http://www.opengis.net/def/crs/EPSG/0/32645
+ http://www.opengis.net/def/crs/EPSG/0/32646
+ http://www.opengis.net/def/crs/EPSG/0/32647
+ http://www.opengis.net/def/crs/EPSG/0/32648
+ http://www.opengis.net/def/crs/EPSG/0/32649
+ http://www.opengis.net/def/crs/EPSG/0/32650
+ http://www.opengis.net/def/crs/EPSG/0/32651
+ http://www.opengis.net/def/crs/EPSG/0/32652
+ http://www.opengis.net/def/crs/EPSG/0/32653
+ http://www.opengis.net/def/crs/EPSG/0/32654
+ http://www.opengis.net/def/crs/EPSG/0/32655
+ http://www.opengis.net/def/crs/EPSG/0/32656
+ http://www.opengis.net/def/crs/EPSG/0/32657
+ http://www.opengis.net/def/crs/EPSG/0/32658
+ http://www.opengis.net/def/crs/EPSG/0/32659
+ http://www.opengis.net/def/crs/EPSG/0/32660
+ http://www.opengis.net/def/crs/EPSG/0/32661
+ http://www.opengis.net/def/crs/EPSG/0/32662
+ http://www.opengis.net/def/crs/EPSG/0/32663
+ http://www.opengis.net/def/crs/EPSG/0/32664
+ http://www.opengis.net/def/crs/EPSG/0/32665
+ http://www.opengis.net/def/crs/EPSG/0/32666
+ http://www.opengis.net/def/crs/EPSG/0/32667
+ http://www.opengis.net/def/crs/EPSG/0/32700
+ http://www.opengis.net/def/crs/EPSG/0/32701
+ http://www.opengis.net/def/crs/EPSG/0/32702
+ http://www.opengis.net/def/crs/EPSG/0/32703
+ http://www.opengis.net/def/crs/EPSG/0/32704
+ http://www.opengis.net/def/crs/EPSG/0/32705
+ http://www.opengis.net/def/crs/EPSG/0/32706
+ http://www.opengis.net/def/crs/EPSG/0/32707
+ http://www.opengis.net/def/crs/EPSG/0/32708
+ http://www.opengis.net/def/crs/EPSG/0/32709
+ http://www.opengis.net/def/crs/EPSG/0/32710
+ http://www.opengis.net/def/crs/EPSG/0/32711
+ http://www.opengis.net/def/crs/EPSG/0/32712
+ http://www.opengis.net/def/crs/EPSG/0/32713
+ http://www.opengis.net/def/crs/EPSG/0/32714
+ http://www.opengis.net/def/crs/EPSG/0/32715
+ http://www.opengis.net/def/crs/EPSG/0/32716
+ http://www.opengis.net/def/crs/EPSG/0/32717
+ http://www.opengis.net/def/crs/EPSG/0/32718
+ http://www.opengis.net/def/crs/EPSG/0/32719
+ http://www.opengis.net/def/crs/EPSG/0/32720
+ http://www.opengis.net/def/crs/EPSG/0/32721
+ http://www.opengis.net/def/crs/EPSG/0/32722
+ http://www.opengis.net/def/crs/EPSG/0/32723
+ http://www.opengis.net/def/crs/EPSG/0/32724
+ http://www.opengis.net/def/crs/EPSG/0/32725
+ http://www.opengis.net/def/crs/EPSG/0/32726
+ http://www.opengis.net/def/crs/EPSG/0/32727
+ http://www.opengis.net/def/crs/EPSG/0/32728
+ http://www.opengis.net/def/crs/EPSG/0/32729
+ http://www.opengis.net/def/crs/EPSG/0/32730
+ http://www.opengis.net/def/crs/EPSG/0/32731
+ http://www.opengis.net/def/crs/EPSG/0/32732
+ http://www.opengis.net/def/crs/EPSG/0/32733
+ http://www.opengis.net/def/crs/EPSG/0/32734
+ http://www.opengis.net/def/crs/EPSG/0/32735
+ http://www.opengis.net/def/crs/EPSG/0/32736
+ http://www.opengis.net/def/crs/EPSG/0/32737
+ http://www.opengis.net/def/crs/EPSG/0/32738
+ http://www.opengis.net/def/crs/EPSG/0/32739
+ http://www.opengis.net/def/crs/EPSG/0/32740
+ http://www.opengis.net/def/crs/EPSG/0/32741
+ http://www.opengis.net/def/crs/EPSG/0/32742
+ http://www.opengis.net/def/crs/EPSG/0/32743
+ http://www.opengis.net/def/crs/EPSG/0/32744
+ http://www.opengis.net/def/crs/EPSG/0/32745
+ http://www.opengis.net/def/crs/EPSG/0/32746
+ http://www.opengis.net/def/crs/EPSG/0/32747
+ http://www.opengis.net/def/crs/EPSG/0/32748
+ http://www.opengis.net/def/crs/EPSG/0/32749
+ http://www.opengis.net/def/crs/EPSG/0/32750
+ http://www.opengis.net/def/crs/EPSG/0/32751
+ http://www.opengis.net/def/crs/EPSG/0/32752
+ http://www.opengis.net/def/crs/EPSG/0/32753
+ http://www.opengis.net/def/crs/EPSG/0/32754
+ http://www.opengis.net/def/crs/EPSG/0/32755
+ http://www.opengis.net/def/crs/EPSG/0/32756
+ http://www.opengis.net/def/crs/EPSG/0/32757
+ http://www.opengis.net/def/crs/EPSG/0/32758
+ http://www.opengis.net/def/crs/EPSG/0/32759
+ http://www.opengis.net/def/crs/EPSG/0/32760
+ http://www.opengis.net/def/crs/EPSG/0/32761
+ http://www.opengis.net/def/crs/EPSG/0/32762
+ http://www.opengis.net/def/crs/EPSG/0/32763
+ http://www.opengis.net/def/crs/EPSG/0/32764
+ http://www.opengis.net/def/crs/EPSG/0/32765
+ http://www.opengis.net/def/crs/EPSG/0/32766
+ ...
+
+
+ http://www.opengis.net/def/interpolation/OGC/1/nearest-neighbor
+ http://www.opengis.net/def/interpolation/OGC/1/linear
+ http://www.opengis.net/def/interpolation/OGC/1/cubic
+
+
+
+
+
+ product
+
+ product
+ WCS
+ GeoTIFF
+
+ dem__product-DTM
+ RectifiedGridCoverage
+
+ 473139.25219177455 3230615.3954787063
+ 873608.5831505858 3831319.391916923
+
+
+ 32.70697763422942 29.149161895068794
+ 37.071150249328454 34.62339561526329
+
+
+
+ product
+
+ product
+ WCS
+ GeoTIFF
+
+ dem__product-DSM
+ RectifiedGridCoverage
+
+ 473139.25219177455 3230615.3954787063
+ 873608.5831505858 3831319.391916923
+
+
+ 32.70697763422942 29.149161895068794
+ 37.071150249328454 34.62339561526329
+
+
+
+ srtm30
+
+ srtm30
+ WCS
+ GeoTIFF
+
+ dem__srtm30-DTM
+ RectifiedGridCoverage
+
+ 34.716796875 32.16796875
+ 35.68359375 32.958984375
+
+
+ 34.716796875 32.16796875
+ 35.68359375 32.958984375
+
+
+
+
+
+ ```
+
+
+#### Understanding the capabilities response
+
+Read more [here](/docs/ogc/protocols/ogc-wcs#understanding-capabilities).
+
+### Extraction service coverage metadata
+
+:::info
+Read more about this request [here](/docs/ogc/protocols/ogc-wcs#describecoverage).
+:::
+
+For this step we need the `coverageId` of a product we selected from the previous steps. The wanted ID should look like this: `-`.
+
+:::info
+The WCS service accepts the `coverageId` with or without the internal workspace prefix, but the prefix form differs by WCS version: `dem:srtm30-DTM` works in both 1.0.0 and 2.0.1, and 2.0.1 also accepts `dem__srtm30-DTM`. The examples in this guide use the un-prefixed form, which works in both versions.
+:::
+
+Lets select the product `srtm30`, this means our ID will be `srtm30-DTM` and our request will be:
+
+```bash
+curl --location --request GET '{WCS_SERVICE_URL}/wcs?request=DescribeCoverage&version=2.0.1&coverageId=srtm30-DTM&token='
+```
+
+
+ Response
+ ```xml
+
+
+
+ Generated from GeoTIFF
+ srtm30-DTM
+
+
+ 32.16796875 34.716796875
+ 32.958984375 35.68359375
+
+
+ dem__srtm30-DTM
+
+
+ Linear
+ 0 0
+
+
+
+
+
+ srtm30-DTM
+ WCS
+ GeoTIFF
+
+
+
+
+
+
+
+ 0 0
+ 2815 2303
+
+
+ i j
+
+
+ 32.95881271362305 34.71696853637695
+
+
+ 0.0 3.4332275390625E-4
+ -3.4332275390625E-4 0.0
+
+
+
+
+
+
+ GRAY_INDEX
+
+
+ -32768.0
+
+
+
+
+
+ -32768 32767
+
+
+
+
+
+
+
+ RectifiedGridCoverage
+ image/tiff
+
+
+
+ ```
+
+
+You should save the `srsName`, `axisLabels` and `srsDimension` attributes from the `gml:Envelope` element for [step 3](#get-coverage). These describe how to compose `subset=` parameters and what CRS the coverage is natively stored in (see examples).
+
+#### Understanding the extraction service coverage metadata
+
+Read more [here](/docs/ogc/protocols/ogc-wcs#understanding-describe-coverage).
+
+## Request elevation data (Step 3) {#get-coverage}
+
+Now we can actually make a request for elevation data.
+
+:::danger
+We recommend you don't use the following `query parameters` when making requests:
+- `scaleSize`
+- `scaleFactor`
+- `scaleAxes`
+- `outputCRS`
+- `interpolation`
+
+These parameters require additional calculations on the server-side which means that the original data is changed on-the-fly resulting in new data with different attributes such as `resolution` or `accuracy`.
+**Any** use of these parameters is the sole responsibility of the user as we cannot know the resulting requests metadata.
+:::
+
+For all of the examples in this section we need the following parameters:
+- `coverageId`
+
+In the examples we show the use of specific parameter values, to see what other values you can use, review the [service capabilities](#capabilities).
+
+### Get whole coverage
+
+:::warning
+To maintain system stability and prevent oversized payloads, the service enforces a **maximum output size limit**. Exceeding this limit will trigger the following error:
+
+```xml
+
+
+
+ This request is trying to generate too much data, the limit is 1500MB but the actual amount of bytes to be written in the output is 5000MB
+
+
+```
+
+Most coverages will be larger than the limit so we suggest you [directly download](/docs/MapColonies/DEM/Services/download/dem-download) the source file.
+:::
+
+Here we request the whole coverage in the `geotiff` format.
+
+```bash
+curl --location '{WCS_SERVICE_URL}/wcs?request=GetCoverage&version=2.0.1&coverageId=srtm30-DTM&format=image/tiff;application=geotiff&token='
+```
+
+### Get by BBOX
+
+In most cases, we know which geographical area is of significance to us. This means that we can request the specific `BBOX` as a subset of the selected `coverage`.
+
+For example, given a coverage with the following extent:
+```xml
+
+ 32.16796875 34.716796875
+ 32.958984375 35.68359375
+
+```
+
+- `srsDimension="2"` tells you the coverage has 2 axes — you'll need one `subset=` per axis.
+- `axisLabels="Lat Long"` gives you the axis names to use in the request: `subset=Lat(...)&subset=Long(...)`.
+- `srsName="http://www.opengis.net/def/crs/EPSG/0/4326"` is the native CRS — the coordinates inside `subset=` must be expressed in this CRS, and the corner values above bound the valid range.
+
+This produces a `GetCoverage` request like:
+```bash
+curl --location --request GET '{WCS_SERVICE_URL}/wcs?request=GetCoverage&version=2.0.1&coverageId=srtm30-DTM&format=image/tiff;application=geotiff&subset=Lat(32.35306,32.49437)&subset=Long(35.13102,35.37051)&token='
+```
+
+### Convert to other CRS
+
+In some situations we will have data in a geographical area in a different CRS than we expect for our calculations. In this case we can ask the service to convert the output to the wanted CRS.
+
+Here we are making a request to a coverage in `EPSG:4326` and requesting it in `EPSG:3857`:
+
+```bash
+curl --location '{WCS_SERVICE_URL}/wcs?request=GetCoverage&version=2.0.1&coverageId=srtm30-DTM&format=image/tiff;application=geotiff&outputCRS=EPSG:3857&token='
+```
+
+### Scale image size (pixels)
+
+
+
+Set the output image to be a fixed amount of pixels.
+```bash
+curl --location '{WCS_SERVICE_URL}/wcs?request=GetCoverage&version=2.0.1&coverageId=srtm30-DTM&format=image/tiff;application=geotiff&scaleSize=i(256),j(256)&token='
+```
+
+
+Set the output image size to be a certain factor from its original size.
+```bash
+curl --location '{WCS_SERVICE_URL}/wcs?request=GetCoverage&version=2.0.1&coverageId=srtm30-DTM&format=image/tiff;application=geotiff&scaleFactor=0.1&token='
+```
+
+
+Set the output image size to be a certain factor from its original size for each axis.
+```bash
+curl --location '{WCS_SERVICE_URL}/wcs?request=GetCoverage&version=2.0.1&coverageId=srtm30-DTM&format=image/tiff;application=geotiff&scaleAxes=i(0.1),j(0.2)&token='
+```
+
+
+
+### Change interpolation method
+
+There is an option to set the wanted interpolation method.
+To see a full list of the available methods see the [capabilities](#capabilities).
+
+:::note
+The default method is `linear`.
+:::
+
+```bash
+curl --location '{WCS_SERVICE_URL}/wcs?request=GetCoverage&version=2.0.1&coverageId=srtm30-DTM&format=image/tiff;application=geotiff&interpolation=http://www.opengis.net/def/interpolation/OGC/1/nearest-neighbor&token='
+```
diff --git a/docs/MapColonies/DEM/Guides/terrain_provider.md b/docs/MapColonies/DEM/Guides/terrain_provider.md
new file mode 100644
index 0000000000..bad6cd8ed6
--- /dev/null
+++ b/docs/MapColonies/DEM/Guides/terrain_provider.md
@@ -0,0 +1,181 @@
+---
+id: terrain-provider
+slug: terrain-provider
+title: Terrain Provider
+tags:
+ - guide
+ - DEM
+ - DTM
+ - DSM
+ - terrain
+ - getting-started
+---
+
+## Step by step guide
+The following guide will help you understand, ***Step-by-step*** how to add a `terrain provider` to your application.
+
+## Flow diagram
+```mermaid
+flowchart LR
+ subgraph Prerequisite
+ direction LR
+ a1[Define filter]
+ a2[Get Auth Token]
+ end
+
+ a1 -- filter --> B[STEP 1
Query CSW catalog]
+ a2 -- token --> B
+ subgraph Metadata drill-down
+ direction LR
+ c1[STEP 2
Get DEM metadata]
+ c2[STEP 2.1 optional
Get terrain provider URI]
+ end
+ B -- xml --> c1
+ B -- xml --> c2
+ c1 -. IN DEVELOPMENT
metadata
of available for export data .-> E[STEP 3
Your system]
+ c2 -- terrain_URI --> D[STEP 3.1
Cesium]
+
+ linkStyle 4 color:green,stroke:#f4cccc,stroke-width:5px %% Arrow
+```
+
+## Query CSW catalog (Step 1)
+
+:::info
+
+The terrain provider link is available in both the `3D catalog` and the `DEM catalog`.
+
+:::
+
+:::info
+
+**Authentication must be integrated in order to communicate with Catalog services.**
+**See the principles [here](/docs/MapColonies/authentication)**
+
+:::
+
+Query **3D CSW catalog** service to find item(s) according to desired filter [examples are here](/docs/ogc/protocols/ogc-csw/ogc-csw-examples).
+
+Filter should be based on [3D profile](/docs/MapColonies/3D/services/catalog/catalog-profile-v2).
+
+```xml title="GetRecords Request For Terrain"
+POST Request
+
+url:
+'<3D_CATALOG_SERVICE_URL>/csw'
+
+body (XML):
+
+
+
+ full
+
+
+
+
+
+ mc:productType
+
+
+
+ QuantizedMeshDTMBest
+
+
+
+
+
+
+
+```
+
+You will get GetRecords XML Response with product **metadata**.
+
+
+ Response example
+
+```xml title="Search Results Example"
+
+
+
+
+
+ 4.0
+ 5
+ 2022-10-24
+ {"type":"Polygon","coordinates":[[[34.98,32.8],[35.1,32.8],[35.1,32.7],[34.98,32.7],[34.98,32.8]]]}
+ North
+ 999.0
+ 33333333-3333-3333-3333-333333333333
+ 2022-10-24
+ https://tiles.mapcolonies.net/api/dem/v1/terrains/srtm100
+ producer
+ 35.2670012825,32.5856881598,35.3105702702,32.6300363309
+ 33333333-3333-3333-3333-333333333333
+ srtm100
+
+ PUBLISHED
+ QuantizedMeshDTMBest
+ 1
+
+ 1
+ region
+ UNDEFINED
+ 2022-10-24
+ 2022-10-24
+ 4326
+ WGS84GEO
+ RECORD_3D
+ 2022-10-25T16:48:17Z
+
+ 32.7 34.98
+ 32.8 35.1
+
+
+
+
+```
+
+
+## Get terrain metadata (Step 2)
+In the Response, look for desired data according to profile definition.
+
+## Get terrain provider URI (Step 2.1) {#step-2.1}
+In the Response, look for a `link` tag with `scheme="TERRAIN_QMESH"`, this will be the link you need to get the data.
+
+For our case:
+
+```xml title="Extract link for terrain provider"
+
+ {TERRAIN_URL}/terrains/srtm100
+
+```
+
+Save the value as `TERRAIN_URL` for the next steps.
+
+## Construct Client (Step 3)
+Now let's see how we can load the provider in our application.
+
+:::warning
+**Below examples are based on `Pseudo code`, you will have to adapt it in your own application to make it work.**
+:::
+
+### Cesium
+
+:::info
+**The minimum required version for cesium is v1.104.**
+:::
+
+```javascript
+// **Optional** add to Cesium terrain provider in order to clamp 3d models to the ground or investigate terrain
+viewer.terrainProvider = await Cesium.CesiumTerrainProvider.fromUrl(
+ new Cesium.Resource({
+ url: "{TERRAIN_URL}",
+ queryParameters: {
+ "token": "{token}",
+ },
+ }),
+);
+...
+```
+Replace `{TERRAIN_URL}` with the URL link that you got from **[Step 2.1](#step-2.1)**.
+
+Replace `{token}` with the token we provided you.
diff --git a/docs/MapColonies/DEM/Services/CesiumTerrainProvider/README.md b/docs/MapColonies/DEM/Services/CesiumTerrainProvider/README.md
index f5905dd6af..8166228e7a 100644
--- a/docs/MapColonies/DEM/Services/CesiumTerrainProvider/README.md
+++ b/docs/MapColonies/DEM/Services/CesiumTerrainProvider/README.md
@@ -102,23 +102,25 @@ Create an instance of `Cesium.CesiumTerrainProvider`, providing the base `URL` o
```js
// A new CesiumTerrainProvider instance.
-const terrainProvider = new Cesium.CesiumTerrainProvider({
- url: 'https://your.custom.terrain.server/path/to/tiles/', // CRITICAL: This URL must be replaced with the actual URL of the custom Quantized Mesh terrain server.
- requestVertexNormals: false, // Optional: The fetching of vertex normals is to be enabled for enhanced lighting.
- requestWaterMask: false // Optional: The fetching of water masks is to be enabled for accurate water rendering.
-});
+const terrainProvider = await Cesium.CesiumTerrainProvider.fromUrl(
+ 'https://your.custom.terrain.server/path/to/tiles/', // CRITICAL: This URL must be replaced with the actual URL of the custom Quantized Mesh terrain server.
+ {
+ requestVertexNormals: false, // Optional: The fetching of vertex normals is to be enabled for enhanced lighting.
+ requestWaterMask: false // Optional: The fetching of water masks is to be enabled for accurate water rendering.
+ }
+);
```
:::info
*Critical Considerations Pertaining to the url Parameter*
The url parameter must unequivocally designate the root directory of the terrain tile service. The `CesiumTerrainProvider` internally constructs the complete path to individual tiles (e.g. level/x/y.terrain) based upon this foundational URL.
-Get the URL for the terrain server from the catalog, details [here](../../Guides/DEM_getting_started.md#query-csw-catalog-step-1)
+Get the URL for the terrain server from the catalog, details [here](../../Guides/terrain-provider#query-csw-catalog-step-1)
:::
### Assigning the Terrain Provider
-Assign the newly created terrainProvider instance to the `terrainProvider` property of the `viewer.scene` object. This action directs `Cesium.js` to utilize the specified Quantized Mesh data source for the rendering of the globe's terrain.
+Assign the newly created terrainProvider instance to the `terrainProvider` property of the `viewer` object. This action directs `Cesium.js` to utilize the specified Quantized Mesh data source for the rendering of the globe's terrain.
```js
// Assign the custom terrain provider to the viewer's scene.
@@ -166,20 +168,30 @@ Refer down in the example down blow for cesium query / header mapcolonies' token
// Create the CesiumTerrainProvider instance, referencing the custom Quantized Mesh server.
// CRITICAL: The placeholder 'https://your.custom.terrain.server/path/to/tiles/' must be substituted with the actual URL from MapColonies 3D / DEM Catalog!
- const terrainProvider = new Cesium.CesiumTerrainProvider({
- url: 'https://your.custom.terrain.server/path/to/tiles/',
- // url:new Cesium.Resource({
- // url: '',
+ Cesium.CesiumTerrainProvider.fromUrl(
+ 'https://your.custom.terrain.server/path/to/tiles/',
+ // new Cesium.Resource({
+ // url: '',
// headers: { 'x-api-key': MAPCOLONIES_TOKEN }, // choose either header or query
// queryParameters: { 'token': MAPCOLONIES_TOKEN }, // choose either header or query
- //}),
- requestVertexNormals: true, // Vertex normals are to be requested for enhanced lighting and shading.
- requestWaterMask: true // Water masks are to be requested for accurate water rendering effects.
+ // }),
+ {
+ requestVertexNormals: true, // Vertex normals are to be requested for enhanced lighting and shading.
+ requestWaterMask: true // Water masks are to be requested for accurate water rendering effects.
+ }
+ ).then(function(terrainProvider) {
+ // Assign the custom terrain provider to the viewer.
+ viewer.terrainProvider = terrainProvider;
+
+ // Add robust error handling for terrain loading.
+ // The errorEvent is dispatched if issues arise during the fetching or parsing of terrain tiles.
+ terrainProvider.errorEvent.addEventListener(function(error) {
+ console.error('An error was encountered during terrain loading:', error);
+ });
+ }).catch(function(error) {
+ console.error('CesiumTerrainProvider initialization failed', error);
});
- // Assign the custom terrain provider to the viewer's scene.
- viewer.terrainProvider = terrainProvider;
-
// Optional: The camera may be programmatically directed to a specific geographic location
// to immediately showcase the loaded terrain.
viewer.camera.flyTo({
@@ -191,22 +203,6 @@ Refer down in the example down blow for cesium query / header mapcolonies' token
},
duration: 3 // Duration of the flight in seconds
});
-
- // Add robust error handling for terrain loading.
- // The errorEvent is dispatched if issues arise during the fetching or parsing of terrain tiles.
- terrainProvider.errorEvent.addEventListener(function(error) {
- console.error('An error was encountered during terrain loading:', error);
- // In a production environment, consider using a more user-friendly message
- // or attempting to utilize a fallback terrain provider.
- });
-
- // Optional: A listener may be added for the event signifying the readiness of the terrain provider.
- // This is beneficial for executing actions only subsequent to the commencement of terrain data loading.
- terrainProvider.readyPromise.then(function() {
- console.log('CesiumTerrainProvider is ready and terrain loading has started.');
- }).otherwise(function(error) {
- console.error('CesiumTerrainProvider initialization failed', error);
- });