检查一个点是否位于传单半圆内

Check if a point resides inside a leaflet semiCircle

我有一些小区站点:每个小区都有角度方向和以公里为单位的范围 我从数据库中获取这些单元格,并在带有半圆形的传单地图上表示它们,如下所示: screenshot of my map

我有一个家庭地址(坐标),我想检查它是否被(一个或一些)单元格覆盖

因为我找不到检查点(家)是否位于半圆内的方法,所以我决定将我的半圆转换为 L.Geojson 以便使用 leaflet-pip 插件

转化码:

let cellGeojson = {
                "features": [
                    {
                        "type": "Feature",
                        "properties": {
                            "id": cell.id,
                            "name": cell.name,
                            "coords": cell.latitude + "," + cell.longitude,
                            "lat": cell.latitude,
                            "long": cell.longitude,
                            "location": cell.location,
                            "azimuth": cell.azimuth,
                        },
                        "geometry": {
                            "type": "Point",
                            "coordinates": [cell.longitude, cell.latitude]
                        }
                    }
                ]
            }
            let cellLayer = L.geoJSON(cellGeojson, {
                pointToLayer: function (pointFeature, latlng) {
                    let rangeMarker = L.semiCircle([cell.latitude,cell.longitude], {
                        radius: cell.range,
                        startAngle: cell.angle - 30,
                        stopAngle: cell.angle + 30
                    });
                    return rangeMarker;
                },
            }).addTo(this.map)

但是当我使用 leafletPip.pointInLayer(home, cellLayer, [false]) 它时 return 总是一个空数组,这意味着 home 没有被任何单元格覆盖,我认为原因是 pointToLayer 函数创建的 semiCircle 是只是一个标记,它的图层被视为一个点

我试过其他传单插件,例如 Leaflet.PointInPolygon ...但它不起作用,因为半圆不是多边形

所以我需要你的帮助来确定房子是否被覆盖

我很抱歉英语不好

我怀疑你在使用插件jieter/Leaflet-semicircle.

此插件已经实现了一个函数 _containsPoint(p),您可以使用
调用该函数 p = map.latLngToLayerPoint(L.latLng(yourXCoord,yourYCoord)).
该函数需要一个 L.point,您必须先使用地图 latLngToLayerPoint() 函数将其转换为
参考:https://github.com/jieter/Leaflet-semicircle/blob/master/Semicircle.js

如果这不起作用或者您使用的是其他插件,您也可以自己实现此功能(可能使用 above-mentioned 文件作为指导)。
这不是完全微不足道的,但应该可以通过以下资源实现:

How-To: How to determine whether a point (X,Y) is contained within an arc section of a circle (i.e. a Pie slice)?

  1. 使用毕达哥拉斯或(更准确)Haversine Formula
  2. 确定(简化的)半径
  3. Find the angle between two points in a 2d-space