2015-12-01 13 views
5

Sto cercando di creare output JSON simile al formato di GeoJSON descritto qui: http://geojson.org/geojson-spec.htmlCreazione GeoJSON uscita dal testo ben noto con C#

In particolare, ho il testo di essere restituito dalla mia origine dati in formato testo e vorrebbe convertire i miei DTO in JSON nel formato mostrato n i miei commenti qui sotto. Il problema principale che sto cercando è di creare l'array di coordinate [[...]] senza nomi di proprietà.

Codice:

/* 

       Geometry Text Format from database: POLYGON ((319686.3666000003 7363726.7955, 319747.05190000031 7363778.9233, 319700.78849999979 7363832.7814, 319640.10329999961 7363780.6536, 319686.3666000003 7363726.7955)) 

       And we want format: 
       "geometry": { 
        "type": "Polygon", 
        "coordinates": [[ 
         [319686.3666000003, 7363726.795], 
         [319747.0519000003, 7363778.9233], 
         [319700.78849999979, 7363832.7814], 
         [319640.10329999961, 7363780.6536], 
         [319686.3666000003, 7363726.795] 
        ]] 
       } 

       */ 


       // Strip out everything except the coordinates 
       var coordRawText = myWkt.Replace("POLYGON ((", ""); 
       coordRawText = coordRawText.Replace("))", ""); 
       coordRawText = coordRawText.Replace(", ", ","); 

       // Seperate coordinates to iterate through 
       var coordsArray = coordRawText.Split(','); 
       var coordsEnumerable = coordsArray.Select(coord => coord.Replace(" ", ",")); 

       // Build list of coordinates 
       var coordsList = new List<CoordinateDto>(); 
       foreach (var coord in coordsEnumerable) 
       { 
        var splt = coord.Split(','); 
        var x = double.Parse(splt[0]); 
        var y = double.Parse(splt[1]); 

        coordsList.Add(new CoordinateDto {X = x, Y = y}); 
       } 

       myDto.Geometry = new GeometryDto 
       { 
        Type = "Polygon", 
        Coordinates = coordsList 
       }; 

Le uscite di cui sopra "quasi" quello che voglio, ma non esattamente. Uscita è il seguente:

"geometry":{"type":"Polygon","coordinates":[{"x":319686.3666000003,"y":7363726.7955},{"x":319747.05190000031,"y":7363778.9233},{"x":319700.78849999979,"y":7363832.7814},{"x":319640.10329999961,"y":7363780.6536},{"x":319686.3666000003,"y":7363726.7955}]} 

miei DTOs sono definiti come segue:

[DataContract] 
public class GeometryDto 
{ 
    [DataMember] 
    public string Type { get; set; } 

    [DataMember] 
    public List<CoordinateDto> Coordinates { get; set; } 


} 


[DataContract] 
public class CoordinateDto 
{ 
    [DataMember] 
    public double X { get; set; } 

    [DataMember] 
    public double Y { get; set; } 


} 

Ho provato ad utilizzare tuple invece di coordinate classe, ma che semplicemente inserito "item1" e "item2" proprietà nomi invece di "x" e "y".

L'unica cosa che non ho ancora tentato è creare il mio convertitore JSON?

Grazie in anticipo per l'aiuto, saluti

saluti,

Stefan

AGGIORNAMENTO SULLA SOLUZIONE

ho trovata una soluzione grazie alla risposta selezionata qui (da Dhanuka777) circa matrici multidimensionali, ma per completezza nel caso in cui aiuti:

ho dovuto creare una nuova funzione di supporto (versione leggermente modificata della funzione Crea Array rettangolare di Jon Skeet da qui: How to convert list of arrays into a multidimensional array)

soluzione codice come illustrato di seguito:

/* 

       Geometry Text Format from database: POLYGON ((319686.3666000003 7363726.7955, 319747.05190000031 7363778.9233, 319700.78849999979 7363832.7814, 319640.10329999961 7363780.6536, 319686.3666000003 7363726.7955)) 

       And we want format: 
       "geometry": { 
        "type": "Polygon", 
        "coordinates": [[ 
         [319686.3666000003, 7363726.795], 
         [319747.0519000003, 7363778.9233], 
         [319700.78849999979, 7363832.7814], 
         [319640.10329999961, 7363780.6536], 
         [319686.3666000003, 7363726.795] 
        ]] 
       } 

       */ 


       // Strip out everything except the coordinates 
       var coordRawText = myWkt.Replace("POLYGON ((", ""); 
       coordRawText = coordRawText.Replace("))", ""); 
       coordRawText = coordRawText.Replace(", ", ","); 

       // Seperate coordinates to iterate through 
       var coordsArray = coordRawText.Split(','); 
       var coordsEnumerable = coordsArray.Select(coord => coord.Replace(" ", ",")); 

       // Build list of coordinates 
       var coordsList = new List<double[,]>(); 
       foreach (var coord in coordsEnumerable) 
       { 
        var splt = coord.Split(','); 
        var x = double.Parse(splt[0]); 
        var y = double.Parse(splt[1]); 

        coordsList.Add(new[,] {{ x, y }}); 
       } 

       myDto.Geometry = new GeometryDto 
       { 
        Type = "Polygon", 
        Coordinates = CreateRectangularArray(coordsList) 
       }; 

e una versione leggermente modificata di Crea rettangolare definizione del campo, come di seguito:

static T[,] CreateRectangularArray<T>(IList<T[,]> arrays) 
     { 
      // TODO: Validation and special-casing for arrays.Count == 0 
      int minorLength = arrays[0].Length; 
      T[,] ret = new T[arrays.Count, minorLength]; 
      for (int i = 0; i < arrays.Count; i++) 
      { 
       var array = arrays[i]; 
       if (array.Length != minorLength) 
       { 
        throw new ArgumentException 
         ("All arrays must be the same length"); 
       } 
       for (int j = 0; j < minorLength; j++) 
       { 
        ret[i, j] = array[0, j]; 
       } 
      } 
      return ret; 
     } 

E la aggiornato GeometryDto come segue:

[DataContract] 
    public class GeometryDto 
    { 
     [DataMember] 
     public string Type { get; set; } 

     [DataMember] 
     public double[,] Coordinates { get; set; } 


    } 

Web API utilizzerà Newtonsoft Json per serializzare gli oggetti nel formato richiesto.

+0

chiarire. La domanda sembra essere sulla serializzazione (da dto a json), ma il codice mostra la deserializzazione.Quale libreria o quale codice stai usando per la serializzazione? –

+0

Grazie Tom, avrei dovuto specificare che sto usando Web API 2 per serializzare questi DTO al client. –

risposta

1

Preferisco usare il serializzatore Newtonsoft Json per ottenere questo risultato. Definire le coordinate come array 2D farà il trucco.

public class GeometryDto 
    { 
     public string Type { get; set; } 

     public double[,] coordinates { get; set; }    

    } 

    class Program 
    { 
     static void Main() 
     { 
      var obj = new GeometryDto 
      { 
       Type = "Polygon", 
       coordinates = new double[,] { { 319686.3666000003, 7363726.795 }, { 319747.0519000003, 7363778.9233 }, { 5.3434444, 6.423443 }, { 7.2343424234, 8.23424324 } }      
      }; 
      var json = Newtonsoft.Json.JsonConvert.SerializeObject(obj); 
      Console.WriteLine(json); 
      Console.ReadKey(); 
     } 
    } 

Prendi la Nuget da qui.

uscita: { "Tipo": "Poligono", "coordinate": [[319686.3666000003,7363726.795], [319747.05190000031,7363778.9233], ...]}

+0

Grazie mille Dhanuka777, il consiglio per il doppio array multidimensionale mi ha portato a una risposta operativa. –

+0

Ho aggiornato la domanda con come l'ho implementata con il suggerimento di array multidimensionale, nel caso in cui aiuti qualcun altro. Grazie –