Go语言如何解析坐标维度随type字段动态变化的GeoJSON结构?
Go处理GeoJSON动态坐标维度的两种可行方案
方案1:空接口+类型断言(快速实现,适合小型项目)
不需要额外实现接口,修改成本最低:
- 修改结构体定义,将Coordinates字段类型设为
interface{}:
type Geometry struct { Type string `json:"type"` Coordinates interface{} `json:"coordinates"` }
- 反序列化完成后,根据
Type字段的值对Coordinates做类型断言即可使用:
var data Geometry err := json.Unmarshal([]byte(geoJsonString), &data) if err != nil { // 处理解析错误 } // 按几何类型匹配坐标维度 switch data.Type { case "Point": coords, ok := data.Coordinates.([]float64) if ok { // 处理Point坐标,coords[0]为经度、coords[1]为纬度 } case "LineString": coords, ok := data.Coordinates.([][]float64) if ok { // 处理LineString坐标 } case "Polygon": coords, ok := data.Coordinates.([][][]float64) if ok { // 处理Polygon坐标 } case "MultiPolygon": coords, ok := data.Coordinates.([][][][]float64) if ok { // 处理MultiPolygon坐标 } // 可补充MultiPoint、MultiLineString等其他GeoJSON类型的匹配逻辑 }
方案2:自定义反序列化逻辑(更健壮,适合生产环境)
通过实现json.Unmarshaler接口将解析逻辑封装在结构体内部,外部无需手动做类型断言,可维护性更高:
- 定义结构体并实现反序列化接口:
import "encoding/json" type Geometry struct { Type string `json:"type"` PointCoords []float64 `json:"-"` // 标记为JSON忽略,由自定义逻辑赋值 LineStringCoords [][]float64 `json:"-"` PolygonCoords [][][]float64 `json:"-"` MultiPolygonCoords [][][][]float64 `json:"-"` } func (g *Geometry) UnmarshalJSON(data []byte) error { // 临时结构体用于先解析类型和原始坐标内容 type tempGeom struct { Type string `json:"type"` Coordinates json.RawMessage `json:"coordinates"` } var temp tempGeom if err := json.Unmarshal(data, &temp); err != nil { return err } g.Type = temp.Type // 根据几何类型解析对应维度的坐标 switch g.Type { case "Point": return json.Unmarshal(temp.Coordinates, &g.PointCoords) case "LineString": return json.Unmarshal(temp.Coordinates, &g.LineStringCoords) case "Polygon": return json.Unmarshal(temp.Coordinates, &g.PolygonCoords) case "MultiPolygon": return json.Unmarshal(temp.Coordinates, &g.MultiPolygonCoords) default: // 其他类型可按相同规则补充解析逻辑 return nil } }
- 后续直接正常调用反序列化即可,使用时直接读取对应类型的坐标字段:
var data Geometry err := json.Unmarshal([]byte(geoJsonString), &data) if err != nil { // 处理解析错误 } // 示例:如果是Point类型,直接读取data.PointCoords即可
如果不想手动实现解析逻辑,也可以直接使用社区成熟的Go GeoJSON处理库,已经封装好了全类型的解析、校验逻辑。
内容的提问来源于stack exchange,提问作者Jain Vipray
相关产品推荐
相关产品推荐

