gpt4 book ai didi

c# - EntityFrameworkCore.PostgreSQL 转换点

转载 作者:行者123 更新时间:2023-11-29 12:16:39 24 4
gpt4 key购买 nike

有没有办法使用 EntityFrameworkCore 将一个点转换为另一个 SRID?

之前我使用了 ST_Transform(ST_GeomFromText(@coord,4326),32661)

我现在的代码是这样的

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

coord的SRID是4326,需要变成32661这样做是出于向后兼容的原因,并且没有将数据库转换为另一个 SRID 的选项

是否有几何库或 PostGIS EntityFrameworkCore 方法将一个点转换为另一个 SRID

最佳答案

发布版本 Npgsql.EntityFrameworkCore.PostgreSQL PostgreSQL 的 Entity Framework Core 提供程序不支持空间类型。

好消息是空间类型支持和对某些空间操作的支持 SQL 翻译已经作为预发布候选提供。

如果要使用这些库,还需要使用 Entify Framework Core 的预发布候选版本。

首先,卸载您现有的 Entity Framework 或 npgsql 包。

所需的包之一 (GeoAPI) 在标准 NuGet 源中不可用,因此我们将使用 myget.org 源。

要使用它,您需要在 Visual Studio 中添加一个新的 NuGet 源,方法是转到“工具”->“选项”->“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_AreaST_ContainsST_As_Text 等.).

完整的受支持操作列表以及如何在您的 EF 查询中使用它们可在此处获得:http://www.npgsql.org/efcore/mapping/nts.html#operation-translation

不幸的是,ST_TransformST_Project 目前似乎不受支持,但在上面的网站中有一个链接,您可以联系开发人员并请求他们被添加。

与此同时,您可以使用 GDAL转换坐标的投影。

安装包:

Install-Package Gdal.Core -Version 1.0.0

此包为 .NET core 的 GDAL 提供了一个多平台包装器,因此您需要安装这些库,并且您的程序应该可以访问它们。

您可以在此处找到适用于 Windows 和 Linux 的二进制文件:https://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries

如果您使用的是 Windows,则可以使用以下安装程序:http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe

只需在“选择包”窗口中选择“快速桌面安装”和 GDAL。

默认情况下,所需的库安装在 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

关于c# - EntityFrameworkCore.PostgreSQL 转换点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50423777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com