我正在try 找到一种方法来判断一对LAT/LNG坐标是否在一个区域内(由其他LAT/LNG坐标生成).

例如,如果我的区域是使用以下坐标生成的矩形:

43.672162 , -79.43585
43.629845 , -79.314585

我想判断一下这些坐标是否在该区域内: 43.651989 , -79.371993

我试过用这个套餐,但不能用:github.com/kellydunn/golang-geo

p1 := geo.NewPoint(coords[0].LatX, coords[0].LonX)
p2 := geo.NewPoint(coords[0].LatY, coords[0].LonY)
geo.NewPolygon(p1, p2)

我想知道有没有人可以分享这方面的实现,或者有什么资源可以为我指明正确的方向?我也对使用谷歌 map API持开放态度.

推荐答案

在您的示例中,它是一个矩形,可以按如下方式计算:

  1. 找到区域的最小点.MinimumPoint.X = Min(p1.X, p2.X)MinimumPoint.Y = Min(p1.Y, p2.Y)
  2. 找到面积的最大点.MaximumPoint.X = Max(p1.X, p2.X)MaximumPoint.Y = Max(p1.Y, p2.Y)
  3. 判断这一点在它们之间: CheckPoint.X > MinimumPoint.XCheckPoint.X < MaximumPoint.X以及CheckPoint.Y > MinimumPoint.YCheckPoint.Y < MaximumPoint.Y

或者您可以使用下面的contains函数:https://pkg.go.dev/github.com/paulmach/orb

添加到项目:go get github.com/paulmach/orb

以下是我为您的问题编写的示例代码:

package main

import (
    "fmt"

    "github.com/paulmach/orb"
)

func main() {
    p1 := orb.Point{43.672162, -79.43585}
    p2 := orb.Point{43.629845, -79.314585}

    bound := orb.MultiPoint{p1, p2}.Bound()

    fmt.Printf("bound: %+v\n", bound)

    checkList := []orb.Point{orb.Point{43.651989, -79.371993}, p1, p2, orb.Point{43, -79}}

    fmt.Printf("\ncontains?\n")
    for _, checkPoint := range checkList {
        fmt.Printf("    %+v:%t\n", checkPoint, bound.Contains(checkPoint))
    }
}

结果:

bound: {Min:[43.629845 -79.43585] Max:[43.672162 -79.314585]}

contains?
    [43.651989 -79.371993]:true
    [43.672162 -79.43585]:true
    [43.629845 -79.314585]:true
    [43 -79]:false

Go相关问答推荐

+在具有html/模板Golang的Base64中

mockgen不创建模拟

转到http服务器头内容-类型设置为多部分/表单-数据,但在客户端获取内容-类型:文本/纯文本

golang regex基于关键字拆分字符串

以编程方式取消 pyspark dataproc 批处理作业(job)

通过多阶段构建复制到 Docker 容器中时找不到文件

对 CSV 进行单元测试失败

Golang - POST 失败(NoSurf CSRF)

闭包所处的环境范围是什么?

Go 切片容量增长率

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

如何确定作为函数参数传递的指针是否正在被修改或副本是否正在被修改?

Golang 通过接口反映/迭代{}

如何模仿联合类型

如何在时间范围内规范化数组的元素?

速率限制特定端点

在 Go GRPC 服务器流式拦截器上修改元数据

无法建立连接,因为目标机器主动拒绝它 Golang

无限期运行 Go routine (完成后重新启动)

不能使用 *T 类型的变量作为参数类型