底图不太适合shapefile

时间:2019-04-14 04:07:19

标签: python arcgis shapefile matplotlib-basemap coordinate-systems

我正在绘制香港地图,并且想在地图上绘制所有地铁站。在指定边界框,底图功能的中心点并使用arcmap将shapefile转换为坐标系4326之后,我想将底图和shapefile组合在一起。但是它们的匹配度不是很好。

我设置的边界框是:

llcrnrlon=113.80779, llcrnrlat= 22.16694, urcrnrlon=114.416158, urcrnrlat=22.5783

中心点是:

lat_0=22.394400, lon_0=114.156489

但是我得到的是以下情节: Map of Hong Kong

绿色点代表香港的地铁站,绿色点代表每个站点附近发布的推文数量。较大的点表示此站附近发布了更多推文。

从图中可以清楚地看到海岸线根本与shapefile不匹配。是因为底图功能的质量?下面显示了我正在使用的所有代码:

import matplotlib.pyplot as plt
import matplotlib.cm

from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
from matplotlib.colors import Normalize

dataframe = pd.read_csv(os.path.join(path, 'map_for_positive_negative.csv'))
dataframe['pos'] = dataframe.apply(lambda row: (row['lat'], row['lon']), axis=1)

# Plot the subway station on the map
def plot_station(pos):
    count = dataframe.loc[dataframe.pos == pos]['Tweet Activity']
    # x is longitude, y is latitude
    x, y = m(pos[1], pos[0])
    size = np.log2(count)
    m.plot(x, y, 'o', markersize=size, color='#0FE500', alpha=0.8)

fig, ax = plt.subplots(figsize=(20, 20))
m = Basemap(resolution='f', # c, l, i, h, f or None
            projection='mill',
            lat_0=22.394400, lon_0=114.156489,
            llcrnrlon=113.80779, llcrnrlat= 22.16694, urcrnrlon=114.416158, urcrnrlat=22.5783)

m.drawmapboundary(fill_color='#46bcec')
m.fillcontinents(color='#f2f2f2',lake_color='#46bcec')
m.drawcoastlines()

# The coordinate system of the shapefile should be 4326. Use arcmap to change it
shape_file_path = r'...\hk_tpu'
m.readshapefile(shapefile=shape_file_path, name='hk_tpu')

dataframe.pos.apply(plot_station)

plt.show(m)

记录地铁站位置的文件在这里:

Subway station location in Hong Kong

我正在使用的shapefile在这里:

Shapefile of Hong Kong

非常感谢您!

1 个答案:

答案 0 :(得分:0)

哦,男孩,我放弃!我认为原因是底图功能提供的底图已过时,无法同时赶上城市发展。香港是政府一直在考虑扩大城市的地方。因此,底图不能很好地匹配最新的shapefile是很常见的。

实际上,我的目标是在情节上画一些点。在这种情况下,我想在地图上绘制所有地铁站。对于每个点,我想使用点的大小来表示附近区域的推文数量。而且,我也想用色彩的密度来代表人们在这方面的情绪水平。

最后,我选择使用Tableau。我没有加载底图,只是从CSV文件加载了数据,该文件包含每个地铁站的地理信息以及在每个站附近发布的推文。示例图如下所示:

enter image description here

编码愉快!