我在我的 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
可能是个问题吗?还是那个脚手架问题?