Golang中计算两个多边形几何交集的推荐空间包有哪些

Golang中计算两个多边形几何交集的推荐空间包有哪些 给定两个多边形几何体(坐标列表),我想计算相交部分的坐标。 是否有标准的 Go 包可以计算这个?

1 回复

更多关于Golang中计算两个多边形几何交集的推荐空间包有哪些的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中处理多边形交集计算,推荐使用以下空间几何包:

1. Turf for Go (go-turf)

package main

import (
    "fmt"
    "github.com/twpayne/go-geom"
    "github.com/twpayne/go-geom/encoding/geojson"
    "github.com/twpayne/go-turf"
)

func main() {
    poly1 := geom.NewPolygon(geom.XY).MustSetCoords([][]geom.Coord{
        {{0, 0}, {2, 0}, {2, 2}, {0, 2}, {0, 0}},
    })
    
    poly2 := geom.NewPolygon(geom.XY).MustSetCoords([][]geom.Coord{
        {{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 1}},
    })
    
    intersection, err := turf.Intersection(poly1, poly2)
    if err != nil {
        fmt.Println("无交集:", err)
        return
    }
    
    data, _ := geojson.Marshal(intersection)
    fmt.Printf("交集GeoJSON: %s\n", string(data))
}

2. GEOS绑定 (go-geos)

package main

import (
    "fmt"
    "github.com/twpayne/go-geos"
)

func main() {
    poly1 := geos.Must(geos.NewPolygon(
        geos.NewCoordSliceFromCoords([]geos.Coord{
            {X: 0, Y: 0}, {X: 2, Y: 0}, 
            {X: 2, Y: 2}, {X: 0, Y: 2}, {X: 0, Y: 0},
        }),
    ))
    
    poly2 := geos.Must(geos.NewPolygon(
        geos.NewCoordSliceFromCoords([]geos.Coord{
            {X: 1, Y: 1}, {X: 3, Y: 1}, 
            {X: 3, Y: 3}, {X: 1, Y: 3}, {X: 1, Y: 1},
        }),
    ))
    
    intersection := geos.Must(poly1.Intersection(poly2))
    fmt.Printf("交集WKT: %s\n", geos.Must(intersection.ToWKT()))
}

3. Simple Features (orb)

package main

import (
    "fmt"
    "github.com/paulmach/orb"
    "github.com/paulmach/orb/geojson"
    "github.com/paulmach/orb/planar"
)

func main() {
    poly1 := orb.Polygon{
        {{0, 0}, {2, 0}, {2, 2}, {0, 2}, {0, 0}},
    }
    
    poly2 := orb.Polygon{
        {{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 1}},
    }
    
    // 计算交集
    intersection := planar.Intersection(poly1, poly2)
    if intersection == nil {
        fmt.Println("无交集")
        return
    }
    
    feature := geojson.NewFeature(intersection)
    data, _ := feature.MarshalJSON()
    fmt.Printf("交集结果: %s\n", string(data))
}

4. GIS操作 (gogeo)

package main

import (
    "fmt"
    "github.com/golang/geo/s2"
)

func main() {
    // 使用S2几何库处理球面多边形
    points1 := []s2.Point{
        s2.PointFromLatLng(s2.LatLngFromDegrees(0, 0)),
        s2.PointFromLatLng(s2.LatLngFromDegrees(0, 2)),
        s2.PointFromLatLng(s2.LatLngFromDegrees(2, 2)),
        s2.PointFromLatLng(s2.LatLngFromDegrees(2, 0)),
    }
    
    loop1 := s2.LoopFromPoints(points1)
    poly1 := s2.PolygonFromLoops([]*s2.Loop{loop1})
    
    // 类似创建第二个多边形...
    // intersection := poly1.Intersection(poly2)
}

性能对比:

  • go-geos:基于GEOS C++库,功能最全,性能最好
  • orb:纯Go实现,轻量级,API简洁
  • go-turf:Turf.js的Go移植,地理空间分析功能丰富
  • s2:适合全球尺度的球面几何计算

根据你的具体需求选择:

  • 需要完整GIS功能:go-geos
  • 轻量级应用:orb
  • 地理空间分析:go-turf
  • 全球坐标计算:s2
回到顶部