C# 使用Npgsql和EntityFramework核心根据PostGIS将几何图形转换为地理图形
在PostgreSQL PostGIS中,我可以通过在sql查询“geometry\u column::geography”中使用此语法将geometry列强制转换为geography来获得以米为单位的距离。像这样:C# 使用Npgsql和EntityFramework核心根据PostGIS将几何图形转换为地理图形,c#,.net-core,entity-framework-core,postgis,npgsql,C#,.net Core,Entity Framework Core,Postgis,Npgsql,在PostgreSQL PostGIS中,我可以通过在sql查询“geometry\u column::geography”中使用此语法将geometry列强制转换为geography来获得以米为单位的距离。像这样: select * from "Tags" where ST_Distance("Location",'POINT(31.233334 30.033333)'::geography) < 1000 ; 这里是“点”变量的定义 [Colu
select * from "Tags" where ST_Distance("Location",'POINT(31.233334 30.033333)'::geography) < 1000 ;
这里是“点”变量的定义
[Column(TypeName="geometry (point)")]
public Point Location{get;set;}
var point = new Point(new Coordinate(Longitude,Latitude));
point.SRID = 4326;
将列属性更改为
[列(TypeName=“geography”)]
。如果该点已经是一个地理点,则不需要强制转换。检查中的示例
从文档示例中:
public class City
{
public int Id { get; set; }
public string Name { get; set; }
[Column(TypeName="geography")]
public Point Location { get; set; }
}
var nearbyCities = context.Cities.Where(c => c.Location.Distance(somePoint) < 100);
这将返回:
9124665.26917268
或9124Km将列属性更改为
[column(TypeName=“geography”)]
。如果该点已经是一个地理点,则不需要强制转换。检查中的示例
从文档示例中:
public class City
{
public int Id { get; set; }
public string Name { get; set; }
[Column(TypeName="geography")]
public Point Location { get; set; }
}
var nearbyCities = context.Cities.Where(c => c.Location.Distance(somePoint) < 100);
这将返回:
9124665.26917268
或者9124公里没有
,只有<代码>地理
包含球体上的坐标,而几何
包含平面上的坐标。您需要从球体投影到平面,反之亦然。NTS本身不包括预测,这在文档页面中非常明确。不过,该演员阵容并不计算距离。您实际使用的PostgreSQL查询是什么?要计算距离,需要在Linq的where函数中有两个点,才能得到相同的结果。
与什么查询相同?LINQ查询不是直接执行的,而是转换为SQL查询。您试图生成什么查询?@PanagiotisKanavos我使用类似于此查询的方法来获取米范围内的点。。。从“标签”中选择*,其中ST_距离(“位置”,“点(31.233334 30.033333)”::地理位置)<1000。。。。。挑战是我想告诉linq在sql查询中执行类似的操作:“:geography”。将column属性更改为[column(TypeName=“geography”)]
在该类型转换中没有,只有<代码>地理
包含球体上的坐标,而几何
包含平面上的坐标。您需要从球体投影到平面,反之亦然。NTS本身不包括预测,这在文档页面中非常明确。不过,该演员阵容并不计算距离。您实际使用的PostgreSQL查询是什么?要计算距离,需要在Linq的where函数中有两个点,才能得到相同的结果。
与什么查询相同?LINQ查询不是直接执行的,而是转换为SQL查询。您试图生成什么查询?@PanagiotisKanavos我使用类似于此查询的方法来获取米范围内的点。。。从“标签”中选择*,其中ST_距离(“位置”,“点(31.233334 30.033333)”::地理位置)<1000。。。。。挑战是我想告诉linq在sql查询中执行如下操作:“:geography”。将column属性更改为[column(TypeName=“geography”)]
谢谢您的回答,我已经尝试过了,但将类型更改为geography会使我失去一些功能,例如获取点的X和Y,正如您在Linq语句中看到的,我有“tag.Location.X”,如果点是geography,这将引发异常,不幸的是,ST_GeographyFromText不存在于Npgsql中,因为我知道ST_GeographyFromText
是一个PostGIS函数,应该使用它而不是强制转换。我发布的查询来自PostGIS文档,您可以在这里看到,ngpsql不支持ST_GeographyFromText
,我想使用Linq而不是普通sql查询。该函数来自PostGIS,而不是NpgSQL。在SQL中,您不必使用点(31.233334 30.033333)::geography
,您可以使用ST_GeographyFromText('POINT(31.233334 30.033333)
)。看起来唯一的问题是如何在客户机上检索坐标,而不是如何感谢您的回答,我已经尝试过了,但将类型更改为地理位置会使我失去一些功能,例如获取点的X和Y,正如您在Linq语句中看到的,我有“tag.Location.X”,如果点是GeographyFromText,这将引发异常,不幸的是,Npgsql中不存在ST_GeographyFromText,因为我知道ST_GeographyFromText
是一个PostGIS函数,应该使用它来代替强制转换。我发布的查询来自PostGIS文档,您可以在这里看到,ngpsql不支持ST_GeographyFromText
,我想使用Linq而不是普通sql查询。该函数来自PostGIS,而不是NpgSQL。在SQL中,您不必使用点(31.233334 30.033333)::geography
,您可以使用ST_GeographyFromText('POINT(31.233334 30.033333)
)。看起来唯一的问题是如何在客户端检索坐标,而不是如何强制转换