#sql-server #google-maps #geojson #sqlgeography #nettopologysuite
#sql-сервер #google-карты #geojson #sqlgeography #nettopologysuite
Вопрос:
У меня есть столбец географии в базе данных. В этом столбце содержится исходный полигон. Рядом с ним у меня есть еще один столбец, содержащий упрощенную версию этого полигона. Упрощение было сделано с географией.Функция Reduce()(я использую допуск 100), которая работает с алгоритмом Дугласа-Пекера. Когда клиент запрашивает эту область, я извлекаю ее из базы данных, быстро конвертирую в GeoJSON и отправляю своему клиенту.
Если я запрошу исходный полигон, потребуется добрых 20 секунд, прежде чем он будет успешно восстановлен, но он работает. В итоге единственной проблемой является скорость, и именно поэтому я ввел второй столбец, содержащий упрощенный полигон. Извлечение этого полигона из базы данных происходит мгновенно, но на стороне клиента происходит любопытная вещь.
Как вы можете видеть, на моей карте показано несколько маркеров. Ни один из них не доступен для просмотра, ожидайте, что самый верхний (немного к юго-западу от Мельбурна), но на самом деле это маркер, который я добавил. Откуда берутся другие?
Еще одна вещь, которую я заметил, это то, что чем больше я уменьшаю простоту, тем меньше этих фантомных маркеров отображается. Итак, если я использую исходный полигон как GeoJSON, все в порядке. Как только я начинаю упрощать, я получаю эти маркеры fantom.
Когда я запрашиваю этот упрощенный полигон, я использую 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);
Ответ №1:
После обширного исследования я пришел к выводу, что процесс упрощения приведет к появлению точек, когда некоторые полигоны будут упрощены. карты Google будут представлять точки в виде маркеров, поэтому, чем больше упрощение, тем больше точек создается, тем больше маркеров присутствует.
Я нашел статью, в которой описано, как избавиться от этих точек, но еще не тестировал ее.
Надеюсь, это поможет какому-нибудь пространственному новичку (например, мне).