Чтение координат шейп-файла в C#

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

У меня есть 2 типа шейп-файлов:

  • Один с.dbf, .prj, qpj, .shx и, очевидно,.shp файлом.
  • Один только с.shp файлом

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

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

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);

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

Другие вопросы по тегам