EntityFrameworkCore.PostgreSQL Точка преобразования - PullRequest
0 голосов
/ 19 мая 2018

Есть ли способ преобразовать точку в другой SRID, используя EntityFrameworkCore?

ранее я использовал ST_Transform(ST_GeomFromText(@coord,4326),32661)

Мой текущий код выглядит так

var postgisGeometry = new PostgisPoint(lon, lat) {SRID = 4326};

SRID для координаты равен 4326 и должен стать 32661. Это сделано из соображений обратной совместимости, и нет возможности конвертировать базу данных в другой SRID.

. Существует ли библиотека геометрии или метод PostGIS EntityFrameworkCore для преобразования точкина другой SRID

1 Ответ

0 голосов
/ 25 мая 2018

Версия выпуска Npgsql.EntityFrameworkCore.PostgreSQL Поставщик Entity Framework Core для PostgreSQL не поддерживает пространственные типы.

Хорошая новость заключается в том, что поддержка пространственных типов и поддержка некоторых пространственных операций переводы SQL уже доступны в качестве предварительной версии.выпуск кандидата.

Если вы хотите использовать эти библиотеки, вам также необходимо использовать предварительно выпущенную версию кандидата Entify Framework Core.

Сначала удалите существующую платформу сущностей или пакеты npgsql.

Один из необходимых пакетов (GeoAPI) недоступен в стандартном источнике NuGet, поэтому мы будем использовать источник myget.org.

Чтобы использовать его, вам необходимо добавить новый NuGetисточник в Visual Studio, выбрав Сервис -> Параметры -> Диспетчер пакетов NuGet -> Источники пакетов

Создайте новый источник, назовите его myget.org и используйте следующий URL в текстовом поле источника:

https://www.myget.org/F/imageprocessor/api/v3/index.json

Не забудьте нажать на обновление, чтобы сохранить изменения, иначе они не будут сохранены (странно, я знаю).

Чтобы добавить необходимые пакеты, используйте Консоль диспетчера пакетов («Просмотр» -> «Другие окна» -> «Консоль диспетчера пакетов») и выберите myget.org в раскрывающемся списке «Источник пакета», а затем выполнитеследующие команды:

Install-Package Microsoft.EntityFrameworkCore -Version 2.1.0-rc1-final

Install-Package GeoAPI -Version 1.7.5-pre024

Install-Package Npgsql -Version 4.0.0-rc1 

Install-Package Npgsql.EntityFrameworkCore.PostgreSQL -Version 2.1.0-rc1

Install-Package Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite -Version 2.1.0-rc1

После установки пакетов в своем классе DbContext переопределите OnConfiguring, чтобы добавить параметр UseNetTopologySuite:

protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
    builder.UseNpgsql("Host=localhost;Database=your_database;
                                Username=your_user;Password=your_password",
        o => o.UseNetTopologySuite());
}

.что расширение поддерживается вашей базой данных, добавьте в ваш DbContext следующее:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.HasPostgresExtension("postgis");
}

Теперь вы сможете использовать пространственные типы PostgreSql и переводить некоторые операции в SQL (например, ST_Area, ST_Contains, ST_As_Text и т. Д.).

Полный список поддерживаемых операций и способы их использования в запросах EF доступен здесь: http://www.npgsql.org/efcore/mapping/nts.html#operation-translation

К сожалению ST_Transform или ST_Project на данный момент не поддерживается, но есть ссылка на веб-сайте выше, где вы можете связаться с разработчиками и попросить их добавить.

Тем временем вы можете использовать GDAL для преобразования проектачасть ваших координат.

Установите пакет:

Install-Package Gdal.Core -Version 1.0.0

Этот пакет предоставляет многоплатформенную оболочку для GDAL для ядра .NET, поэтому вам нужно установить библиотеки, и они должны быть доступныс помощью вашей программы.

Двоичные файлы для Windows и Linux можно найти здесь: https://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries

Если вы используете Windows, вы можете использовать следующий установщик: http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe

Просто выберите «Express Desktop Install» и GDAL в окне «Select Packages».

По умолчанию необходимые библиотеки установлены в C: \ OSGeo4W64 \ bin.

Вам нужнодобавьте эту папку в системный путь и перезапустите Visual Studio.

Кстати, чтобы преобразовать координаты из всех библиотек в C: \ OSGeo4W64 \ bin Я думаю, вам нужен только proj.dll, так что вы можетеможете включить это в ваш проект (убедитесь, что оно скопировано в выходные данные вашего проекта), и тогда оно должно работать, и вам не нужно устанавливать GDAL.

Вот пример того, как его использовать дляКоординаТе системы, которые указаны в вашем вопросе:

using System;
using NetTopologySuite.Geometries;
using OSGeo.OSR;
using OSGeo.OGR;

namespace YourNamespace
{
    public class SomeLocation
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Point Location { get; } = new Point(40.1234, 1.4321) { SRID = 4326 };

        public Point LocationUpsNorth { get { return Wgs84ToWgs84UpsNorth(Location); } }


        private static NetTopologySuite.Geometries.Point Wgs84ToWgs84UpsNorth(Point location)
        {
            if (location.SRID != 4326)
                throw new Exception("Unsupported coordinate system: " + location.SRID);

            OSGeo.OSR.SpatialReference wgs84Src = new OSGeo.OSR.SpatialReference("");
            wgs84Src.ImportFromProj4("+proj=longlat +datum=WGS84 +no_defs");

            OSGeo.OSR.SpatialReference stereoNorthPoleDest = new OSGeo.OSR.SpatialReference("");
            stereoNorthPoleDest.ImportFromProj4("+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +datum=WGS84 +units=m +no_defs");

            OSGeo.OSR.CoordinateTransformation ct = new OSGeo.OSR.CoordinateTransformation(wgs84Src, stereoNorthPoleDest);

            double[] point = new double[3];
            point[0] = location.X;
            point[1] = location.Y;
            point[2] = location.Z;

            ct.TransformPoint(point);

            return new Point(point[0], point[1]);
        }
    }
}

Результат

Input: POINT (40.1234 1.4321)
Output: POINT (9944217.1796359234 -7426244.9918885585)

Рекомендации:

http://www.npgsql.org/efcore/mapping/nts.html

http://spatialreference.org/ref/epsg/32661/

https://github.com/NetTopologySuite/

https://github.com/NetTopologySuite/ProjNet4GeoAPI/blob/develop/ProjNet.Tests/CoordinateTransformTests.cs

https://gis.stackexchange.com/questions/61541/searching-for-c-code-to-convert-from-utm-to-wgs1984-and-back#61574

...