多极子中点的反方向
本文关键字:反方向 | 更新日期: 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();
}