如何在 Google 静态地图 API 中创建一个内部有孔的多边形?

How can I create a Polygon with a hole inside in Google Static Maps API?

当我尝试使用静态地图 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

由于目前这是静态地图 API 无法实现的功能,我提供了一种解决方法来实现 "hole effect":

1) 不带任何'fillcolor'定义多边形的外线和内线,像这个例子: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) 创建一个多边形,移除部分外多边形和部分内多边形,创建方式类似于 packman。将权重设置为零 '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

有一个 Polyline encoder-decoder 实用程序可以帮助您查看所有过程 https://developers.google.com/maps/documentation/utilities/polylineutility

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

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

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)

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

然后,按照 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