2013-03-30 15 views
6

Uygun bir yapı türüne geojson dizgisini ayırmak istiyorum.Geojson unmarshal için uygun yapı tipi

type GeojsonType struct { 
    Type string 
    Coordinates interface{} 
} 

Bu bağlantıyı bakınız: Ben Özür tamamen mutlu değil bir yapı türü ile geldi

var jsonBlobPointString = []byte(`{"Type":"Point", "Coordinates":[1.1,2.0]}`) 
var jsonBlobLineString = []byte(`{"Type":"LineString", "Coordinates":[[1.1,2.0],[3.0,6.3]]}`) 
var jsonBlobPolygonString = []byte(`{"Type":"Polygon", "Coordinates":[[[1.1,2.0],[3.0,6.3],[5.1,7.0],[1.1,2.0]]]}`) 

: Ben aynı yapı içine unmarshal istediğiniz üç farklı GeoJSON dizeleri var tüm örnek için: http://play.golang.org/p/Bt-51BX__A

Coordinates için {} arabirimini kullanmamayı tercih ederim. Bunun yerine bazı doğrulama veren somehting kullanıyorum. Örneğin Coordinates [] Float64 için Point ve Coordinates [] [] float64 LineString için.

Nokta, Çizgi Stüdyosu ve Çokgen tümünün arabirim kullanmadan Koordinatlarda gösterilebilmesi için bir yapı türü oluşturmak mümkün mü?

+0

Unmarshaler arayüzünü uygulamaya çalıştınız mı? – Mikke

cevap

6

Ne istediğinizi, aynı json sözlüğünden 3 farklı nesne türü oluşturmaktır.

Bildiğim kadarıyla bu mümkün değil bildiği gibi, ancak json çözme geciktirmek ve

&{Type:Point Coordinates:[91 49 46 49 44 50 46 48 93] Point:{Coordinates:[1.1 2]} Line:{Points:[]} Polygon:{Lines:[]}} 
&{Type:LineString Coordinates:[91 91 49 46 49 44 50 46 48 93 44 91 51 46 48 44 54 46 51 93 93] Point:{Coordinates:[]} Line:{Points:[[1.1 2] [3 6.3]]} Polygon:{Lines:[]}} 
&{Type:Polygon Coordinates:[91 91 91 49 46 49 44 50 46 48 93 44 91 51 46 48 44 54 46 51 93 44 91 53 46 49 44 55 46 48 93 44 91 49 46 49 44 50 46 48 93 93 93] Point:{Coordinates:[]} Line:{Points:[]} Polygon:{Lines:[[[1.1 2] [3 6.3] [5.1 7] [1.1 2]]]}} 
yazdırır öncesi işlem like this

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Point struct { 
    Coordinates []float64 
} 

type Line struct { 
    Points [][]float64 
} 

type Polygon struct { 
    Lines [][][]float64 
} 

type GeojsonType struct { 
    Type  string 
    Coordinates json.RawMessage 
    Point  Point 
    Line  Line 
    Polygon  Polygon 
} 

var jsonBlob = []byte(`[ 
{"Type":"Point", "Coordinates":[1.1,2.0]}, 
{"Type":"LineString", "Coordinates":[[1.1,2.0],[3.0,6.3]]}, 
{"Type":"Polygon", "Coordinates":[[[1.1,2.0],[3.0,6.3],[5.1,7.0],[1.1,2.0]]]} 
]`) 

func main() { 
    var geojsonPoints []GeojsonType 
    err := json.Unmarshal(jsonBlob, &geojsonPoints) 
    if err != nil { 
     fmt.Println("error:", err) 
    } 

    // Postprocess the coordinates 

    for i := range geojsonPoints { 
     t := &geojsonPoints[i] 

     switch t.Type { 
     case "Point": 
      err = json.Unmarshal(t.Coordinates, &t.Point.Coordinates) 
     case "LineString": 
      err = json.Unmarshal(t.Coordinates, &t.Line.Points) 
     case "Polygon": 
      err = json.Unmarshal(t.Coordinates, &t.Polygon.Lines) 
     default: 
      panic("Unknown type") 
     } 
     if err != nil { 
      fmt.Printf("Failed to convert %s: %s", t.Type, err) 
     } 
     fmt.Printf("%+v\n", t) 
    } 
} 

biraz kullanmak RawMessage türünü kullanabilirsiniz

+0

Çok teşekkür ederim! Bence tam da ihtiyacım olan şey bu. – Gunnis

İlgili konular