plotly那些事儿(4)

plotly那些事儿(4)

本部分主要是plotly那些事儿第4个系列,对plotly官方文档中常用的科学化图表做一个归纳整理,主要会包含地区分布图基于Mapbox的地图标注等。

首先要说明的是plotly.figure_factory需要将plotly升级到2.5.1+,以及需要依赖一些K-lab本身没有包含的包shapely==1.6.3、geopandas==0.3.0、pyshp==1.2.10,我们先通过以下代码将所需要的安装包完整安装。

In [ ]:

<pre style="box-sizing: border-box; overflow: auto; font-size: inherit; line-height: inherit; display: block; color: rgb(51, 51, 51); font-family: "Source Code Pro", monospace !important; padding: 0px; margin: 0px; word-break: break-all; overflow-wrap: break-word; background-color: transparent; border: none; border-radius: 2px; width: 922.313px;">!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple plotly==2.5.1
!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple shapely==1.6.3
!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple geopandas==0.3.0
!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyshp==1.2.10
</pre>

In [1]:

<pre style="box-sizing: border-box; overflow: auto; font-size: inherit; line-height: inherit; display: block; color: rgb(51, 51, 51); font-family: "Source Code Pro", monospace !important; padding: 0px; margin: 0px; word-break: break-all; overflow-wrap: break-word; background-color: transparent; border: none; border-radius: 2px; width: 922.313px;">import plotly
plotly.version
</pre>

Out[1]:

<pre style="box-sizing: border-box; overflow: auto; font-size: inherit; line-height: inherit; display: block; color: inherit; font-family: "Source Code Pro", monospace !important; padding: 0px; margin: 0px; word-break: break-all; overflow-wrap: break-word; background-color: transparent; border: 0px; border-radius: 0px; width: 933.5px; vertical-align: baseline;">'2.5.1'</pre>

初始化notebook中plotly的视图嵌入。

In [2]:

<pre style="box-sizing: border-box; overflow: auto; font-size: inherit; line-height: inherit; display: block; color: rgb(51, 51, 51); font-family: "Source Code Pro", monospace !important; padding: 0px; margin: 0px; word-break: break-all; overflow-wrap: break-word; background-color: transparent; border: none; border-radius: 2px; width: 922.313px;">from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected = True)
</pre>

由于现在plotly的地图只支持世界地图、美国(包含各州、城市)、欧洲、亚洲、非洲、北美和南美的地理地图,故无法内嵌其他国家的国家地图。

设定方法为:通过设定layout.geo.scope的取值为( enumerated : "world" | "usa" | "europe" | "asia" | "africa" | "north america" | "south america" )。

地区分布图

首先我们利用plotly的地区分布图来展现一下美国各个州在2011年出口总值的地区分布。

其中输入的数据主要包含了州的英文缩写,州的出口总值数,以及出口的各类商品的单独出口金额。

In [5]:

<pre style="box-sizing: border-box; overflow: auto; font-size: inherit; line-height: inherit; display: block; color: rgb(51, 51, 51); font-family: "Source Code Pro", monospace !important; padding: 0px; margin: 0px; word-break: break-all; overflow-wrap: break-word; background-color: transparent; border: none; border-radius: 2px; width: 922.313px;">import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_us_ag_exports.csv')

for col in df.columns:
df[col] = df[col].astype(str)

设立颜色条色彩渐变

colorscale = [[0.0, 'rgb(242,240,247)'],[0.2, 'rgb(218,218,235)'],[0.4, 'rgb(188,189,220)'],
[0.6, 'rgb(158,154,200)'],[0.8, 'rgb(117,107,177)'],[1.0, 'rgb(84,39,143)']]

设立悬浮信息

df['text'] = df['state'] + '
' +
'Beef '+df['beef']+' Dairy '+df['dairy']+'
'+
'Fruits '+df['total fruits']+' Veggies ' + df['total veggies']+'
'+
'Wheat '+df['wheat']+' Corn '+df['corn']

data = [ dict(
type='choropleth',
colorscale = colorscale,
autocolorscale = False,
# 位置由各州的编号,即缩写表示
locations = df['code'],
# 每个州的颜色深度由出口总值表示,出口总值越高颜色越紫
z = df['total exports'].astype(float),
locationmode = 'USA-states',
text = df['text'],
marker = dict(
line = dict (
color = 'rgb(255,255,255)',
width = 2
) ),
# 设立颜色条注释
colorbar = dict(
title = "Millions USD")
) ]

layout = dict(
title = '2011年美国各大州农业出口情况',
geo = dict(
scope='usa',
projection=dict( type='albers usa' )
)
)

fig = dict( data=data, layout=layout )
iplot(fig)
</pre>

<svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="933.5" height="525" style="background: rgb(255, 255, 255);"><text class="js-plot-link-container" y="516" text-anchor="end" x="926.5" style="font-family: "Open Sans", Arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); pointer-events: all;"><tspan class="js-link-to-tool"><a xlink:href="https://www.kesci.com/api/notebooks/5c17b91decb012002b5771a8/RenderedContent#" class="link--impt link--embedview" font-weight="bold">Export to plot.ly »</a></tspan></text></svg><svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="933.5" height="525"><g class="infolayer"><g class="cb23da09 colorbar" transform="translate(80,100)"><g class="cbaxis crisp" transform="translate(0,-100)"><g class="ycb23da09tick"><text text-anchor="start" x="794.4" y="4.199999999999999" data-unformatted="2k" data-math="N" transform="translate(0,398.37)" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">2k</text></g><g class="ycb23da09tick"><text text-anchor="start" x="794.4" y="4.199999999999999" data-unformatted="4k" data-math="N" transform="translate(0,361.49)" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">4k</text></g><g class="ycb23da09tick"><text text-anchor="start" x="794.4" y="4.199999999999999" data-unformatted="6k" data-math="N" transform="translate(0,324.61)" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">6k</text></g><g class="ycb23da09tick"><text text-anchor="start" x="794.4" y="4.199999999999999" data-unformatted="8k" data-math="N" transform="translate(0,287.73)" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">8k</text></g><g class="ycb23da09tick"><text text-anchor="start" x="794.4" y="4.199999999999999" data-unformatted="10k" data-math="N" transform="translate(0,250.85)" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">10k</text></g><g class="ycb23da09tick"><text text-anchor="start" x="794.4" y="4.199999999999999" data-unformatted="12k" data-math="N" transform="translate(0,213.98000000000002)" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">12k</text></g><g class="ycb23da09tick"><text text-anchor="start" x="794.4" y="4.199999999999999" data-unformatted="14k" data-math="N" transform="translate(0,177.1)" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">14k</text></g><g class="ycb23da09tick"><text text-anchor="start" x="794.4" y="4.199999999999999" data-unformatted="16k" data-math="N" transform="translate(0,140.22)" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">16k</text></g></g><g class="cbtitleunshift" transform="translate(-80,-100)"><g class="cbtitle" transform="translate(-0.5,-0.5)"><text class="ycb23da09title" x="840.7199999999999" y="122" text-anchor="start" data-unformatted="Millions USD" data-math="N" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); opacity: 1; font-weight: normal; white-space: pre;">Millions USD</text></g></g></g><g class="g-gtitle"><text class="gtitle" x="466.75" y="50" text-anchor="middle" data-unformatted="2011年美国各大州农业出口情况" data-math="N" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 17px; fill: rgb(68, 68, 68); opacity: 1; font-weight: normal; white-space: pre;">2011年美国各大州农业出口情况</text></g></g></svg>

接下来,我们来利用地区分布图的全球地理信息来描绘下2014年全球各个国家的GDP总值的差异。

In [4]:

<pre style="box-sizing: border-box; overflow: auto; font-size: inherit; line-height: inherit; display: block; color: rgb(51, 51, 51); font-family: "Source Code Pro", monospace !important; padding: 0px; margin: 0px; word-break: break-all; overflow-wrap: break-word; background-color: transparent; border: none; border-radius: 2px; width: 922.313px;">import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2014_world_gdp_with_codes.csv')

data = [ dict(
type = 'choropleth',
locations = df['CODE'],
z = df['GDP (BILLIONS)'],
text = df['COUNTRY'],
colorscale = [[0,"rgb(5, 10, 172)"],[0.35,"rgb(40, 60, 190)"],[0.5,"rgb(70, 100, 245)"],
[0.6,"rgb(90, 120, 245)"],[0.7,"rgb(106, 137, 247)"],[1,"rgb(220, 220, 220)"]],
autocolorscale = False,
reversescale = True,
marker = dict(
line = dict (
color = 'rgb(180,180,180)',
width = 0.5
) ),
colorbar = dict(
autotick = False,
tickprefix = '/pre>,
title = 'GDP
Billions US/pre>),
) ]

layout = dict(
title = '2014 全球GDP分布',
geo = dict(
showframe = True,
showcoastlines = False,
projection = dict(
type = 'Mercator'
)
)
)

fig = dict( data=data, layout=layout )
iplot( fig, validate=False )
</pre>

<svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="933.5" height="525" style="background: rgb(255, 255, 255);"><text class="js-plot-link-container" y="516" text-anchor="end" x="926.5" style="font-family: "Open Sans", Arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); pointer-events: all;"><tspan class="js-link-to-tool"><a xlink:href="https://www.kesci.com/api/notebooks/5c17b91decb012002b5771a8/RenderedContent#" class="link--impt link--embedview" font-weight="bold">Export to plot.ly »</a></tspan></text></svg><svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="933.5" height="525"><g class="infolayer"><g class="cbfd76e6 colorbar" transform="translate(80,100)"><g class="cbaxis crisp" transform="translate(0,-100)"><g class="ycbfd76e6tick"><text text-anchor="start" x="799.4" y="4.199999999999999" data-unformatted="0" data-math="N" transform="translate(0,435.00375)" style="font-family: &quot;Open Sans&quot;, verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">0</text></g><g class="ycbfd76e6tick"><text text-anchor="start" x="799.4" y="4.199999999999999" data-unformatted="5k" data-math="N" transform="translate(0,352.36375)" style="font-family: &quot;Open Sans&quot;, verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">5k</text></g><g class="ycbfd76e6tick"><text text-anchor="start" x="799.4" y="4.199999999999999" data-unformatted="10k" data-math="N" transform="translate(0,269.72375)" style="font-family: &quot;Open Sans&quot;, verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">10k</text></g><g class="ycbfd76e6tick"><text text-anchor="start" x="799.4" y="4.199999999999999" data-unformatted="15k" data-math="N" transform="translate(0,187.09375)" style="font-family: &quot;Open Sans&quot;, verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">15k</text></g></g><g class="cbtitleunshift" transform="translate(-80,-100)"><g class="cbtitle" transform="translate(-0.5,-0.5)"><text class="ycbfd76e6title" x="845.8199999999999" y="122" text-anchor="start" data-unformatted="GDP
Billions US" data-math="N" style="font-family: &quot;Open Sans&quot;, verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); opacity: 1; font-weight: normal; white-space: pre;"><tspan class="line" dy="0em" x="845.8199999999999" y="122">GDP</tspan><tspan class="line" dy="1.3em" x="845.8199999999999" y="122">Billions US</tspan></text></g></g></g><g class="g-gtitle"><text class="gtitle" x="466.75" y="50" text-anchor="middle" data-unformatted="2014 全球GDP分布" data-math="N" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 17px; fill: rgb(68, 68, 68); opacity: 1; font-weight: normal; white-space: pre;">2014 全球GDP分布</text></g></g></svg>

Reference

基于Mapbox的地图标注

由于在上一部分已经提到了plotly本身自带的地区分布的局限性,因此我们采用plotly提供的mapbox通信接口来实现下如何在地图上标注散点和直线。

这一部分我们在地图上绘制散点和直线。

需要说明的是此处需要提供通讯密钥,申请地址 Mapbox Access Token

In [3]:

<pre style="box-sizing: border-box; overflow: auto; font-size: inherit; line-height: inherit; display: block; color: rgb(51, 51, 51); font-family: "Source Code Pro", monospace !important; padding: 0px; margin: 0px; word-break: break-all; overflow-wrap: break-word; background-color: transparent; border: none; border-radius: 2px; width: 922.313px;">from plotly.graph_objs import *

mapbox_access_token = 'ADD_YOUR_TOKEN_HERE'

data = Data([
Scattermapbox(
# 绘制散点的经纬度
lat=['45.7017','45.7017'],
lon=['-73.5673','-74.9673'],
mode='markers',
marker=Marker(
size=20,
color=['#00ffee','#eeff00']
),
# 散点对应的文本
text=['Montreal'],
name='scatter'
),
Scattermapbox(
# 绘制直线端点的经纬度
lat=['45.9017','45.2017'],
lon=['-72.0673','-72.9673'],
mode='lines',
line=Line(
color='#ff00ee',
width=5
),
# 散点对应的文本
text=['Montreal'],
name='line'
)
])

layout = Layout(
title='基于mapbox的地图标注',
autosize=True,
hovermode='closest',
mapbox=dict(
accesstoken=mapbox_access_token,
bearing=0,
# 地图中心坐标,不要远离绘制的散点坐标
center=dict(
lat=45.5,
lon=-73.5
),
pitch=0,
zoom=7
),
)

fig = dict(data=data, layout=layout)
iplot(fig)
</pre>

<svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="933.5" height="525" style="background: rgb(255, 255, 255);"><text class="js-plot-link-container" y="516" text-anchor="end" x="926.5" style="font-family: "Open Sans", Arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); pointer-events: all;"><tspan class="js-link-to-tool"><a xlink:href="https://www.kesci.com/api/notebooks/5c17b91decb012002b5771a8/RenderedContent#" class="link--impt link--embedview" font-weight="bold">Export to plot.ly »</a></tspan></text></svg>

<canvas class="gl-canvas gl-canvas-context" width="933.5" height="525" style="box-sizing: border-box; display: inline-block; vertical-align: baseline; position: absolute; top: 0px; left: 0px; width: 933.5px; height: 525px; overflow: visible; pointer-events: none;"></canvas>

<canvas class="gl-canvas gl-canvas-focus" width="933.5" height="525" style="box-sizing: border-box; display: inline-block; vertical-align: baseline; position: absolute; top: 0px; left: 0px; width: 933.5px; height: 525px; overflow: visible; pointer-events: none;"></canvas>

<canvas class="gl-canvas gl-canvas-pick" width="933.5" height="525" style="box-sizing: border-box; display: inline-block; vertical-align: baseline; position: absolute; top: 0px; left: 0px; width: 933.5px; height: 525px; overflow: visible; pointer-events: none;"></canvas>

<canvas class="mapboxgl-canvas" tabindex="0" aria-label="Map" width="1486" height="690" style="box-sizing: border-box; display: inline-block; vertical-align: baseline; position: absolute; width: 743px; height: 345px; left: 0px; top: 0px;"></canvas>

<svg class="main-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="933.5" height="525"><g class="infolayer"><g class="legend" pointer-events="all" transform="translate(837.86, 100)"><g class="scrollbox" transform="translate(0, 0)" clip-path="url(#legend6645e4)"><g class="groups"><g class="traces" transform="translate(0, 14.5)" style="opacity: 1;"><text class="legendtext user-select-none" text-anchor="start" x="40" y="4.680000000000001" data-unformatted="scatter" data-math="N" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">scatter</text></g><g class="traces" transform="translate(0, 33.5)" style="opacity: 1;"><text class="legendtext user-select-none" text-anchor="start" x="40" y="4.680000000000001" data-unformatted="line" data-math="N" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 12px; fill: rgb(68, 68, 68); fill-opacity: 1; white-space: pre;">line</text></g></g></g></g><g class="g-gtitle"><text class="gtitle" x="466.75" y="50" text-anchor="middle" data-unformatted="基于mapbox的地图标注" data-math="N" style="font-family: "Open Sans", verdana, arial, sans-serif; font-size: 17px; fill: rgb(68, 68, 68); opacity: 1; font-weight: normal; white-space: pre;">基于mapbox的地图标注</text></g></g></svg>

通过研究plotly基于mapbox的代码实现我们能发现,其以mapbox提供的地图为画布,在画布上只要输入经纬度坐标,即可基于坐标点实现和Scatter一样的效果,无论是散点标注marker还是点与点之间的连线lines。

Reference

在地图可视化层面,plotly提供的功能仍旧不太完善,譬如对于除美国外的其他国家未提供geo map,需利用mapbox的接口进行开发,期待下一波版本更新对layout.geo.scope可供输入的参数做一些完善。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 第九计 隔岸观火隔着河看对岸的火。比喻对别人的危难不予援救而在一旁看热闹。此计是坐观敌人的内部恶变,不急于采取攻逼...
    Seurat_Satija阅读 822评论 0 5
  • 简介 交互式绘图工具, 提供python, R, js接口, 以R接口为例 api类似, 需要注意在参数中涉及子项...
    nnlrl阅读 6,899评论 0 10
  • 本文主要针对plotly的参数含义进行说明,随着plotly版本的迭代更新,部分参数的用法会有细微变化,具体参加官...
    惑也阅读 49,721评论 0 34
  • 转载请声明 原文链接 关注公众号获取更多资讯 这篇文章主要总结H5的一些新增的功能以及一些基础归纳,这里只是一个提...
    程序员poetry阅读 9,069评论 22 225
  • Geoserver跨域终极解决方案 技术标签:Geoserver跨域mbtiles太乐地图WebGIS 在其他程序...
    不玩了啊阅读 146评论 0 0