sebastianpauli / netgis-client

WebGIS-Client in development for NetGIS / Geoportal RLP.
MIT License
4 stars 0 forks source link

Initialisierung mit nicht-editierbarer Geometrie #21

Closed Rastopapola closed 3 weeks ago

Rastopapola commented 11 months ago

Status quo

Geometrie kann initial mitgegeben werden, indem <input> Element entsprechend attributiert wird:

<input type="hidden" id="netgis-storage" name="geom" value="{...}">

Hier wird value mit einem geojson befüllt, bspw.:

{
  "type": "FeatureCollection",
  "crs": {
    "type": "name",
    "properties": {
      "name": "urn:ogc:def:crs:EPSG::25832"
    }
  },
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              409983.316561479,
              5556327.22386169
            ],
            [
              409960.252811924,
              5556319.01473049
            ],
            [
              409971.999619454,
              5556303.25962525
            ],
            [
              410000.516645892,
              5556284.41910616
            ],
            [
              410038.389636923,
              5556266.08214757
            ],
            [
              409983.316561479,
              5556327.22386169
            ]
          ]
        ]
      }
    }
  ]
}

Die übergebene Geometrie wird als die Geometrie des Kartenclients interpretiert und im Layer Zeichnung zur Bearbeitung verwendet.

Es ist nicht möglich weitere nicht bearbeitbare Geometrien mitzugeben, die angezeigt (und zum Einrasten genutzt werden können) aber nicht verändert werden können.

Enhancement (Möglichkeit 1)

Die Gruppe Zeichnung enthält aktuell nur einen gleichnamigen Layer: grafik

Stattdessen soll es einen Layer Bearbeitbar und Nicht bearbeitbar geben. Wobei Bearbeitbar von der Funktion her identisch mit ehemals Zeichnung sein soll.

Das an den Client übergebene Geojson soll durch folgende Attribute erweitert werden:

Das neue Geojson könnte wie folgt aussehen:

{
  "type": "FeatureCollection",
  "crs": {
    "type": "name",
    "properties": {
      "name": "urn:ogc:def:crs:EPSG::25832"
    }
  },
  "features": [
    {
      "type": "Feature",
      "isEditable": true,
      "title": "Eingriffsfläche",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              409983.316561479,
              5556327.22386169
            ],
            [
              409960.252811924,
              5556319.01473049
            ],
            [
              409971.999619454,
              5556303.25962525
            ],
            [
              410000.516645892,
              5556284.41910616
            ],
            [
              410038.389636923,
              5556266.08214757
            ],
            [
              409983.316561479,
              5556327.22386169
            ]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "isEditable": false,
        "title": "KOM-123456"
        "coordinates": [
          [
            [
              409983.316561479,
              5556327.22386169
            ],
            [
              409960.252811924,
              5556319.01473049
            ],
            [
              409971.999619454,
              5556303.25962525
            ],
            [
              410000.516645892,
              5556284.41910616
            ],
            [
              410038.389636923,
              5556266.08214757
            ],
            [
              409983.316561479,
              5556327.22386169
            ]
          ]
        ]
      }
    },
  ]
}

Enhancement (Möglichkeit 2)

Um bearbeitbare und nicht-bearbeitbare Geometrien nicht miteinander zu vermischen (beide über value übergeben), kann alternativ die nicht bearbeitbare Geometrie über das <main> Element hinzugefügt werden:

<main id="container" data-editable="true" data-readOnlyGeometry="..." style="position: relative; width: 100%; height: 100%;">
</main>

In diesem Fall ist das Attribut isEditable im GeoJson nicht notwendig. Funktionsweise für title bleibt bestehen.

Rückmeldung und Diskussion zu den beiden Möglichkeiten ist erwünscht.

Snapping

Die nicht bearbeitbare Geometrie soll wie eine andere Geometrie/ein WFS auch für u.a. Snapping verwendbar sein.

Config.json

Das styles Element wird um einen weiteren Style für nicht editierbare, initiale Geometrien erweitert (bspw. nonEditLayer). Dieser Style soll von den in Nicht bearbeitbar befindlichen Geometrien genutzt werden:

Bsp:

...

    "styles":
    {
        "nonEditLayer":
        {
            "fill": "rgba( 100, 100, 100, 0.2 )",
            "stroke": "#ff0000",
            "strokeWidth": 3,
            "pointRadius": 6
        },
        "editLayer":
        {
            "fill": "rgba( 255, 0, 0, 0.2 )",
            "stroke": "#ff0000",
            "strokeWidth": 3,
            "pointRadius": 6
        },
               ...
        }
Rastopapola commented 8 months ago

Enhancement (Möglichkeit 3)

Die ersten beiden Umsetzungen wären statisch, d.h. sie werden initial dem Kartenclient übergeben. Das kann in folgenden Fällen nachteilig sein:

  1. Übergebene nicht-editierbare Geometrien sind sehr groß und/oder es handelt sich um sehr viele
    1. Hierbei könnten sich Performanceprobleme ergeben, wenn nur 10% der übergebenen Geometrie für den lokalen Fall im Kartenausschnitt von Relevanz sind
  2. Dynamik in der Kartendarstellung wird benötigt

Lazy loading (event based)

Anstatt die nicht-editierbare Geometrie zu hinterlegen, kann eine url hinterlegt werden, welche mit den Geometrien (geojson) antwortet, die sich im übergebenen Kartenausschnitt befinden. Diese url (ggf. mehrere) könnten bei jedem Verschieben des Kartenbildes angefragt werden.

<main id="container" data-editable="true" data-readOnlyGeometryURL="https://example.org/context1;https://example.org/context2" style="position: relative; width: 100%; height: 100%;">
</main>

Mit ; können einzelne URLs separiert werden. Ein möglicher Request könnte dann wie folgt aussehen:

https://example.org/context1?bbox=x1,x2,y1,y2

Wo x1, x2, y1 und y2 die Bounding box des aktuellen Kartenausschnitts aufspannen.

Anmerkung

Eine Kombination aus Möglichkeit 2 und Möglichkeit 3 ist ebenso denkbar: Statische Initialisierung mit einfachen Geometrien, komplexe Geometrien lediglich über URLs abrufbar (sofern angegeben).

Feedback ist sehr erwünscht

sebastianpauli commented 3 weeks ago

Added in latest LANIS Update.

Features from the GeoJSON inside the storage input value can now have "properties": { "editable": true } to define into which layer they are imported (editable or not).

Example:

<input type="hidden" id="netgis-storage" name="output" value='{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[385947.1733847084,5587420.133948028],[385924.7215815909,5587575.524501444],[385983.8340881849,5587720.975589848],[386108.3204437366,5587816.649279207],[386128.61293018516,5587825.002716699],[386287.15210903366,5587844.293282578],[386433.12464682607,5587779.495015839],[386525.16063342174,5587648.972319218],[386533.51636313583,5587625.702029063],[386546.62565086246,5587472.317275605],[386481.9349259469,5587332.625306874],[386356.47850408487,5587243.409712766],[386337.3796933098,5587236.249623489],[386187.71257841075,5587220.454999909],[386049.20810348407,5587279.329662044],[385956.72279009596,5587398.057006087],[385947.1733847084,5587420.133948028]]]},"properties":null},{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[386993.0181936734,5587227.7525485065],[386633.3370473852,5587978.680763736],[386923.60604263534,5588546.60966601],[387617.727553016,5588420.403243283],[387642.9683352116,5587934.508515782],[387232.80562453216,5588029.163332827],[387333.7687533148,5587549.578926463],[387655.5887263095,5587530.647963054],[387377.9401221572,5586893.305528278],[386993.0181936734,5587227.7525485065]]]},"properties":null},{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[385705.73830169474,5586685.064930778],[386551.3045052493,5587019.511951006],[386993.0181936734,5586697.685573051],[386658.57782958087,5586306.445662595],[385970.76651474915,5586173.928918731],[385705.73830169474,5586685.064930778]]]},"properties": { "editable": true } }],"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::25832"}},"area":1928455.8138341408}' />

grafik