1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/tidwall/geojson/geometry"
)
type F struct {
Polys []*geometry.Poly
}
func (f *F) Insert(poly *geometry.Poly) {
f.Polys = append(f.Polys, poly)
}
func (f *F) Contains(x float64, y float64) bool {
p := geometry.Point{X: x, Y: y}
for _, poly := range f.Polys {
if poly.ContainsPoint(p) {
return true
}
}
return false
}
func main() {
// 多边形坐标集字符串,geojson.io可以生成
polygonString := `[[
[84.06629085202707,61.09246473319979],
[72.49198357244117,54.2478482682468],
[76.04595361631505,49.145991557702814],
[113.30166443088888,51.79338737652475],
[114.95645443380147,55.102615742572425],
[109.48319438253571,59.55098721892466],
[104.69660340886469,60.03279304645392],
[95.37143615702166,53.7249665598695],
[105.9540342347463,55.274455891821276],
[92.46849779684248,51.413269843450934],
[90.8684973410422,58.41496021967512],
[84.06629085202707,61.09246473319979]
]]`
// 解析 JSON 字符串以获取多边形坐标
var coords [][][2]float64
if err := json.Unmarshal([]byte(polygonString), &coords); err != nil {
log.Fatalf("Error parsing JSON: %v", err)
}
// 将坐标转换为 geometry.Point 类型
var points []geometry.Point
for _, coord := range coords[0] {
points = append(points, geometry.Point{X: coord[0], Y: coord[1]})
}
// 创建多边形
poly := geometry.NewPoly(points, nil, geometry.DefaultIndexOptions)
// 创建一个查找器实例
finder := F{}
// 将多边形插入查找器
finder.Insert(poly)
// 使用提供的坐标检查点是否在多边形内
pointX, pointY := 87.24702218937767, 54.08457905522715 // 在圈内
contains := finder.Contains(pointX, pointY)
fmt.Println("Point is in polygon:", contains)
pointX, pointY = 96.92668165010213, 47.6979436832691 // 不在圈内
contains = finder.Contains(pointX, pointY)
fmt.Println("Point is in polygon:", contains)
}
|