1

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

我已经DbContext使用这个命令搭建了一个脚手架:

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

我得到了这个错误:

找不到数据类型为“几何(几何,3857)”的列“public.planet_osm_polygon.way”的类型映射。跳过列。无法构建索引“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返回真)。

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

4

1 回答 1

0

OSM 数据使用 CRS 3857 保存。

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

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

于 2020-05-30T16:03:15.167 回答