【问题标题】:Cannot find polygons within polygons using spatial LINQ queries无法使用空间 LINQ 查询在多边形内找到多边形
【发布时间】:2020-09-17 11:46:31
【问题描述】:

我在我的 PostgreSQL 数据库和 .NET Core Web Api 中加载了this(魁北克)OSM PBF 文件,我正在尝试执行基本查询,例如在指定区域内查找多边形,但没有得到任何结果。

我使用这个命令搭建了一个DbContext

Scaffold-DbContext "Host=52.0.0.0;Database=my-db;Username=postgres;Password=password" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Models

我收到了这个错误:

找不到列“public.planet_osm_polygon.way”的类型映射 数据类型为“几何(几何,3857)”。跳过列。无法 脚手架索引“planet_osm_polygon_way_idx”。以下列 无法搭建脚手架:方式。

所以我手动将此属性添加到命令生成的PlanetOsmPolygon.cs

public Geometry Way { get; set; }

奇怪的是我确实有 Geometry 可用,因为我可以声明该类型的变量并正确编译....

我认为我已经为 PostgreSQL 和 PostGIS 正确设置了上下文

services.AddDbContext<OSMContext>(x =>
{   
        var connectionString = Configuration.GetValue<string>("SQL:Prod");
        x.UseNpgsql(connectionString, o =>
        {
            o.CommandTimeout(240);
            o.UseNetTopologySuite();

        });

}, ServiceLifetime.Scoped);

这是 API 方法代码

GeometryFactory geometryFactory = new GeometryFactory();

//values are from query string
//north=45.5154045103725&south=45.4901382447544&west=-73.5854034422038&east=-73.5493545534017

Polygon space = geometryFactory.CreatePolygon(new Coordinate[] {
            new Coordinate(west, south),
            new Coordinate(east, south),
            new Coordinate(east, north),
            new Coordinate(west, north),
            new Coordinate(west, south) });

//var polygons = OSMContext.PlanetOsmPolygon.Where(x => x.Way.Covers(space)).ToList();
//var polygons = OSMContext.PlanetOsmPolygon.Where(x => x.Way.CoveredBy(space)).ToList();
//var polygons = OSMContext.PlanetOsmPolygon.Where(x => space.Covers(x.Way)).ToList();
//var polygons = OSMContext.PlanetOsmPolygon.Where(x => x.Way.Covers(space)).ToList();
var polygons = OSMContext.PlanetOsmPolygon.Where(x => x.Way.Within(space)).ToList();

如您所见,我尝试了几种解决方法,但始终没有结果。 space 有效(IsValid 返回 true)。

我用于space 的值可能有问题吗?还是那个脚手架问题?

【问题讨论】:

    标签: c# postgresql .net-core postgis nettopologysuite


    【解决方案1】:

    OSM 数据使用 CRS 3857 保存。

    边界框是使用 WGS 84 (4326) 创建的,但您尚未指定 CRS。

    要修复它,可以在3857中指定边界框坐标,也可以将当前的4326框投影到3857。

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 2012-08-23
      • 2015-09-06
      • 2012-06-19
      • 2011-06-17
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多