如何将坐标字符串转换为LatLngBounds对象?

3

我有一个字符串对应于一个矩形,如下所示:

((x1,y1),x2,y2))

我希望将其转换为LatLngBounds对象,并通过以下方式绘制矩形:
myRectangle.setBounds(latLngBounds);

或者

myRectangle.setMap(map);
2个回答

6

这是一个有趣的字符串格式。我敢打赌你缺少了一个括号,它应该长成这样:

((x1,y1),(x2,y2))

现在的问题是这些x1等值代表什么。为了讨论方便,我假设顺序是:

((s,w),(n,e))

如果这不是正确的顺序,如何修复代码应该很明显。

一个简单的解析方法是先将所有括号去掉,为了安全起见,我们同时删除任何空格。然后你就剩下:

s,w,n,e

可以轻松分割成数组:

// Given a coordString in '((s,w),(n,e))' format,
// construct and return a LatLngBounds object
function boundsFromCoordString( coordString ) {
    var c = coordString.replace( /[\s()]/g, '' ).split( ',' );
    // c is [ 's', 'w', 'n', 'e' ] (with the actual numbers)
    var sw = new google.maps.LatLng( +c[0], +c[1] ),
        ne = new google.maps.LatLng( +c[2], +c[3] );

    return new google.maps.LatLngBounds( sw, ne );
}

var testBounds = boundsFromCoorString( '((1.2,3.4),(5.6,7.8))' );

如果你不熟悉代码中类似+c[0]+的用法,那么它的作用是将字符串转换为数字。这与使用parseFloat()类似。

我之前发表了一种更复杂的方法。我会将它保留在这里,因为详细注释的正则表达式可能会对你有帮助:

var coordString = '((1.2,3.4),(5.6,7.8))';
var match = coordString
    .replace( /\s/g, '' )
    .match( /^\(\((.*),(.*)\),\((.*),(.*)\)\)$/ );
if( match ) {
    var
        s = +match[1],
        w = +match[2],
        n = +match[3],
        e = +match[4],
        sw = new google.maps.LatLng( s, w ),
        ne = new google.maps.LatLng( n, e ),
        bounds = new google.maps.LatLngBounds( sw, ne );
}
else {
    // failed
}

那个在.match()调用中的正则表达式真是一团糟,不是吗?当它们以这种单行格式出现时,正则表达式并不是最易读的语言。为了清晰起见,让我们将其拆分为多行,就像Python或Ruby这样的语言可以做到的那样:
.match( /               Start regular expression
    ^                   Beginning of string
        \(              Initial open paren
            \(              Open paren for the first pair
                (.*)            First number
                ,               Comma inside the first pair
                (.*)            Second number
            \)              Close paren for the first pair
            ,               Comma separating the two pairs
            \(              Open paren for the second pair
                (.*)            Third number
                ,               Comma inside the second pair
                (.*)            Fourth number
            \)              Close paren for the second pair
        \)              Final close paren
    $                   End of string
/ );                    End regular expression

如果字符串中没有空格,你可以省略这一行代码:
    .replace( /\s/g, '' )

这只是为了简单起见,在进行.match()之前移除空格。


关于字符串格式:使用myRectangle.getBounds()发送到php脚本。你期望什么?根据Google文档,x1,y1 = NW点,x2,y2 = SE点。 - Bertaud
并且你能解释一下长匹配吗?;-) - Bertaud
我错了。我使用的是标准格式,即sw、ne而不是nw、se!我之前使用x、y只是因为那是一个理论示例,但我注意到可能会引起混淆。对你来说哪个更好:在JavaScript中解码还是在PHP中解码?是的,我漏掉了一个括号。 - Bertaud
等一下 - 你是从自己的PHP代码生成这个字符串吗?你可以生成一个JSON对象或JavaScript数组,这样就不需要所有的正则表达式解析了。那样会简单得多。我只是按照你所说的问题回答;除非你告诉我,否则我无法读懂你的想法和理解更大的上下文。 :-) 那么,能不能讲述一些整体故事的情况呢? - Michael Geary
我从一个js脚本中发送myRectangle.getBounds()到一个PHP脚本,该脚本将数据存储在mysql中。在mysql中,数据是((x,y),(x,y))。稍后,我使用PHP获取此数据并将其发送到js脚本以便重新绘制矩形。我的问题是/曾经是如何重新绘制。我的最后一个问题意味着:从php发送字符串还是解码后的信息(lat/lon)更好? - Bertaud
显示剩余3条评论

-1
你需要使用LatLng创建西南角和东北角。然后将它们传递给LatLngBounds即可。文档非常详细。

我知道这个过程的一部分。第一步是翻译字符串:“如何做到?” - Bertaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接