多面体中点的反向方向
Posted
技术标签:
【中文标题】多面体中点的反向方向【英文标题】:Reverse orientation of points in a Multipoligon 【发布时间】:2014-11-04 14:38:43 【问题描述】:有一个service,在给定特定条件(例如国家和城镇)的情况下,您会得到一个众所周知的文本,定义包含搜索区域的多边形或多多边形。
你可能有一个例子here。
现在我正在尝试使用 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 的有效实例。检查源数据中的无效值。无效值的一个例子是小数位数大于精度的数据
经过一些研究和一些测试,我得出的结论是,发生这种情况是因为多边形定义中每个点的顺序使得多边形定义了外部区域而不是内部区域,因此而不是试图获得纽约地区,它获得了除纽约以外的地球其他地区。
有没有办法将其转换为正确的方向?
【问题讨论】:
This MSDN blog post 可能感兴趣。您可以基于它设置一个存储过程并调用它以获取您的反转值作为GetPolygonFromService
的一部分。
我真的在考虑解析文本并反转它......
【参考方案1】:
编辑:我之前给出的答案似乎并非每次都有效。
我找到了使用此post 及其提议的link 的解决方案
首先一个函数返回一个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();
【讨论】:
以上是关于多面体中点的反向方向的主要内容,如果未能解决你的问题,请参考以下文章