2015-12-01 10 views
5

Ich versuche, JSON Ausgabe zu erstellen, die das GeoJSON Format hier beschriebenen ähnelt: http://geojson.org/geojson-spec.htmlErstellen GeoJSON Ausgabe von Well-Known Text mit C#

Insbesondere hat ich Text aus meiner Datenquelle im Text-Format zurückgegeben werden und möchten Konvertiere meine DTOs in JSON in dem Format, das unten in meinen Kommentaren gezeigt wird. Das Hauptproblem, das ich habe, versucht, das Koordinaten-Array [[...]] ohne Eigenschaftsnamen zu erstellen.

Code:

/* 

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

Die oben genannten Ausgänge "fast", was ich will, aber nicht genau. Die Ausgabe wird wie unten dargestellt:

"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}]} 

Meine DTOs sind wie folgt definiert:

[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; } 


} 

Ich habe versucht, Tupel statt koordinieren Klasse zu verwenden, aber das einfach eingefügt „item1“ und „item2“ Eigenschaft Namen anstelle von "x" und "y".

Das einzige, was ich noch nicht versucht habe, ist meinen eigenen JSON Converter zu erstellen?

Vielen Dank im Voraus für die Hilfe,

Mit freundlichen Grüßen

Stefan

UPDATE AUF LÖSUNG

erreichte ich eine Lösung dank der gewählten Antwort hier (von Dhanuka777) über mehrdimensionale Arrays, aber für die Vollständigkeit, falls es hilft:

hatte ich eine neue Hilfsfunktion (von hier leicht modifizierte Version von Jon Skeet erstellen Rechteck Array-Funktion: How to convert list of arrays into a multidimensional array) erstellen

Lösung

-Code wie unten dargestellt:

/* 

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

Und eine leicht modifizierte Version von Create Rechteckige Array-Definition wie folgt:

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

und die aktualisierte GeometryDto wie folgt:

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

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


    } 

Die Web-API verwendet Newtonsoft Json zum Serialisieren der Objekte im erforderlichen Format.

+0

Bitte klären. Die Frage scheint nach der Serialisierung zu fragen (dto to json), aber der Code zeigt Deserialisierung.Welche Bibliothek oder welchen Code verwenden Sie für die Serialisierung? –

+0

Danke Tom, ich hätte angeben sollen, ich benutze Web API 2, um diese DTOs zurück zum Client zu serialisieren. –

Antwort

1

Ich würde lieber Newtonsoft Json Serializer verwenden, um dies herauszubekommen. Definitive Koordinaten als 2D-Array werden den Trick machen.

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

Holen Sie sich die Nuget von hier.

Ausgang: { "Typ": "Polygon", "Koordinaten": [[319686.3666000003,7363726.795], [319747.05190000031,7363778.9233], ...]}

+0

Vielen Dank Dhanuka777, der Tipp für das mehrdimensionale Doppel-Array führte mich zu einer funktionierenden Antwort. –

+0

Ich aktualisierte die Frage mit, wie ich dies mit dem mehrdimensionalen Array-Vorschlag implementiert habe, falls es jemand anderem hilft. Vielen Dank –