Google Static Maps API:将路线表示为编码的折线

发布于 2024-10-20 17:45:17 字数 2568 浏览 1 评论 0原文

我试图使用编码的折线表示静态地图上多个点之间的路线。其代码位于名为 getStaticMapAddress 的函数中,定义如下:

def getStaticMapAddress(self, route):
    destUser = DestUser(self.destination)
    route += [destUser]
    attempts = 0
    while attempts < 10:
        try:
            encodedPolyline = self.encodePolyLine(route)
            break
        except googlemaps.GoogleMapsError:
            print "Error. Try again"
            attempts += 1
    url = "http://maps.google.com/maps/api/staticmap?zoom="+encodedPolyline[1]+"&sensor=false&size=400x400&markers="
    i=0
    while i<len(route):
        url += str(route[i].location.lat)+","+str(route[i].location.lng)
        i=i+1
        if i < len(route):
            url += "|"
    url += "&path=color:0xff0000ff|weight:5|enc:"+encodedPolyline[0]
    return url

路由表示为 User 对象列表(DestUser 是其中的子类)。 self.encodePolyLine() 方法定义如下:

def encodePolyLine(self, route):
    routePairs = []
    destUser = DestUser(self.destination)
    route += [destUser]
    i=0
    while (i < len(route)-1):
        # GET ALL TURNING POINTS FOR EACH POINT ON ROUTE, THEN PUT THEM
        # IN PAIRS AND SEND THEM TO glineenc.encode_pairs()
        for step in gmaps.directions(gmaps.latlng_to_address(route[i].location.lat, route[i].location.lng), gmaps.latlng_to_address(route[i+1].location.lat, route[i+1].location.lng))['Directions']['Routes'][0]['Steps']:
            routePairs += [(step['Point']['coordinates'][0], step['Point']['coordinates'][1])]
        i=i+1
    return glineenc.encode_pairs(routePairs)

这个 glineenc 模块来自这里 并接受坐标对列表,返回一个包含编码线字符串和表示能够看到所有点的最大缩放级别的编码字符串的对。因此,我有一条往返布莱顿、伦敦、布里斯托尔和曼彻斯特的路线,我已将其传递给此函数。以下 URL 是输出:

http://maps.google.com/maps/api/staticmap?zoom=B@@@@@?@AA@AA??A@@A@A@?@@@@@@@@B?@@@@@A@@@@@@?B@@AABABA@@@@@@@B&sensor=false&size=400x400&markers=50.8202008,-0.1324898|51.447341,-0.0761212|51.4608947,-2.5884312|53.4778853,-2.2308146|53.4778853,-2.2308146&path=color:0xff0000ff|weight:5|enc:b|XqvduHm@cDcMhAfAfFrc@{BlJgDqHaZkEy[vsKiwp@ciHahd@}nEwoK_KqB_QmoIpAyBw@Mv_BqxDmC`EasCvAeFuuAwi@_Rq|DuVnYgPdXyHvIcBcSgElgBkqBzKgh@`xD_cAzBpBvNM{HsHh]wNfbCzOxpCrUjeD_`Ahi@pItyGdXj`D_PjctLa}BzhH~nFn\dPfe@bObv@dC`i@fS_HrFk@~AmAzDsW_Ak_CmiAkuGy_GvxDctEolnBcpdEhtPc}Srp~AcvsCi_a@clJakR`]kiCr]opDtRcW}JhVcV_EmDaDhFkCc@

如果您查看此内容,您会发现出现了问题。我不确定究竟发生了什么,但我注意到,如果使用赤道和子午线作为对称线来反映,新路线似乎是正确路线的投影。不知道为什么它会这样做,但这就是我所能看到的问题的可能原因。有什么想法吗?

I'm trying to represent a route between a number of points on a static map using an encoded polyline. The code for this is in a function called getStaticMapAddress, defined like so:

def getStaticMapAddress(self, route):
    destUser = DestUser(self.destination)
    route += [destUser]
    attempts = 0
    while attempts < 10:
        try:
            encodedPolyline = self.encodePolyLine(route)
            break
        except googlemaps.GoogleMapsError:
            print "Error. Try again"
            attempts += 1
    url = "http://maps.google.com/maps/api/staticmap?zoom="+encodedPolyline[1]+"&sensor=false&size=400x400&markers="
    i=0
    while i<len(route):
        url += str(route[i].location.lat)+","+str(route[i].location.lng)
        i=i+1
        if i < len(route):
            url += "|"
    url += "&path=color:0xff0000ff|weight:5|enc:"+encodedPolyline[0]
    return url

The route is represented as a list of User objects (of which DestUser is a subclass). The self.encodePolyLine() method is defined as follows:

def encodePolyLine(self, route):
    routePairs = []
    destUser = DestUser(self.destination)
    route += [destUser]
    i=0
    while (i < len(route)-1):
        # GET ALL TURNING POINTS FOR EACH POINT ON ROUTE, THEN PUT THEM
        # IN PAIRS AND SEND THEM TO glineenc.encode_pairs()
        for step in gmaps.directions(gmaps.latlng_to_address(route[i].location.lat, route[i].location.lng), gmaps.latlng_to_address(route[i+1].location.lat, route[i+1].location.lng))['Directions']['Routes'][0]['Steps']:
            routePairs += [(step['Point']['coordinates'][0], step['Point']['coordinates'][1])]
        i=i+1
    return glineenc.encode_pairs(routePairs)

This glineenc module is from here and takes in a list of coordinate pairs, returning a pair containing the encoded line string and an encoded string representing the maximum zoom level to be able to see all of the points. So, I have a route going between Brighton, London, Bristol and Manchester which I have passed into this function. The following URL was the output:

http://maps.google.com/maps/api/staticmap?zoom=B@@@@@?@AA@AA??A@@A@A@?@@@@@@@@B?@@@@@A@@@@@@?B@@AABABA@@@@@@@B&sensor=false&size=400x400&markers=50.8202008,-0.1324898|51.447341,-0.0761212|51.4608947,-2.5884312|53.4778853,-2.2308146|53.4778853,-2.2308146&path=color:0xff0000ff|weight:5|enc:b|XqvduHm@cDcMhAfAfFrc@{BlJgDqHaZkEy[vsKiwp@ciHahd@}nEwoK_KqB_QmoIpAyBw@Mv_BqxDmC`EasCvAeFuuAwi@_Rq|DuVnYgPdXyHvIcBcSgElgBkqBzKgh@`xD_cAzBpBvNM{HsHh]wNfbCzOxpCrUjeD_`Ahi@pItyGdXj`D_PjctLa}BzhH~nFn\dPfe@bObv@dC`i@fS_HrFk@~AmAzDsW_Ak_CmiAkuGy_GvxDctEolnBcpdEhtPc}Srp~AcvsCi_a@clJakR`]kiCr]opDtRcW}JhVcV_EmDaDhFkCc@

If you view this you can see something has gone wrong. I'm not sure exactly what has happened but I noticed that the new route appears to be a projection of the proper route, if reflected using the equator and meridian as lines of symmetry. Not sure why it would have done this, but that's about all I can see as the possible cause of the problem. Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小帐篷 2024-10-27 17:45:17

随机猜测:您不小心交换了经度和纬度参数。

Random guess: you've accidentally swapped the longitude and latitude arguments.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文