【问题标题】:How can I create a Polygon with a hole inside in Google Static Maps API?如何在 Google Static Maps API 中创建一个内部有洞的多边形?
【发布时间】:2017-03-14 16:40:49
【问题描述】:

当我尝试使用静态地图 API 创建一个内部有孔的外部多边形时,填充颜色填充了内部多边形,我看不到绘制它的参数。 这是它的外观:

这是请求:https://maps.googleapis.com/maps/api/staticmap?size=640x640&maptype=roadmap&zoom=16&path=color:0xFF0000AA|weight:3|fillcolor:0xFFB6C1BB|enc:csr{FcgiLuSm[rYua@zIvHvCdNcAzKmRhX&path=color:0xFF0000AA|weight:3|enc:mjr{FsjjL{A}D}E|DxAvD~EwD

【问题讨论】:

    标签: polygons google-static-maps


    【解决方案1】:

    由于目前这是静态地图 API 无法实现的功能,因此我提供了一种解决方法来实现“孔效应”:

    1) 定义多边形的外线和内线,不使用任何“填充颜色”,例如:https://maps.googleapis.com/maps/api/staticmap?size=640x640&maptype=roadmap&zoom=16&path=color:0xFF0000AA|weight:3|enc:csr{FcgiLuSm[rYua@zIvHvCdNcAzKmRhX&path=color:0xFF0000AA|weight:3|enc:mjr{FsjjL{A}D}E|DxAvD~EwD

    2) 创建一个多边形,移除部分外部多边形和内部多边形,像打包人一样创建。将权重设置为零 'weight=0' 并选择要填充的颜色,如下例所示:https://maps.googleapis.com/maps/api/staticmap?size=640x640&maptype=roadmap&zoom=16&&path=color:0x0ea001AA|weight:0|fillcolor:0xFFB6C1BB|enc:csr{FcgiLuSm[rYua@zIvHvCdNcAzKwIeI{A}D}E|DxAvDu@v\ 3) 与第 2 步类似,创建我们缺少填充多边形的部分,如本例所示:https://maps.googleapis.com/maps/api/staticmap?size=640x640&maptype=roadmap&zoom=16&path=color:0x0ea001AA|weight:0|fillcolor:0xFFB6C1BB|enc:csr{FcgiLlRiXwIeI_FvDu@v\ 4)最后将所有路径缝合在一起以模拟所需的孔: https://maps.googleapis.com/maps/api/staticmap?size=640x640&maptype=roadmap&zoom=16&path=color:0xFF0000AA|weight:3|enc:csr{FcgiLuSm[rYua@zIvHvCdNcAzKmRhX&path=color:0xFF0000AA|weight:3|enc:mjr{FsjjL{A}D}E|DxAvD~EwD&path=color:0x0ea001AA|weight:0|fillcolor:0xFFB6C1BB|enc:csr{FcgiLuSm[rYua@zIvHvCdNcAzKwIeI{A}D}E|DxAvDu@v%5C&path=color:0x0ea001AA|weight:0|fillcolor:0xFFB6C1BB|enc:csr{FcgiLlRiXwIeI_FvDu@v%5C

    有一个折线编码器-解码器实用程序可以帮助您查看所有过程 https://developers.google.com/maps/documentation/utilities/polylineutility

    【讨论】:

    • 下一个挑战:以编程方式进行
    【解决方案2】:

    以 Soldeplata Saketos 的答案为基础,对于填充部分,可以对轮廓 + 孔使用单个路径,而无需拆分它。似乎 Maps Static API 使用了某种模板测试,如果一个区域被绘制了一对 (0, 2...) 次,它实际上没有被填充,并且在绘制时会损坏(1 次或更多)次,它被填充颜色填充。

    基于这个原则,下面是一些基于 Shapely 库的 Python 代码(但希望可移植到其他语言或库):

    fill_coords = list(poly.exterior.coords)
    outline_coords = [poly.exterior.coords]
    for hole in poly.interiors:
      fill_coords.extend(hole.coords)
      # always close by adding the first point on the exterior
      fill_coords.append(fill_coords[0])
      outline_coords.append(hole.coords)
    

    请注意,外部和所有孔/内部必须定义为环,即点的闭合序列。

    然后,就像 Soldeplata Saketos 建议的那样,分别绘制填充和轮廓:

    • 一个路径 = 用于填充 (fill_coords),填充颜色和权重 = 0
    • outline_coords 的每个成员都有一个单独的路径=,没有填充颜色。这将绘制多边形的边框

    这是一张结果图片:

    polygon with 2 holes

    (比例尺是由附加代码添加的,但上面的图像来自 Maps Static API)

    这是查询(将 API_KEY 参数替换为您自己的):

    https://maps.googleapis.com/maps/api/staticmap?maptype=hybrid&key=_API_KEY_&size=640x593&scale=2&center=50.95141146936693,2.0425128936767543&zoom=16&path=fillcolor%3A0x0000ff66%7Cweight%3A0%7Cenc%3Ao%7D%7DuHqenKaZ~X_AcEqAiJvEuE_%40%7DArFgFdC%60Kd%40a%40%60A%7B%40zAqCtAmAjBHz%40zDiYzLz%40%7C%40hAaEyBaCw%40vCj%40lBhY%7BLkECx%40%7CAb%40u%40MsBuAGDrAjEB&path=color%3A0x0000ffff%7Cweight%3A2%7Cenc%3Ao%7D%7DuHqenKaZ~X_AcEqAiJvEuE_%40%7DArFgFdC%60Kd%40a%40%60A%7B%40zAqCtAmAjBHz%40zD&path=color%3A0x0000ffff%7Cweight%3A2%7Cenc%3Ayw~uHuwmKz%40%7C%40hAaEyBaCw%40vCj%40lB&path=color%3A0x0000ffff%7Cweight%3A2%7Cenc%3A%7Bc~uHuenKx%40%7CAb%40u%40MsBuAGDrA

    【讨论】:

    • 这对我很有用,谢谢!我纠结的一件事是:坐标的order 非常重要。内部切口的顺序必须与外部边界坐标的方向相反。我必须扭转一组界限才能让我自己的安装工作。之后,太好了!
    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多