检查一个点是否位于传单半圆内
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)?
- 使用毕达哥拉斯或(更准确)Haversine Formula
确定(简化的)半径
- Find the angle between two points in a 2d-space
我有一些小区站点:每个小区都有角度方向和以公里为单位的范围 我从数据库中获取这些单元格,并在带有半圆形的传单地图上表示它们,如下所示: 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)?
- 使用毕达哥拉斯或(更准确)Haversine Formula 确定(简化的)半径
- Find the angle between two points in a 2d-space