2015-12-01 12 views
5

Tôi cố gắng để tạo ra JSON tương tự như định dạng GeoJSON mô tả ở đây: http://geojson.org/geojson-spec.htmltạo GeoJSON đầu ra từ văn bản nổi tiếng với C#

Đặc biệt, tôi có văn bản được trả lại từ nguồn dữ liệu của tôi trong định dạng văn bản và muốn chuyển đổi DTO của tôi sang JSON theo định dạng được hiển thị n nhận xét của tôi bên dưới. Vấn đề chính tôi đang gặp là cố gắng tạo mảng tọa độ [[...]] mà không có tên thuộc tính.

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

Các kết quả trên "gần như" những gì tôi muốn, nhưng không chính xác. Đầu ra được như hình dưới đây:

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

DTOs của tôi được định nghĩa như sau:

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


} 

Tôi đã cố gắng sử dụng các bộ thay vì phối hợp lớp, nhưng điều đó chỉ đơn giản là chèn "item1" và "ITEM2" bất động sản tên thay vì "x" và "y".

Điều duy nhất tôi chưa thử là tạo Trình chuyển đổi JSON của riêng mình?

Cảm ơn trước sự giúp đỡ, liên quan

Kind,

Stefan

CẬP NHẬT VỀ GIẢI PHÁP

tôi đạt đến một giải pháp nhờ vào câu trả lời được lựa chọn ở đây (từ Dhanuka777) về mảng đa chiều, nhưng để hoàn thành trong trường hợp nó giúp:

tôi đã phải tạo ra một hàm helper mới (phiên bản sửa đổi nhẹ của Tạo chữ nhật chức năng Mảng Jon Skeet từ đây: How to convert list of arrays into a multidimensional array)

giải pháp Mã như hình dưới đây:

/* 

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

Và một phiên bản sửa đổi nhẹ của Tạo chữ nhật mảng định nghĩa như sau:

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

Và cập nhật GeometryDto như sau:

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

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


    } 

API Web sẽ sử dụng Newtonsoft Json để tuần tự hóa các đối tượng theo định dạng bắt buộc.

+0

Xin làm rõ. Câu hỏi dường như được hỏi về serialization (dto to json) nhưng mã cho thấy deserialization.Bạn đang sử dụng thư viện nào hoặc mã nào cho serialization? –

+0

Cảm ơn Tom, tôi nên đã chỉ định, tôi đang sử dụng Web API 2 để sắp xếp lại các DTO này về cho khách hàng. –

Trả lời

1

Tôi thà sử dụng bộ nối tiếp Newtonsoft Json để thực hiện việc này. Defininig tọa độ như mảng 2D sẽ làm các trick.

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

Lấy Nuget từ đây.

Output: { "Loại": "Đa giác", "tọa độ": [[319686.3666000003,7363726.795], [319747.05190000031,7363778.9233], ...]}

+0

Cảm ơn tuyệt vời Dhanuka777, mẹo cho mảng đôi đa chiều đã dẫn tôi đến một câu trả lời làm việc. –

+0

Tôi đã cập nhật câu hỏi bằng cách thực hiện điều này với đề xuất mảng đa chiều, trong trường hợp nó giúp người khác. Cảm ơn –

Các vấn đề liên quan