ArcGIS Преобразование из Wgs84 в WebMercator - PullRequest
0 голосов
/ 13 февраля 2020

Я использую ArcGIS .NET SDK с WPF, и мой код основан на этом проекте .

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

Но теперь у меня есть база данных, где полигоны сохраняются как Wgs84 (широта и долгота). Теперь я могу загрузить эти полигоны на карту, но я не могу их редактировать, так как Map - это WebMercator, а полигоны - Wgs84. Как только я пытаюсь редактировать, я получаю исключение:

Входная пространственная привязка не соответствует собственной пространственной привязке ...

Мне нужно преобразовать мои полигоны как только я загружаю их из базы данных (Wgs84 в WebMercator) и преобразовываю их обратно непосредственно перед сохранением в базу данных (WebMercator в Wgs84).

Итак, я смог выполнить первое преобразование, загружаю полигон Wgs84 из базы данных и конвертировать каждую точку в WebMercator. Я могу отображать эти многоугольники и редактировать их.

Но я пытаюсь выполнить второе преобразование при попытке сохранить многоугольник. Я нашел формулу, которая может преобразовать эти точки WebMercator обратно в Wgs84 для сохранения в базе данных, но в дополнение к широте и долготе ему также нужна зона. Таким образом, я получаю очки:

String geomStr = MyMapView.SketchEditor.Geometry.ToJson();

Оттуда я могу получить все пары широт и долг для конвертации, но мне нужна зона каждой точки. Есть ли способ получить зону из объекта Graphi c или Geometry? Или как насчет определения зоны по простому знанию точки широты или долготы? Это все, что мне нужно, прежде чем я смогу попробовать формулу преобразования для Wgs84 в WebMercator.

Этот инструмент обладает необходимой мне функциональностью. Но при конвертации из EPSG: 3857 в EPSG: 4326. это не на 100% точно *

1 Ответ

0 голосов
/ 13 февраля 2020

Я не знаю, как ArcGIS на самом деле хранит или обрабатывает данные, в которых WebMercator используется в качестве пространственной привязки.

"Официальная" спецификация задается EPSG: 3857 .

* 1006. * См. Также https://epsg.io/3857 и https://spatialreference.org/ref/sr-org/epsg3857-wgs84-web-mercator-auxiliary-sphere/

Проекция карты объясняется здесь: https://en.wikipedia.org/wiki/Web_Mercator_projection

Если вы хотите выполнить вычисления самостоятельно, используйте методы, подобные показанным ниже, где Location - это класс, который содержит значения широты и долготы WGS 84 в градусах, а Point - System.Windows.Point и содержит значения X и Y в метрах, измеренные из начало координат на широте = 0 и долготе = 0.

public class Location
{
    public double Latitude { get; set; }  // degrees from -90 to 90
    public double Longitude { get; set; } // degrees from -180 to 180
}

public const double Wgs84EquatorialRadius = 6378137d;
public const double Wgs84MetersPerDegree = Wgs84EquatorialRadius * Math.PI / 180d;

public override Point LocationToPoint(Location location)
{
    return new Point(
        Wgs84MetersPerDegree * location.Longitude,
        Wgs84MetersPerDegree * LatitudeToY(location.Latitude));
}

public override Location PointToLocation(Point point)
{
    return new Location(
        YToLatitude(point.Y / Wgs84MetersPerDegree),
        point.X / Wgs84MetersPerDegree);
}

public static double LatitudeToY(double latitude)
{
    if (latitude <= -90d)
    {
        return double.NegativeInfinity;
    }

    if (latitude >= 90d)
    {
        return double.PositiveInfinity;
    }

    return Math.Log(Math.Tan((latitude + 90d) * Math.PI / 360d)) * 180d / Math.PI;
}

public static double YToLatitude(double y)
{
    return 90d - Math.Atan(Math.Exp(-y * Math.PI / 180d)) * 360d / Math.PI;
}
...