-1

我在数据库中有一个地理列。此列包含原始多边形。在它旁边,我有另一列包含此多边形的简化版本。使用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);
4

1 回答 1

0

经过广泛的研究,我得出结论,当某些多边形被过度简化时,简化过程会产生点。谷歌地图会将这些点表示为标记,因此,简化程度越高,产生的点越多,存在的标记就越多。

我找到了一篇文章,其中描述了如何摆脱这些点,但尚未对其进行测试。

希望这有助于一些空间新手(像我一样)。

于 2019-04-15T07:15:18.983 回答