标签: nettopologysuite

Entity Framework Core 3.1 with NetTopologySuite.Geometries.Point: SqlException: 提供的值不是数据类型地理的有效实例

我有一个看起来像这样的模型:

public class Facility
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public NetTopologySuite.Geometries.Point Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

添加点的测试代码:

var testFacility = new Facility();
testFacility.Location = new NetTopologySuite.Geometries.Point(13.003725d, 55.604870d) { SRID = 3857 };

//Other values tested with the same error error

//testFacility.Location = new NetTopologySuite.Geometries.Point(13.003725d, 55.604870d);

//testFacility.Location = new NetTopologySuite.Geometries.Point(55.604870d, 13.003725d);

//var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 3857);
//var currentLocation = geometryFactory.CreatePoint(new Coordinate(13.003725d, 55.604870d));
//testFacility.Location = currentLocation;

db.Facilities.Add(testFacility);
//Exception on Save
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我正在使用以下 NuGets 版本 3.1.0

Microsoft.AspNetCore.Identity.EntityFrameworkCore …
Run Code Online (Sandbox Code Playgroud)

c# geospatial nettopologysuite entity-framework-core ef-core-3.1

11
推荐指数
1
解决办法
6375
查看次数

dotnet核心数据库首先使用NetTopologySuite

我最近升级到EntityFrameworkCore.PostgreSQL的最新版本,但空间数据似乎不起作用,因为他们现在使用NetTopologySuite看到这里

要设置NetTopologySuite插件,请将Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite nuget添加到项目中.然后,对UseNpgsql()行进行以下修改:

我用这个dotnet ef dbcontext scaffold命令

dotnet ef dbcontext scaffold "MyConnectionString" Npgsql.EntityFrameworkCore.PostgreSQL
Run Code Online (Sandbox Code Playgroud)

但是,该scaffold命令似乎没有使用NetTopologySuite映射.我仍然收到以下错误

Could not find type mapping for column 'public.behaviour.coord' with data type 'geometry(Point)'. Skipping column.
Run Code Online (Sandbox Code Playgroud)

如何使用NetTopologySuite构建我的数据库

c# postgresql nettopologysuite .net-core

9
推荐指数
1
解决办法
948
查看次数

NetTopologySuite 返回距离的单位是什么,我如何将其转换为英里/公里?

每当我使用 FreeMapTools 计算我和我朋友邮政编码之间的距离时,它都会给我以下信息:

  • 300.788 英里
  • 484.072 公里

显示 300.788 英里的 FreeMapTools 屏幕截图 FreeMapTools 的屏幕截图显示 484.072 公里

当我使用 NetTopologySuite 时,我得到了5.2174236612815 的返回值。

  • 5.2174236612815乘以 60 是313.04541967689
  • 5.2174236612815乘以 100 是521.74236612815

这些值与 FreeMapTools 上显示的距离相差不远,但仍然相差甚远。

我的代码如下:

using System;
using GeoAPI.Geometries;
using NetTopologySuite;

namespace TestingDistances
{
    class Program
    {
        static void Main(string[] args)
        {
            var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326);

            // BT2 8HB
            var myPostcode = geometryFactory.CreatePoint(new Coordinate(-5.926223, 54.592395));

            // DT11 0DB
            var myMatesPostcode = geometryFactory.CreatePoint(new Coordinate(-2.314507, 50.827157));

            var distance = myPostcode.Distance(myMatesPostcode);
            Console.WriteLine(distance); // returns 5.2174236612815

            Console.WriteLine(distance * 60); //similar to …
Run Code Online (Sandbox Code Playgroud)

c# geometry nettopologysuite

8
推荐指数
1
解决办法
5050
查看次数

获取多个多边形的总边界框(使用C# NetCore NetTopologySuite)

我对处理多边形数据有点陌生(在 C# 中使用NetTopologySuite),并且想要获取多个多边形的边界框,具体取决于每个多边形的边界框是否与另一个多边形重叠(多边形聚类)。

在此演示中,我有 3 个多边形,其边界框与其他多边形重叠,并且希望将红色边界框作为最终结果。

拳击

基本上我已经陷入了获取多边形边界框的困境。我试过Geometry.Boundary,但这只是恢复了外环......

最后,我可以迭代坐标,但我想知道GeometryPolygon类是否内置了此功能(或者库是否内置了此功能)。

.net geometry geospatial nettopologysuite .net-core

8
推荐指数
1
解决办法
2297
查看次数

无法将NetTopologySuite FeaturesCollection序列化为GeoJSON

试图返回一些非常简单的GeoJSON数据.我找到了NetTopologySuite,并设置了一个简单的FeaturesCollection,并试图将其序列化为GeoJson字符串,只是为了得到以下错误:

"使用类型'GeoAPI.Geometries.Coordinate'检测属性'CoordinateValue'的自引用循环.路径'特征[0] .Geometry.Coordinates [0]'."

查看类标题,Point使用Coordinate,它具有Coordinate属性,因此我可以看到为什么会有循环引用.问题是,大多数(如果不是全部)几何图形似乎都使用了Point,这样就不可能对任何东西进行序列化......除非我遗漏了一些东西.

这是一个错误还是我错过了什么?

仅使用Point进行测试并得到相同的错误,所以这里是代码:

using NTS = NetTopologySuite;

var ret = new NTS.Geometries.Point(42.9074, -78.7911);

var jsonSerializer = NTS.IO.GeoJsonSerializer.Create();

var sw = new System.IO.StringWriter();
jsonSerializer.Serialize(sw, ret);

var json = sw.ToString();
Run Code Online (Sandbox Code Playgroud)

.net c# nettopologysuite

7
推荐指数
1
解决办法
2530
查看次数

有没有办法用EntityFrameworkCore 2.2声明空间索引?

我正在使用Entity Framework Core 2.2NetTopologySuite 1.15.1SQL Server 2016.拥有一个类型的列IPoint非常有用,我想在它上面创建一个索引.

我有这张桌子

public class Location
{
    public int Id { get; set; }

    public IPoint Coordinates { get; set; }

    public static void Register(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Location>(entity => entity.HasIndex(x => new {x.Coordinates}));
    }
}
Run Code Online (Sandbox Code Playgroud)

EF核心在生成迁移时处理得很好,从而生成以下代码:

migrationBuilder.CreateIndex(
    name: "IX_Locations_Coordinates",
    schema: "data",
    table: "Locations",
    column: "Coordinates");
Run Code Online (Sandbox Code Playgroud)

但是,只要我尝试将迁移应用到数据库,SqlException就会抛出以下消息

SqlException:表'data.Locations'中的列'Coordinates'的类型无效,无法用作索引或统计信息中的键列.

SQL Server的确实对类型的列支持索引geography.

我相信原因可能是EF Core试图创建一个常规索引而不是空间索引.

我做错了什么还是不支持?有没有办法告诉EF Core它应该创建空间索引?

c# sql-server sqlgeography nettopologysuite entity-framework-core

7
推荐指数
1
解决办法
249
查看次数

更新后无法使用 EF Core 中的空间数据按距离(米)进行过滤

我有一个包含几何列的表,使用EF Core 空间数据Npgsql.EntityFrameworkCore.PostgreSQL 提供程序

class City
{
    public int ID { get; set; }

    public string CityName { get; set; }

    public Point Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我曾经这样按距离过滤

Point myLocation = new Point(longitude, latitude)
{
    SRID = 4326
};
cities = db.Cities.Where(a => a.Location.ProjectTo(2855).Distance(myLocation.ProjectTo(2855)) <= radiusMeters);
Run Code Online (Sandbox Code Playgroud)

更新后我收到以下错误:

无法翻译 LINQ 表达式“DbSet()...”。其他信息:方法“App.GeometryExtensions.ProjectTo”的翻译失败。

它无需使用即可工作ProjectTo(),但按度数计数。有没有办法再次将此查询翻译为与仪表一起使用?

c# postgis npgsql nettopologysuite entity-framework-core

7
推荐指数
0
解决办法
667
查看次数

使用 NetTopologySuite 从点集合创建多边形

从点列表创建多边形的最佳方法是什么?

我有一个点数组,如果点至少为 3 个,我想加入创建一个多边形

Dim ClickedPoint As New NetTopologySuite.Geometries.Point(coordinates)
ClickedPointArray.Add(ClickedPoint)

if   ClickedPointArray.Count > 2 then

   Polygonizer = New Polygonizer()
   Polygonizer.Add(ClickedPointArray)

end if        

return Polygonizer.GetPolygons
Run Code Online (Sandbox Code Playgroud)

我想我离解决方案还很远。你可以帮帮我吗?

.net vb.net nettopologysuite

6
推荐指数
1
解决办法
9388
查看次数

NettopologySuite 和 Dotspatial WKTReader

所以我有一堆代表多多边形的 WKT。我专门使用 DotSpatial 来操作几何图形。具体来说,我试图从我的 WKT 中获取 DotSpatial.Topology.IGeometry。

不幸的是,DotSpatial 的家伙最近将很多东西移到了 NetTopologySuit 中,这就是他们的 WKTreader 所在的地方。

但是读取器传回一个 GeoAPI.Geometries.IGeometry,您不能将其强制转换为 DotSpatial.Topology.IGeometry,因为它们不是同一个类。不得不在三个不同的 API(DotSpatial、GeoAPI 和 NetTopologySuite)之间转换本质上相同的类,这让我感到有点恼火,这些 API 都具有类似的名称。

我想要做的就是从众所周知的文本中提取 DotSpatial.Topology.IGeometry。具体来说,它是我正在使用的 MultiPolygon,但无论如何。

我真的不想有一些很好的条件或选择语句来弄清楚如何处理 GeoAPI IGeometry 类以便我可以使用它。我已经有一个很大的转换器类,用于将各种几何类转换为 dotSpatial,我宁愿完全摆脱它。更少的代码是更好的代码。

任何人都可以协助将 GeoAPI.Geometries.IGeometry 转换为 DotSpatial.Geometries.IGeometry 吗?当我收到以下错误时,我不能直接投射它:无法将“NetTopologySuite.Geometries.MultiPolygon”类型的对象投射到“DotSpatial.Topology.IGeometry”类型。

有任何想法吗?

提前致谢,E

c# geoapi nettopologysuite dotspatial

6
推荐指数
1
解决办法
3398
查看次数

如何处理可变宽度(“缓冲区”)的折线偏移?

我的问题陈述:

我有一条多段线,我想沿着这些点在一个方向上进行可变宽度偏移。我该怎么做?对于折线,我只需要支持直线,不需要支持曲线或圆弧。

多段线可以是闭合的,也可以是开放的,并且偏移仅在一个方向上——为了便于讨论,我们假设它在左侧方向。

在此输入图像描述上图 几乎概括了我想要做的事情;唯一的问题是,它在整个折线中是统一的偏移,因此我想要可变的偏移。

这个问题比乍看起来要棘手得多。有一些库并没有完全做到这一点。让我们一一分析一下。

快艇

Clipper 可以处理多边形缓冲区,这意味着在两个方向上创建偏移线,最后围绕该线形成多边形。所以不适合我的需求。此外,它不处理变量缓冲。

快船队开发者在论坛上对此进行了一些讨论,但遗憾的是没有任何结果。

网络拓扑套件

NetTopologySuite有一个VariableBuffer类,它可以处理可变偏移量。但不幸的是,NetTopologySuite 只能处理多边形缓冲(将一条线转换为包含该线的多边形),而不能处理折线偏移(其中折线在单个方向上偏移)。

另外,似乎使用上述方法 NetTopologySuite 会在两个方向上“炸毁”多边形,并且需要设置BufferParameters.IsSingleSided=true以便具有单边多边形偏移,但目前还不清楚如何将其与 结合使用VariableBuffer

骑士轮廓

Cavalier countours与大多数库不同,它只能在一个方向上进行折线偏移(这就是我想要的),这样就不会形成多边形。这就是我想要的,但不幸的是,它不能进行可变宽度偏移。

如何调整当前的库以满足我的需求?

似乎没有简单的方法可以做到这一点。有什么想法可以做到这一点吗?

欢迎任何基于 C#、C++ 或 C 库构建的解决方案。

c# c++ geometry clipper nettopologysuite

6
推荐指数
1
解决办法
2033
查看次数