我在数据库中有一个地理列。此列包含原始多边形。在它旁边,我有另一列包含此多边形的简化版本。使用Douglas-Peucker 算法运行的geography.Reduce()(我使用 100 的容差)函数进行了简化。当客户要求这个区域时,我从数据库中获取它并快速转换为 GeoJSON 并将其提供给我的客户。
如果我查询原始多边形,它需要 20 秒才能成功检索,但它可以工作。最后唯一的问题是速度,这就是为什么我介绍了第二列包含简化多边形的原因。从数据库中获取这个多边形是在瞬间发生的,但在客户端发生了一件奇怪的事情。
如您所见,我的地图上显示了多个标记。没有一个是可点击的,除了最上面的(墨尔本稍微西南边),但这个实际上是我添加的一个标记。其他的从哪里来?
我注意到的另一件事是,我越是降低简单性,这些幻想标记显示的就越少。因此,如果我将原始多边形作为 GeoJSON 提供,一切都很好。一旦我开始简化,我就会得到这些幻想标记。
当我查询这个简化的多边形时,我使用geography::STAsText()
函数。之后,我使用 NetTopologySuite 将其读取为 WKT 并创建一个 NetSuiteTopology Geometry 对象。有了这个对象,我创建了一个 Feature 并使用 GeoJsonWriter 来创建实际的 GeoJSON。
var query = new SqlQuery("Location")
.Select("LocationServicingAreaSimplified.STAsText()")
.Where("LocationID", SqlOp.Equals, "@LocationID");
// This object query will be convertet to
// SELECT LocationServicingAreaSimplified.STAsText() FROM Location WHERE LocationID = ?
query.Parameters.Add("@LocationID", LocationID);
var simplifiedPolygon = await query.ExecuteScalarAsync<string>();
var wktReader = new WKTReader() { DefaultSRID = 4326 };
var geoJsonWriter = new GeoJsonWriter();
var feature = new Feature
{
Geometry = wktReader.Read(simplifiedPolygon)
};
return geoJsonWriter.Write(feature);