ChilliCream / graphql-platform

Welcome to the home of the Hot Chocolate GraphQL server for .NET, the Strawberry Shake GraphQL client for .NET and Banana Cake Pop the awesome Monaco based GraphQL IDE.
https://chillicream.com
MIT License
5.23k stars 745 forks source link

Spatial output: MultiLineString gets mangled into a LineString #5352

Open fredrik-stock opened 2 years ago

fredrik-stock commented 2 years ago

Is there an existing issue for this?

Describe the bug

MultiLineStrings should be represented as [LineString, LineString, ...]. As of HC 12.12 / 13 it seems all the contained LinesStrings get concatenated into one single array of coordinates, which gets really wonky if the LineStrings aren't actually contigous:

BrokenMultiLineString

Manually serializing the same string with NTS.IO and sending it as a raw string gives the expected result:

CorrectMultiLineString

Steps to reproduce

  1. Create a MultiLineString consisting of 2 or more LineStrings.
  2. Request the MLS from your gql client.
  3. Observe that the returned output is 2-dimensional, not 3-dimensional.

Relevant log output

No response

Additional Context?

From existing issues and PRs it seems a similiar problem was fixed for MultiPolygon already.

Product

Hot Chocolate

Version

12.12.1

fredrik-stock commented 2 years ago

This might actually be an easy fix, since @PascalSenn already implemented the needed functionality in #4394.

MultiPolygons were updated to be correctly handled as a GeometryCollection, reading out the contained coordinate arrays through indexed access: https://github.com/ChilliCream/hotchocolate/blob/ef1b268c7e624808862f18c43a190fba6303677a/src/HotChocolate/Spatial/src/Types/GeoJsonMultiPolygonType.cs#L19-L23

MultiLineStrings meanwhile still access MultiLineString.Coordinates for their Coordinates field. This property "Collects all coordinates of all subgeometries into an Array", thus we get the flat structure observed: https://github.com/ChilliCream/hotchocolate/blob/ef1b268c7e624808862f18c43a190fba6303677a/src/HotChocolate/Spatial/src/Types/GeoJsonMultiLineStringType.cs#L18-L20

Worth noting is that in NTS there are three classes that extend GeometryCollection. MultiPolygon, MultiLineString and MultiPoint. MultiPoint probably wouldn't need this change since it's basically a LineString, dimension-wise.

PascalSenn commented 2 years ago

@fredrik-stock Thanks for reporting! yes this could indeed be the same problem