Не удается найти многоугольники внутри многоугольников с помощью пространственных запросов LINQ - PullRequest
0 голосов
/ 29 мая 2020

Я загрузил этот (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? Или проблема с подмостками?

1 Ответ

0 голосов
/ 30 мая 2020

Данные OSM сохраняются с использованием CRS 3857.

Ограничивающая рамка создается с использованием WGS 84 (4326), но вы не указали CRS.

Чтобы исправить это, вы можно указать координаты ограничивающего прямоугольника в 3857, или вы можете спроецировать текущий прямоугольник 4326 на 3857.

...