如何使用mysql查找多边形线内的位置

时间:2019-04-18 13:47:41

标签: php mysql

我要搜索多边形坐标内的位置。

我的多边形线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选择查询。

1 个答案:

答案 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 */
}