检查纬度和经度是否在区域内的公式,免使用Google Maps API

2 投票
3 回答
4010 浏览
提问于 2025-04-17 20:54

我有一个示例地图,链接在这里:这个

这里是图片描述

我制作了一个边界多边形的形状。

-6.875165174925262, 107.56293296813965
-6.882663904407988, 107.66730308532715
-6.980818117491586, 107.67210960388184
-6.97093546084682, 107.54508018493652

我想知道如何检查给定的坐标(纬度和经度)-6.935884,107.611592是否在这个边界多边形内?

我需要在没有Google地图API的情况下进行这个检查,因为我的程序需要离线运行,并且检查的频率比Google API的免费服务允许的要高。

有没有什么几何公式可以用来实现这个?如果可以的话,最好用PHP或Python来做。

3 个回答

0

你可以试试这个PHP库(https://github.com/xopbatgh/sb-polygon-pointer),它可能适合你的需求。

你只需要做以下几步:

  1. 输入你多边形的坐标

  2. 询问这个库某个经纬度的点是否在这个多边形内

$polygonBox = [
    [55.761515, 37.600375],
    [55.759428, 37.651156],
    [55.737112, 37.649566],
    [55.737649, 37.597301],
];

$sbPolygonEngine = new sbPolygonEngine($polygonBox);

$isCrosses = $sbPolygonEngine->isCrossesWith(55.746768, 37.625605);

// $isCrosses is boolean

1

我不是一个专门做JavaScript的人,但这看起来像是学校学的平面几何。假设你有一个多边形,它的角落是:

A(x1, y1), B(x2, y2), C(x3, y3), D(x4, y4)

这里插入图片描述

如果你想检查一个点E(X,Y)是否在这个多边形的区域内,可以这样做:

  1. 先构建每条边AB、BC、CD、DA的方程,像这样 y - y1 = m(x - x1),其中 m=(x1-x2)/(y1 - y2),这里的A(x1, y1)和B(x2, y2)是这条边的两个端点。

  2. 然后检查点E(X, Y)是否在对应的直线的一侧,方法如下:

if (Y > m(X - x1) + y1)
{
   // resides on the upper area
}
else (Y < m(X - x1) + y1)
{
   // resides on the below area
}
else
{
   // resides right on the line
}
4

最后我找到了答案……
检测点是否在多边形内

这个函数对我帮助很大……而且效果很好……其他一些函数有时候会错误地判断一个点是在多边形内还是外面。

撰写回答