Считывание координат шейп-файла в c#

Я хочу нарисовать полилинию на "XAML Map Control" с широтой/долготой, используя содержимое шейп-файла.

У меня есть 2 типа шейп:

  • С одной .ДБФ .PRJ и qpj успешно, .shx и очевидно .файл shp.
  • один только .shp файл

чтение с обоими типами файлов с различными библиотеками (Net Topology Suite, а теперь DotSpatial) я получаю список координат (DotSpatial.Топология.Координировать) например:

X   456874.625438354
Y   5145767.7929015327  
  • как я могу конвертировать в формат широты / долготы?
  • каков текущий формат?
  • являются файлы, которые сопровождают .шп файл?

1 ответов


вы можете использовать DotSpatial для перепроектирования в lat long. Если Вы читаете в шейп-файле, и то .prj файл есть, так что проекция известна, то все, что вам нужно сделать, это:

        Shapefile sf = Shapefile.OpenFile("C:\myshapefile.shp");
        sf.Reproject(DotSpatial.Projections.KnownCoordinateSystems.Geographic.World.WGS1984);

Если, однако .prj файл отсутствует, то вам нужно будет сначала определить проекцию, как:

        Shapefile sf = Shapefile.OpenFile("C:\myshapefile.shp");
        sf.Projection = DotSpatial.Projections.KnownCoordinateSystems.Projected.UtmWgs1984.WGS1984UTMZone32N;
        sf.Reproject(DotSpatial.Projections.KnownCoordinateSystems.Geographic.World.WGS1984);

но если, например, у вас нет шейп-файла и вы просто хотите перепроектировать набор координат из одной проекции в другую, вы можете использовать утилиту reproject напрямую:

        // interleaved x and y values, so like x1, y1, x2, y2 etc.
        double[] xy = new double[]{456874.625438354,5145767.7929015327};
        // z values if any.  Typically this is just 0.
        double[] z = new double[]{0};
        // Source projection information.
        ProjectionInfo source = DotSpatial.Projections.KnownCoordinateSystems.Projected.UtmWgs1984.WGS1984UTMZone32N;
        // Destination projection information.
        ProjectionInfo dest = DotSpatial.Projections.KnownCoordinateSystems.Geographic.World.WGS1984;
        // Call the projection utility.
        DotSpatial.Projections.Reproject.ReprojectPoints(xy, z, source, dest, 0, 1);

этот последний метод использует такой массив, чтобы проекционный модуль мог работать без прямой ссылки на модуль данных.