用PHP转换知名文本(WKT)从MySQL到谷歌地图多边形

Convert Well-known text (WKT) from MySQL to Google Maps polygons with PHP

本文关键字:MySQL 多边形 谷歌地图 WKT 转换 PHP 文本      更新时间:2023-09-26

我已经搜索了整个网络,我还没有找到任何解决方案…我找到的任何解决方案都不适合我……我有一个行与VARCHARS和其他与这些几何类型,例如:

多边形((23.953261 - 37.733372,23.953623 - 37.733202,23.953572 - 37.733132,23.954075 - 37.732896,23.954126 - 37.732966,23.954550 - 37.732767,23.954566 - 37.732698,23.954467 - 37.732603,23.954258 - 37.732476,23.953007 - 37.733041,23.953207 - 37.733303,23.953261 - 37.733372),(23.953695 - 37.732771,23.954243 - 37.732524,23.954427 - 37.732635,23.954496 - 37.732702,23.954484 - 37.732757,23.954133 - 37.732921,23.954087 - 37.732859,23.953525 - 37.733122,23.953577 - 37.733192,23.953292 - 37.733326,23.953080 - 37.733050,23.953695 - 37.732771))

MULTIPOLYGON(((23.949134 37.734540,23.948811 37.734215,23.948775 37.734238, 23.9489077 37.734541,23.948689 37.734820,23.948809 37.734447,23.948414 37.734470,23.948472 37.734526,23.948420 37.734560,23.948449 37.734588,23.948536 37.734531)))

和不带外圈的简单多边形....

我想:mysql查询解析数据,将它们传递给js并把他们吸引到谷歌地图上。有什么帮助吗?

听起来这真的是一个正则表达式问题,因为你根本不知道如何正确地从这些字符串中提取所有的坐标集,对吗?正则表达式是你的朋友,做一些谷歌关于他们的理解,因为我将只演示在这里。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Some Title</title>
</head>
<body>
<div id="map_canvas" style="width:800px; height:600px;">
</div>
<?php
$polyString1 = 'POLYGON((23.953261 37.733372,23.953623 37.733202,23.953572 37.733132,23.954075 37.732896,23.954126 37.732966,23.954550 37.732767,23.954566 37.732698,23.954467 37.732603,23.954258 37.732476,23.953007 37.733041,23.953207 37.733303,23.953261 37.733372),(23.953695 37.732771,23.954243 37.732524,23.954427 37.732635,23.954496 37.732702,23.954484 37.732757,23.954133 37.732921,23.954087 37.732859,23.953525 37.733122,23.953577 37.733192,23.953292 37.733326,23.953080 37.733050,23.953695 37.732771))';
$polyString2 = 'MULTIPOLYGON(((23.949134 37.734540,23.948811 37.734215,23.948775 37.734238,23.949077 37.734541,23.948689 37.734820,23.948809 37.734747,23.949134 37.734540)),((23.948536 37.734531,23.948449 37.734447,23.948414 37.734470,23.948472 37.734526,23.948420 37.734560,23.948449 37.734588,23.948536 37.734531)))';
echo '<script type="text/javascript">';
//note the quote styles below, Important!
echo "var polys=['$polyString1','$polyString2'];";
echo '</script>';
?>
<script src="https://maps.googleapis.com/maps/api/js?v=3&sensor=false"></script>
<script type="text/javascript">
function parsePolyStrings(ps) {
    var i, j, lat, lng, tmp, tmpArr,
        arr = [],
        //match '(' and ')' plus contents between them which contain anything other than '(' or ')'
        m = ps.match(/'([^'(')]+')/g);
    if (m !== null) {
        for (i = 0; i < m.length; i++) {
            //match all numeric strings
            tmp = m[i].match(/-?'d+'.?'d*/g);
            if (tmp !== null) {
                //convert all the coordinate sets in tmp from strings to Numbers and convert to LatLng objects
                for (j = 0, tmpArr = []; j < tmp.length; j+=2) {
                    lat = Number(tmp[j]);
                    lng = Number(tmp[j + 1]);
                    tmpArr.push(new google.maps.LatLng(lat, lng));
                }
                arr.push(tmpArr);
            }
        }
    }
    //array of arrays of LatLng objects, or empty array
    return arr;
}
function init() {
    var i, tmp,
        myOptions = {
            zoom: 16,
            center: new google.maps.LatLng(23.9511, 37.7337),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        },
        map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    for (i = 0; i < polys.length; i++) {
        tmp = parsePolyStrings(polys[i]);
        if (tmp.length) {
            polys[i] = new google.maps.Polygon({
                paths : tmp,
                strokeColor : '#FF0000',
                strokeOpacity : 0.8,
                strokeWeight : 2,
                fillColor : '#FF0000',
                fillOpacity : 0.35
            });
            polys[i].setMap(map);
        }
    }
}
init();
</script>
</body>
</html>

您可以使用开源库Wicket直接将WKT字符串转换为Google Maps API几何对象。下面是一个演示:

http://arthur-e.github.io/Wicket/sandbox-gmaps3.html

@astupidname几乎是正确的,但会让您出错的是,空间数据库使用经度、纬度,而地图系统使用经度、纬度。因此,WKT的输入是x,y(经度,纬度)。

lat = Number(tmp[j]);
lng = Number(tmp[j + 1]);
应该

lng = Number(tmp[j]);
lat = Number(tmp[j + 1]);

除了Wicket(正如Arthur所提到的)之外,还有Mapbox,它在客户端JavaScript中处理这种众所周知的文本。