Буферная зона вокруг позиции с использованием dotspatial
Я использую самый последний C# в VS2017 вместе с самыми последними DotSpatial пакетами из Nuget. (Dotspatial с NetTopologySuite вместе с портом DotSpatial proj4)
Дана карта мира и лат/Лонг позиция. Я хочу поставить х метровый круг вокруг установки.
В настоящее время я делаю то же самое, используя расширения ГИС postGres, и это работает просто отлично. Но я бы предпочел не разговаривать с сервером, чтобы сделать это.
Я думал, что это будет простая операция, но результаты, которые я продолжаю получать, не имеют никакого смысла. Я бы подумал, что, учитывая позицию lat/long, я получу круг обратно в координатах lat/long, но это не то, что я получаю обратно. Я пытался перепроектировать их, но либо я получаю обратно кучу решительно не lat/long координат, либо кучу пар Бесконечности/Бесконечности. Ни то, ни другое я не ищу.
Я подумал, что, возможно, мне придется их перепроектировать или что-то в этом роде, но перепроектирование, похоже, тоже не помогает. Я не знаю, что делаю не так.
К сожалению, документация DotSpatial оставляет желать лучшего, и, по-видимому, мой googleFu недостаточно силен, чтобы найти ответ, который я ищу. Может ли кто-нибудь помочь мне разобраться в этом?
Для моего тестового случая lat/long, который я использую, - это координаты Disney World во Флориде.
широта/долгота(28.417839, -81.581235)
Что я уже пробовал:
Моя последняя попытка:
var xPosition = -81.581235; var yPosition = 28.417839; var precisionModel = new PrecisionModel(PrecisionModelType.Floating); var factory = new GeometryFactory(precisionModel, 4326); var position = new Position(new Longitude(xPosition), new Latitude(yPosition)); var point = factory.CreatePoint(new Coordinate(position.Longitude.DecimalDegrees, position.Latitude.DecimalDegrees)); var buffer = point.Buffer(500);
это дает мне полигон IGeometry с 33 координатами
(418.418765, 28.417839)
(408.811405201615, -69.1273220080641)
(380.358531255643, -162.923877182545)
(334.153571151273, -249.367277509801)
(271.972155593274, -325.135551593274)
(196.203881509801, -387.316967151273)
(109.760481182545, -433.521927255643)
(15.9639260080642, -461.974801201615)
(-81.581235, -471.582161)
(-179.126396008064, -461.974801201615)
(-272.922951182545, -433.521927255643)
(-359.366351509801, -387.316967151273)
(-435.134625593274, -325.135551593274)
(-497.316041151273, -249.367277509801)
(-543.521001255643, -162.923877182545)
(-571.973875201615, -69.1273220080639)
(-581.581235, 28.4178390000004)
(-571.973875201615, 125.963000008065)
(-543.521001255643, 219.759555182545)
(-497.316041151272, 306.202955509802)
(-435.134625593273, 381.971229593274)
(-359.3663515098, 444.152645151273)
(-272.922951182544, 490.357605255644)
(-179.126396008063, 518.810479201615)
(-81.5812349999988, 528.417839)
(15.9639260080655, 518.810479201615)
(109.760481182546, 490.357605255643)
(196.203881509802, 444.152645151272)
(271.972155593275, 381.971229593273)
(334.153571151274, 306.2029555098)
(380.358531255644, 219.759555182543)
(408.811405201616, 125.963000008062)
(418.418765, 28.417839)
Это было бы прекрасно... если бы это были координаты широты и долготы. Я не знаю, что это такое, но они не лат/долго на этой планете.
Решив, что мне нужно перепроектировать (но не зная, что такое исходная проекция), я немного погуглил и нашел это (среди многих других):
var pointArray = new List<double>(); var zArray = new double[1] { 0 }; for (var index = 0; index < buffer.Coordinates.Count(); index++) { var coordinate = buffer.Coordinates[index]; pointArray.Add(coordinate.X); pointArray.Add(coordinate.Y); } var oldProjection = new DotSpatial.Projections.ProjectionInfo(); var newProjection = KnownCoordinateSystems.Geographic.World.WGS1984; DotSpatial.Projections.Reproject.ReprojectPoints(pointArray.ToArray(), zArray, oldProjection, newProjection, 0, pointArray.Count / 2); for (var index = 0; index < buffer.Coordinates.Count(); index++) { var coordinate = buffer.Coordinates[index]; coordinate.X = pointArray[index]; coordinate.Y = pointArray[index + 1]; }
Но это также не дает мне широты и долготы. Пример:
(418.418765, 28.417839) (28.417839, 408.811405201615) (408.811405201615, -69.1273220080641) (-69.1273220080641, 380.358531255643) (380.358531255643, -162.923877182545) (-162.923877182545, 334.153571151273
RedDk
Смотреть здесь:
https://en.wikipedia.org/wiki/Haversine_formula
Eiredrake
Я не знаю, как это поможет. У меня уже есть инструменты, просто чего-то не хватает в том, как я их использую.