我正在使用谷歌地图使用Code Igniter开发应用程序,我有一个很大的问题,即检查标记的坐标是否在存储在我的数据库中的圆的半径范围内。
我将尝试用伪代码描述,抱歉我是新手。
右击 - > Google地图上会显示一个圆圈,其中包含一个InfoBubble,您可以在其中以米为单位填写名称,颜色和圆半径;
点击保存 - >使用ajax我发送圆心,名称,颜色等
在AJAX中,我在数据库中存储有关圆圈的信息,但在注册之前,我需要设置在创建的圆弧半径内找到的标记数量。
我搜索过并找到了这个链接http://www.movable-type.co.uk/scripts/latlong.html,但我的数学并不是很好。
我需要一个带圆,标记坐标和半径的函数,如果标记在圆圈内,则返回true或false。
我做了一些我在网上找到但却不起作用的东西
public function arePointsNear($checkPoint, $centerPoint, $km) {
$km = $km * 1000;
$ky = 40000 / 360;
$kx = cos(pi() * $centerPoint->lat / 180.0) * $ky;
$dx = abs($centerPoint->lng - $checkPoint->lng) * $kx;
$dy = abs($centerPoint->lat - $checkPoint->lat) * $ky;
return sqrt($dx * $dx + $dy * $dy) <= $km;
}
谢谢!
答案 0 :(得分:4)
让我给你一些在Javascript中计算的代码;所有这些都在谷歌地图代码中,但计算距离的功能只是一个功能,而不是一项服务。 (我不知道谁写了这个函数)
你的问题是拥有PHP功能,对吧?毫无疑问,您可以将javascript函数转换为PHP;或者您只是相信javascript中的计算并使用Ajax发送该结果。
代码绘制一个圆(中心=布鲁塞尔;半径= 30km)和4个标记。你可以全部拖动它们。 单击按钮会触发计算。 我通过将标记变为绿色或红色来显示结果。
(你知道如何从这里接管吗?)
<style>
#map-canvas {
height: 400px;
margin: 0px;
padding: 0px;
}
</style>
<div id="map-canvas"></div>
<input type="button" id="start" value="Click">
<p>Drag the circle, drag the markers; when you click the button it will calculate if the markers are in the circle</p>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?"></script>
<script>
function initialize() {
// settings
var center = new google.maps.LatLng(50.84546, 4.357112);
var radius_circle = 30000; // 30km
var markerPositions = [
{lat: 50.940749, lng: 4.2033035},
{lat: 50.791671, lng: 4.587825},
{lat: 50.66649, lng: 3.945124},
{lat: 50.429139, lng: 4.813044}
];
var markers=[];
// draw map
var mapOptions = {
center: center,
zoom: 8,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var circle = drawCircle(mapOptions.center, radius_circle);
// markers
for (var i=0; i<markerPositions.length; i++) {
markers.push(
new google.maps.Marker({
position: new google.maps.LatLng(markerPositions[i].lat, markerPositions[i].lng),
map: map,
draggable: true
})
);
}
// client clicks on button, we will check for the markers within the circle
google.maps.event.addDomListener(document.getElementById('start'), 'click', function() {
for (var i=0; i<markerPositions.length; i++) {
var distance = calculateDistance(
markers[i].getPosition().lat(),
markers[i].getPosition().lng(),
circle.getCenter().lat(),
circle.getCenter().lng(),
"K"
);
if (distance * 1000 < radius_circle) { // radius is in meter; distance in km
markers[i].setIcon('http://maps.gstatic.com/mapfiles/icon_green.png'); // make or find a better icon
}
else {
markers[i].setIcon('http://maps.gstatic.com/mapfiles/icon.png'); // make or find a better icon
}
}
});
function drawCircle(center, radius) {
return new google.maps.Circle({
strokeColor: '#0000FF',
strokeOpacity: 0.7,
strokeWeight: 1,
fillColor: '#0000FF',
fillOpacity: 0.15,
draggable: true,
map: map,
center: center,
radius: radius
});
}
function calculateDistance(lat1, lon1, lat2, lon2, unit) {
var radlat1 = Math.PI * lat1/180;
var radlat2 = Math.PI * lat2/180;
var radlon1 = Math.PI * lon1/180;
var radlon2 = Math.PI * lon2/180;
var theta = lon1-lon2;
var radtheta = Math.PI * theta/180;
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist);
dist = dist * 180/Math.PI;
dist = dist * 60 * 1.1515;
if (unit=="K") { dist = dist * 1.609344; }
if (unit=="N") { dist = dist * 0.8684; }
return dist;
}
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>