ObjectVision / GeoDMS

Source code for the GeoDMS software
Other
7 stars 1 forks source link

arc_length levert null values op #737

Closed basvanbemmel closed 2 months ago

basvanbemmel commented 2 months ago

GeoDMS 15.1.0 PD 10936: https://pbl.sliksvn.com/ruimtescanner/PBL/ProjDir/branches/PlanMonitor2024 SD 10937:https://pbl.sliksvn.com/ruimtescanner/PBL/SourceData/Trunk/RSL Open casus.dms items: /SourceData/Beleid2024/OmgRecht/NRMLMS/cube2024/geometry /SourceData/Beleid2024/OmgRecht/NRMLMS/cube2024/road_length /SourceData/Beleid2024/OmgRecht/NRMLMS/cube2024/length (in QGIS berekend)

Lijkt erop dat als in het geometry-veld null values voorkomen de arc_length null oplevert. zie ook screendump

image

eoudejans commented 2 months ago

In DynamicPoint.h line 19 the ArcLength function is defined as:

template <typename ReturnType, typename ConstPointPtr>
ReturnType ArcLength(ConstPointPtr arcPtr, ConstPointPtr arcEnd)
{
    if (arcPtr == arcEnd)
        return 0;

    ReturnType length = 0;
    assert(arcPtr != arcEnd);
    if (!IsDefined(*arcPtr))
        return UNDEFINED_VALUE(ReturnType);

    for (ConstPointPtr nextPtr = arcPtr; ++nextPtr != arcEnd; arcPtr = nextPtr)
    {
        if (!IsDefined(*nextPtr))
            return UNDEFINED_VALUE(ReturnType);
        length += std::sqrt(SqrDist<ReturnType>(*arcPtr, *nextPtr));
    }
    return length;
}

As can be seen from the definition of ArcLength it returns null for length if the whole input Attribute or any of the individual points is null.

basvanbemmel commented 2 months ago

Maar waardoor worden die null.null geometrieen dan veroorzaakt. QGIS heeft daar geen last van kennelijk en kan wel een lengte berekenen.

eoudejans commented 2 months ago

QGIS berekent de lengte als volgt in qgsgeometrycollection.cpp:

double QgsGeometryCollection::length() const
{
  double length = 0.0;
  QVector< QgsAbstractGeometry * >::const_iterator geomIt = mGeometries.constBegin();
  for ( ; geomIt != mGeometries.constEnd(); ++geomIt )
  {
    length += ( *geomIt )->length();
  }
  return length;
}

Waar geen rekening wordt gehouden met null in de geometrie punten lijst, het is een keuze van implementatie lijkt mij. @MaartenHilferink

basvanbemmel commented 2 months ago

In 14.14.0 wordt het wel berekend alleen daar zit je weer met de bug met extra toegevoegde lijnen die er niet horen

image

eoudejans commented 2 months ago

Maar waardoor worden die null.null geometrieen dan veroorzaakt. QGIS heeft daar geen last van kennelijk en kan wel een lengte berekenen.

Dat zouden we moeten uitzoeken, het hoeft dus niet zo te zijn dat QGIS geen null.null geometrieen tegen komt maar dat ze er anders mee om gaat. Ik haal de configuratie op en bekijk het nader.

basvanbemmel commented 2 months ago

prima dank

eoudejans commented 2 months ago

De dataset is van type multi linestring, zie datasetinformation veld geometry: image. We ondersteunen multilinestrings sinds kort zonder ons datamodel drastisch aan te hoeven passen door deze geometrie typen te encoderen met null als separator.

eoudejans commented 2 months ago

De oplossing zou zijn om de multilinestrings naar linestrings + relatie te converteren met de split_multi_linestring functie. Echter lijkt er iets mis te gaan met conversie: image ik ga dit even met @MaartenHilferink bekijken.

basvanbemmel commented 2 months ago

is prima dank dat je hier tijd voor kan maken

eoudejans commented 2 months ago

De route die ik boven aan gaf van split_multi_linestring zou moeten werken, en past @MaartenHilferink aan. Verder is er een directere functie bij gekomen namelijk mls_length, zie hieronder hoe deze te gebruiken:

    unit<uint32> cube2024
    :   StorageName     = "%RSLDataDir%/Infrastructuur/NRMLMS/2024/PM_LMS_CUBE_24_05_01_22_21_v2.gpkg"
    ,   StorageType     = "gdal.vect"
    ,   StorageReadOnly = "True"
    ,   Source          = "Python script Martijn Spoon Y:\Project\M500303_Monitor_Infrastructuur_en_Ruimte\Data\Planmonitor2024\Data\LMS PM_LMS_CUBE_24_05_01_22_21.gpkg"
                          "length berekend in QGIS 3.34.2-Prizren Add geometry attributes ivm met probleem arc_length"
    ,   SqlString       = "SELECT * FROM PM_LMS_CUBE_24_05_01_22_21_v2 WHERE NieuwTrace=1"
    {
        attribute<rdc_meter> geometry (arc);
        attribute<meter> length := mls_length(geometry, meter);

        attribute<meter> road_length:= arc_length(geometry, meter);//null values itt tot length berekend in QGIS 3.34.2-Prizren Add geometry attributes nieuw gpkg bestand met extra veld length

        attribute<fpoint>    arc_buffer(poly) := bg_buffer_linestring(geometry, 25.0, 16b);

        attribute<.>         Per_domain (Domain)  := poly2grid(arc_buffer, domain);
        attribute<bool>      IsTrace    (Domain)  := IsDefined(Per_domain);
    }

Resulterende length attribute bevat geen nulls meer:

image

MaartenHilferink commented 2 months ago

mls_length is inderdaad beschikbaar; split_multi_linestring was alleen beschikbaar voor DPolygons, sequences van DPoints; vanaf 15.2.0 ook voor de andere Point sequences, d.w.z.: FPolygon, IPolygon, UPolygon, WPolygon, en SPolygon. en de functie split_multi_numberstring voor numeric sequences.