Google 地图圈 / MySQL 查询
Google Maps Circle / MySQL query
我想在地图上画一个圆,并在我的数据库中获取所有行,其中 lat/lng 个点落入该圆。
我不想使用 google.maps.Circle
绘制圆,因为那样会应用墨卡托投影失真。我想要一个几何圆而不是地理圆。
所以我可能可以使用某种叠加层将其绘制到 Google 地图上。但是是否可以查询我的数据库以获取这些点?
如果我要画一个地理圆,我可以使用 haversine formula,但这不适用于几何圆。
您可以使用具有足够线段的多边形来绘制圆:
// lat, lng, and radius specify the circle
// CosDeg, SinDeg are functions that accept input in degrees
mPerDegLat = 110540,
mPerDegLng = CosDeg(lat) * 111320; //-- mPerDegLng CORRECTED FOR LATITUDE
numSegs = 64;
deltaAng = 360 / numSegs;
verts = [];
for (i=0; i<numSegs; i++) {
angle = i * deltaAng;
dy = CosDeg(angle) * radius;
dx = SinDeg(angle) * radius;
deltaLat = dy / mPerDegLat; //-- METRES PER DEGREE
deltaLng = dx / mPerDegLng;
vertex = {lat:(lat + deltaLat), lng:(lng + deltaLng)};
verts.push(vertex);
}
polyCircle = new google.maps.Polygon({paths:verts, strokeColor...});
至于 MySql,您是否可以 运行 查询 "geographically rectangular" 区域使用带有足够填充的纬度、经度值以确保您不会遗漏任何内容,并且然后用一个脚本过滤结果,做逆向计算,看看它们是否在圆圈内?
您可以使用 毕达哥拉斯 求圆内的点。
a^2 + b^2 = c^2
下面的SQL使用PDO求圆
半径内的点
$stmt = $dbh->prepare("SELECT name, lat, lng, ( SQRT(POW(? - lat, 2)
+ POW(? - lng, 2))) AS distance FROM mytable
HAVING distance < ? ORDER BY distance ASC ");
// Assign parameters
$stmt->bindParam(1,$center_lat);//Center of circle
$stmt->bindParam(2,$center_lng);////Center of circle
$stmt->bindParam(3,$radius);
Javascript 函数
function Pythagoras (x1,y1,x2,y2){
var Dist = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
return Dist ;
}
我想在地图上画一个圆,并在我的数据库中获取所有行,其中 lat/lng 个点落入该圆。
我不想使用 google.maps.Circle
绘制圆,因为那样会应用墨卡托投影失真。我想要一个几何圆而不是地理圆。
所以我可能可以使用某种叠加层将其绘制到 Google 地图上。但是是否可以查询我的数据库以获取这些点?
如果我要画一个地理圆,我可以使用 haversine formula,但这不适用于几何圆。
您可以使用具有足够线段的多边形来绘制圆:
// lat, lng, and radius specify the circle
// CosDeg, SinDeg are functions that accept input in degrees
mPerDegLat = 110540,
mPerDegLng = CosDeg(lat) * 111320; //-- mPerDegLng CORRECTED FOR LATITUDE
numSegs = 64;
deltaAng = 360 / numSegs;
verts = [];
for (i=0; i<numSegs; i++) {
angle = i * deltaAng;
dy = CosDeg(angle) * radius;
dx = SinDeg(angle) * radius;
deltaLat = dy / mPerDegLat; //-- METRES PER DEGREE
deltaLng = dx / mPerDegLng;
vertex = {lat:(lat + deltaLat), lng:(lng + deltaLng)};
verts.push(vertex);
}
polyCircle = new google.maps.Polygon({paths:verts, strokeColor...});
至于 MySql,您是否可以 运行 查询 "geographically rectangular" 区域使用带有足够填充的纬度、经度值以确保您不会遗漏任何内容,并且然后用一个脚本过滤结果,做逆向计算,看看它们是否在圆圈内?
您可以使用 毕达哥拉斯 求圆内的点。
a^2 + b^2 = c^2
下面的SQL使用PDO求圆
半径内的点$stmt = $dbh->prepare("SELECT name, lat, lng, ( SQRT(POW(? - lat, 2)
+ POW(? - lng, 2))) AS distance FROM mytable
HAVING distance < ? ORDER BY distance ASC ");
// Assign parameters
$stmt->bindParam(1,$center_lat);//Center of circle
$stmt->bindParam(2,$center_lng);////Center of circle
$stmt->bindParam(3,$radius);
Javascript 函数
function Pythagoras (x1,y1,x2,y2){
var Dist = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
return Dist ;
}