我在数据库中有一个地理位置专栏。该列保存原始多边形。在它旁边,我还有另一列包含此多边形的简化版本。使用geography.Reduce()(我使用100公差)函数进行了简化,该函数与Douglas-Peucker算法一起使用。当客户要求该区域时,我将从数据库中获取该区域,然后快速转换为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);
答案 0 :(得分:0)
经过广泛的研究,我得出的结论是,当某些多边形过度简化时,简化的过程将产生点。 google maps将这些点表示为标记,因此,简化程度越大,产生的点越多,标记就越多。
我找到了article,其中描述了如何摆脱这些问题,但尚未进行测试。
希望这对某些空间菜鸟(如我)有帮助。