2014-10-21 14 views
5

Chcę narysować polilinię w "Kontroli mapy XAML" za pomocą szerokości/długości geograficznej, używając zawartości pliku kształtu.Czytanie współrzędnych shapefile wC#

mam 2 typy shapefile:

  • jedna z .dbf, .prj, qpj, .shx i oczywiście .shp pliku.
  • Jednym z tylko .shp złożyć

Czytanie z obu typów plików z różnych bibliotek (netto topologii Suite, a teraz DotSpatial) i uzyskać listę współrzędnych (DotSpatial.Topology.Coordinate), takich jak:

X 456874.625438354 
Y 5145767.7929015327 
  • Jak mogę dokonać konwersji na format szerokości/długości geograficznej?
  • Jaki jest obecny format?
  • Czy pliki dołączane do pliku .shp są przydatne?
+1

Powinieneś już powrócić do poprzedniego/dłuższego, upewnij się, że określasz poprawny SRID i projekcję. – Habib

+0

Dzięki za pomoc. Projekcja shapefile (Shapefile.Projection) to WGS_1984_UTM_Zone_32N, od nazwy Myślę, że współrzędne są w formacie UTM, czy masz jakiś przykład konwersji? – iRubens

+0

Daj mi znać, którego api używasz i czy możesz przeciągać i upuszczać? –

Odpowiedz

4

Możesz użyć DotSpatial, aby zrekonfigurować do długiego czasu. Jeśli czytasz w shapefile, a plik .prj jest tak, że projekcja jest znana, to wszystko co musisz zrobić, to:

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

Jeśli jednak plik .prj brakuje, wtedy trzeba najpierw określić projekcję takiego:

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

Ale jeśli na przykład nie mają shapefile i po prostu chcesz odwzorować zestaw współrzędnych z jednego do drugiego występu, można użyć narzędzia odwzorować bezpośrednio :

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

Ta ostatnia metoda używa takiej tablicy, aby moduł projekcji działał bez bezpośredniego odniesienia do modułu danych.