2014-10-21 23 views
5

Voglio disegnare una polilinea su "XAML Map Control" con latitudine/longitudine, utilizzando il contenuto di uno shapefile.Come leggere le coordinate dello shapefile in C#

Ho 2 tipi di shapefile:

  • Uno con .dbf, .prj, QPJ, .shx e del file, ovviamente, .shp.
  • One con solo il file .shp

lettura con entrambi i tipi di file con varie biblioteche (Topology Suite Net, ed ora DotSpatial) posso ottenere un elenco di coordinate (DotSpatial.Topology.Coordinate) come:

X 456874.625438354 
Y 5145767.7929015327 
  • Come posso convertire poi in latitudine formato/longitudine?
  • Qual è il formato corrente?
  • I file che accompagnano il file .shp sono utili?
+1

Si dovrebbe già tornare lat/long, assicurarsi di specificare lo SRID e la proiezione corretti. – Habib

+0

Grazie per l'aiuto. La proiezione shapefile (Shapefile.Projection) è WGS_1984_UTM_Zone_32N, dal nome penso che le coordinate siano in formato UTM, hai qualche esempio di conversione? – iRubens

+0

Fammi sapere quale API stai usando e sei in grado di eseguire il trascinamento della selezione? –

risposta

4

È possibile utilizzare DotSpatial per riproiettare a lat long. Se stai leggendo in shapefile e il file .prj c'è così che la proiezione è nota, quindi tutto quello che dovete fare è:

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

Se invece il file .prj manca, allora si avrà necessario definire prima la proiezione come:

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

Ma se, per esempio, non si dispone di uno shapefile e si desidera solo per riproiettare un insieme di coordinate da una proiezione all'altra, è possibile utilizzare l'utilità reproject direttamente :

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

Quest'ultimo metodo utilizza un array come quello in modo che il modulo di proiezione possa funzionare senza avere un riferimento diretto al modulo dati.