使用PHP将MySQL中的已知文本(WKT)转换为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.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 并将它们绘制到谷歌地图上。使用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.
有什么帮助吗?听我说,这实际上是一个正则表达式问题,因为你根本不知道如何正确地从这些字符串中提取所有坐标集,对吗?正则表达式是你在这里的朋友,用谷歌搜索一下,以了解它们,因为我只在这里演示
<!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]);