【问题标题】:Simplified GeoJSON reports fantom markers on google maps简化的 GeoJSON 报告谷歌地图上的幻想标记
【发布时间】:2019-04-13 21:45:35
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多