Eiredrake Ответов: 0

Буферная зона вокруг позиции с использованием 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

Я не знаю, как это поможет. У меня уже есть инструменты, просто чего-то не хватает в том, как я их использую.

0 Ответов