简化的GeoJSON报告Google地图上的幻想标记

时间:2019-04-13 21:45:35

标签: sql-server google-maps geojson sqlgeography nettopologysuite

我在数据库中有一个地理位置专栏。该列保存原始多边形。在它旁边,我还有另一列包含此多边形的简化版本。使用geography.Reduce()我使用100公差)函数进行了简化,该函数与Douglas-Peucker算法一起使用。当客户要求该区域时,我将从数据库中获取该区域,然后快速转换为GeoJSON并将其提供给我的客户。

如果我查询原始多边形,则需要20秒钟才能成功检索它,但是它可以工作。最后,唯一的问题是速度,这就是为什么我介绍了包含简化多边形的第二列的原因。从数据库中获取该多边形是瞬间发生的,但是在客户端发生了一件奇怪的事情。

enter image description here

您可以看到我的地图上显示了多个标记。他们中没有一个是最可点击的(墨尔本最西南偏南),但这实际上是我添加的一个标记。 其他人来自哪里?

我注意到的另一件事是我简化得越多,这些幻想标志就越少显示。因此,如果我将原始多边形用作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);

1 个答案:

答案 0 :(得分:0)

经过广泛的研究,我得出的结论是,当某些多边形过度简化时,简化的过程将产生点。 google maps将这些点表示为标记,因此,简化程度越大,产生的点越多,标记就越多。

我找到了article,其中描述了如何摆脱这些问题,但尚未进行测试。

希望这对某些空间菜鸟(如我)有帮助。