我要搜索多边形坐标内的位置。
我的多边形线json数组是这样的:
[{"lat":23.044131034993626,"lng":72.52770534192086},{"lat":23.045493462614736,"lng":72.53060212765695},{"lat":23.04381510777979,"lng":72.53163209591867},{"lat":23.042472408854092,"lng":72.52843490277291}]
我的数据库表名称为place,其值如下:
id lat lng
1 23.0449391 72.5301363
2 23.044816 72.529531
3 23.0439868 72.5291617
4 23.0440151 72.5291033
5 23.0441163 72.529624
6 23.044531 72.52946
7 23.0449581 72.5301291
8 23.044081 72.529584
9 23.0440654 72.5295851
10 23.0443758 72.529803
11 23.047929 72.527231
11 23.0464945 72.5288149
所以我想要多边形线内的地方
在上表中,多边形线中的前10个点位于多边形线中,其余两个点不在多边形线中
我已经尝试过该查询,但是它不起作用
select id, lat, lng from places
where st_within(point(lng, lat), ST_GeomFromText('Polygon((72.52770534192086 23.044131034993626, 72.53060212765695 23.045493462614736, 72.53163209591867 23.04381510777979,72.52843490277291 23.042472408854092))'));
所以请建议我mysql选择查询。
答案 0 :(得分:0)
我不知道MySql是否有办法,但是在PHP中可以做到这一点。
如果您可以使用以下数组结构从数据库中检索数据
$pol = array(
array('lat' => 23.034002369168842,'lng' => 72.56034198842099),
array('lat' => 23.033439580995058,'lng' => 72.56498757443478),
array('lat' => 23.03146486705749, 'lng' => 72.56323877415707),
array('lat' => 23.029875201316813,'lng' => 72.55889359555295),
array('lat' => 23.031682087006978,'lng' => 72.55772415242245),
array('lat' => 23.032955778756484,'lng' => 72.55875412068417),
array('lat' => 23.033972748797236,'lng' => 72.56003085217526)
);
和您的点的坐标,例如
$point = array('lat' =>, 23.0337224, 'lng' => 72.5668896);
告诉您点是否在多边形内的功能可能类似于
function is_inside($point, $polygon) {
if ($polygon[0] != $polygon[count($polygon) - 1])
$polygon[count($polygon)] = $polygon[0];
$j = 0;
$inside = false;
$x = $point['lat'];
$y = $poin['lng'];
$n = count($polygon);
for ($i = 0; $i < $n; $i++) :
$j++;
if ($j == $n)
$j = 0;
if ((($polygon[$i]['lng'] < $y) && ($polygon[$j]['lng'] >= $y)) || (($polygon[$j]['lng'] < $y) && ($polygon[$i]['lng'] >= $y))) :
if ($polygon[$i]['lat'] + ($y - $polygon[$i]['lng']) / ($polygon[$j]['lng'] - $polygon[$i]['lng']) * ($polygon[$j]['lat'] - $polygon[$i]['lat']) < $x)
$inside = !$inside;
endif;
endfor;
return $inside;
}
因此您可以仅通过调用函数来检查该点是否在内部
if(is_inside($point, $polygon)){
/* do something */
}