如何在 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 参数替换为您自己的参数):
当我尝试使用静态地图 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\
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\
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 参数替换为您自己的参数):