У меня есть столбец географии в базе данных. Этот столбец содержит исходный многоугольник. Рядом с ним у меня есть еще один столбец, который содержит упрощенную версию этого многоугольника. Упрощение было сделано с помощью функции geography.Reduce () ( Я использую допуск 100 ), которая работает с алгоритмом Дугласа-Пекера. Когда клиент запрашивает эту область, я извлекаю ее из базы данных, быстро конвертирую в GeoJSON и передаю ее моему клиенту.
Если я запрашиваю исходный многоугольник, пройдет 20 секунд, прежде чем он будет успешно получен, но он работает. В конце концов, единственной проблемой является скорость, и именно поэтому я представил второй столбец, содержащий упрощенный многоугольник. Извлечение этого многоугольника из базы данных происходит мгновенно, но на стороне клиента происходит любопытная вещь.
Как видите, на моей карте показано несколько маркеров. Никто из них не кликабелен, кроме самой верхней (немного юго-западнее Мельбурна), но на самом деле это маркер, который я добавил. Откуда другие?
Еще одна вещь, которую я заметил, это , чем больше я уменьшаю простоту, тем меньше этих фантомных маркеров показывает . Так что, если я буду использовать оригинальный полигон как GeoJSON, все будет хорошо. Как только я начинаю упрощаться, я получаю эти фэнтомные маркеры.
Когда я запрашиваю этот упрощенный многоугольник, я использую функцию geography::STAsText()
. После этого я использую NetTopologySuite, чтобы прочитать это как WKT и создать объект геометрии NetSuiteTopology. С помощью этого объекта я создаю объект и использую 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);