Skip to content

Nettopologysuite #148

@kofhoang

Description

@kofhoang

Hello! How would one accomplish this using Codecs?

type Geometry =
    { Geometry: NetTopologySuite.Geometries.Geometry }

    static member ToJson(x: Geometry) =
        let factory =
            NetTopologySuite.NtsGeometryServices.Instance.CreateGeometryFactory(x.Geometry.SRID)

        let options = JsonSerializerOptions()
        options.Converters.Add(NetTopologySuite.IO.Converters.GeoJsonConverterFactory(factory))

        jobj
            [ "srid" .= x.Geometry.SRID
              "geometry"
              .= Fleece.SystemTextJson.Extensions.Encoding(JsonSerializer.SerializeToElement(x.Geometry, options)) ]

    static member OfJson(json) =
        match json with
        | JObject o ->
            monad {
                let! (geoJson: JsonObject) = o .@ "geometry"
                let! (srid: int) = o .@ "srid"

                let factory =
                    NetTopologySuite.NtsGeometryServices.Instance.CreateGeometryFactory(srid)

                let options = JsonSerializerOptions()
                options.Converters.Add(NetTopologySuite.IO.Converters.GeoJsonConverterFactory(factory))

                return
                    { Geometry =
                        JsonSerializer.Deserialize<NetTopologySuite.Geometries.Geometry>(
                            geoJson |> Operators.toJsonValue,
                            options
                        ) }
            }
        | x -> Decode.Fail.objExpected x

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions