Я загрузил этот (Quebe c) файл OSM PBF в мою PostgreSQL базу данных и из. NET Core Web Api, я пытаюсь выполнить базовые c запросы, например, поиск многоугольников в указанной области, но без результатов.
Я построил DbContext
с помощью этой команды:
Scaffold-DbContext "Host=52.0.0.0;Database=my-db;Username=postgres;Password=password" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Models
Я получил эту ошибку:
Не удалось найти сопоставление типов для столбца publi c .planet_osm_polygon.way с типом данных geometry (Geometry, 3857). Пропуск столбца. Невозможно сформировать индекс planet_osm_polygon_way_idx. Следующие столбцы не могут быть обработаны: way.
Поэтому я вручную добавил это свойство к 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
? Или проблема с подмостками?