多极子中点的反方向

本文关键字:反方向 | 更新日期: 2023-09-27 18:29:15

有一项服务,在给定某些条件(如国家/地区/州和城镇)的情况下,您会得到一个众所周知的文本,定义包含搜索区域的多边形或多边形。

这里可能有一个例子。

现在,我正试图使用C#和EF6.1.将这些数据插入SQL Server数据库中

代码应该是这样的:

首先从服务中获取多边形字符串,并将其添加到变量中:

var polygon = GetPolygonFromService(country, state, town);

然后用它插入数据库:

using(DataContext data = new DataCVontext())
{
    var location = new Location
    {
        Country = country,
        State = state,
        Town = town,
        GeoGraphy = DbGeography.FromText(polygon)
    };
    data.Locations.Add(location);
    data.SaveChanges();
}

现在,当我这样做的时候,我得到了一个错误:

传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数4("@3"):提供的值不是数据类型geography的有效实例。请检查源数据中的无效值。无效值的一个例子是刻度大于精度的数字类型数据

经过一些研究和测试,我得出的结论是,之所以会发生这种情况,是因为多边形定义中每个点的顺序是这样的,即多边形定义的是外部区域,而不是内部区域,所以它没有试图得到纽约的区域,而是得到了除纽约以外的地球其他地区。

有没有办法将其转换为正确的方向?

多极子中点的反方向

编辑:我之前给出的答案似乎并非每次都有效。

我发现了一个解决方案使用这篇文章和它提出的链接

首先是返回DbGeography 的函数

public static DbGeography CreatePolygon(string wktString)
{
    var sqlGeography = SqlGeography.STGeomFromText(new SqlChars(wktString), 4326).MakeValid();
    var invertedSqlGeography = sqlGeography.ReorientObject();
    if (sqlGeography.STArea() > invertedSqlGeography.STArea())
    {
        sqlGeography = invertedSqlGeography;
    }
    return DbGeography.FromText(sqlGeography.ToString());
}

然后使用功能

var polygon = GetPolygonFromService(country, state, town);
using(DataContext data = new DataCVontext())
{
    var location = new Location
    {
        Country = country,
        State = state,
        Town = town,
        GeoGraphy = CreatePolygon(polygon)
    };
    data.Locations.Add(location);
    data.SaveChanges();
}