Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP将MySQL中的已知文本(WKT)转换为Google Maps多边形_Php_Javascript_Google Maps - Fatal编程技术网

使用PHP将MySQL中的已知文本(WKT)转换为Google Maps多边形

使用PHP将MySQL中的已知文本(WKT)转换为Google Maps多边形,php,javascript,google-maps,Php,Javascript,Google Maps,我已经搜索了整个网络,但我没有找到任何解决方案…我找到的任何解决方案都不适合我。。。我有一行是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.954567 37.732698,23.954467 37.732603,23.954258 37.

我已经搜索了整个网络,但我没有找到任何解决方案…我找到的任何解决方案都不适合我。。。我有一行是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.954567 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))

多多边形(((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.734536)))

没有外环的简单多边形

我想: 查询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>

一些头衔
函数解析多字符串(ps){
var i、j、lat、lng、tmp、tmpArr、,
arr=[],
//匹配“(”和“)”以及它们之间包含除“(”或“)”以外的任何内容
m=ps.match(/\([^\(\)]+\)/g);
如果(m!==null){
对于(i=0;i
您可以使用直接将WKT字符串转换为Google Maps API几何体对象。下面是一个演示:


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

应该是

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

还有Wicket(正如Arthur提到的)还有一个来自Mapbox,它在客户端JavaScript中处理如此广为人知的文本。

这些解决方案有什么问题?或者我们应该将其标记为一个副本吗?第一个涉及多行和点,而不是多边形和多多边形,第二个涉及java。这些是最接近的帖子对于我的问题,我也在stackoverflow找到了另一个帖子,问了同样的问题,但根本没有答案……我搜索了将近一个星期,这篇帖子是我最后的机会,没有一个“清晰”的方法可以做到这一点……)非常感谢!!在你的帮助下,我设法做了我想做的事!!Thx!!:)在解析过程中,纬度和经度是相反的(WKT是经度,然后是纬度)。除了保持服务器上的负载外,还有什么理由用Javascript在客户端进行解析,而不是让PHP在服务器上进行解析?我不喜欢把负载推给用户,特别是因为没有缓存的潜力。对于很少更改但经常显示的字段(常见于政治边界,多多边形的主要用途),解析可以执行一次并缓存。如果处理详细的数据集,这里的负载可能很大。
lng = Number(tmp[j]);
lat = Number(tmp[j + 1]);