【发布时间】: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