卫星数据:在卫星地图上绘制数据(satellite locator map)

如何在 python(笔记本)中使用高分辨率的卫星背景图像在地图上绘制(lat, lon, value)数据?

我在整个互联网上爬行,但找不到任何有用的东西。Folium不提供卫星图块。SimpleKMLgoogleearthplot似乎只对巨大的低分辨率地球数据有用。EarthPy可以接受图像图块,但它们与 NASA 网站的链接仅提供低分辨率图像 & gt;。任何 0.1 deg.Cartopy

挫折是特别大,因为这个工作是超级容易与R,使用RGoogleMaps包,例如:

plotmap(lat, lon, col=palette(value), data=mydataframe, zoom = 17, maptype="satellite")

How can we do this in Python? plot on satellite maps

8

另一种选择是使用gmplot。它基本上是一个围绕 Google Maps javascript API 的 python 包装器,它允许您生成.html文件,这些文件在后台渲染地图。

在这里,我用它来绘制一个随机漫步对卫星图像背景(此地图类型不支持默认情况下,但它是 pretty 的简单,使其工作):

from gmplot import GoogleMapPlotter
from random import random
# We subclass this just to change the map type
class CustomGoogleMapPlotter(GoogleMapPlotter):
    def __init__(self, center_lat, center_lng, zoom, apikey='',
                 map_type='satellite'):
        super().__init__(center_lat, center_lng, zoom, apikey)
        self.map_type = map_type
        assert(self.map_type in ['roadmap', 'satellite', 'hybrid', 'terrain'])
    def write_map(self,  f):
        f.write('\t\tvar centerlatlng = new google.maps.LatLng(%f, %f);\n' %
                (self.center[0], self.center[1]))
        f.write('\t\tvar myOptions = {\n')
        f.write('\t\t\tzoom: %d,\n' % (self.zoom))
        f.write('\t\t\tcenter: centerlatlng,\n')
        # This is the only line we change
        f.write('\t\t\tmapTypeId: \'{}\'\n'.format(self.map_type))
        f.write('\t\t};\n')
        f.write(
            '\t\tvar map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);\n')
        f.write('\n')
initial_zoom = 16
num_pts = 40
lats = [37.428]
lons = [-122.145]
for pt in range(num_pts):
    lats.append(lats[-1] + (random() - 0.5)/100)
    lons.append(lons[-1] + random()/100)
gmap = CustomGoogleMapPlotter(lats[0], lons[0], initial_zoom,
                              map_type='satellite')
gmap.plot(lats, lons, 'cornflowerblue', edge_width=10)
gmap.draw("mymap.html")

您可以在浏览器中打开生成的.html文件,并像使用 Google Maps 一样进行交互。不幸的是,这意味着您将无法获得一个漂亮的matplotlib图形窗口或其他任何内容,因此为了生成图像文件,您需要自己截取屏幕截图或破解一些内容来为您呈现 HTML。

要记住的另一件事是,你可能需要一个Google Maps API key,否则你最终会像我一样得到一个丑陋的深色水印地图:

Random walk map

另外,由于您想将值描述为颜色,因此您需要手动将其转换为颜色字符串,并使用gmap.ter()方法。如果您对这种方法感兴趣,请告诉我,以便我可以尝试提出一些代码来做到这一点。

使现代化

这是一个支持将值编码为卫星图像上散点图中的颜色的版本。为了达到效果,我使用matplotlib的颜。如果需要,您可以更改颜,请参阅选项列表here。我还包含了一些代码来从文件apikey.txt中读取 API 密钥,这允许每个研究人员使用自己的个人密钥,而无需更改代码 (

import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
from matplotlib.cm import ScalarMappable
from gmplot import GoogleMapPlotter
from random import random
class CustomGoogleMapPlotter(GoogleMapPlotter):
    def __init__(self, center_lat, center_lng, zoom, apikey='',
                 map_type='satellite'):
        if apikey == '':
            try:
                with open('apikey.txt', 'r') as apifile:
                    apikey = apifile.readline()
            except FileNotFoundError:
                pass
        super().__init__(center_lat, center_lng, zoom, apikey)
        self.map_type = map_type
        assert(self.map_type in ['roadmap', 'satellite', 'hybrid', 'terrain'])
    def write_map(self,  f):
        f.write('\t\tvar centerlatlng = new google.maps.LatLng(%f, %f);\n' %
                (self.center[0], self.center[1]))
        f.write('\t\tvar myOptions = {\n')
        f.write('\t\t\tzoom: %d,\n' % (self.zoom))
        f.write('\t\t\tcenter: centerlatlng,\n')
        # Change this line to allow different map types
        f.write('\t\t\tmapTypeId: \'{}\'\n'.format(self.map_type))
        f.write('\t\t};\n')
        f.write(
            '\t\tvar map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);\n')
        f.write('\n')
    def color_ter(self, lats, lngs, values=None, colormap='coolwarm',
                      size=None, marker=False, s=None, **kwargs):
        def rgb2hex(rgb):
            """ Convert RGBA or RGB to #RRGGBB """
            rgb = list(rgb[0:3]) # remove alpha if present
            rgb = [int(c * 255) for c in rgb]
            hexcolor = '#%02x%02x%02x' % tuple(rgb)
            return hexcolor
        if values is None:
            colors = [None for _ in lats]
        else:
            cmap = plt.get_cmap(colormap)
            norm = Normalize(vmin=min(values), vmax=max(values))
            scalar_map = ScalarMappable(norm=norm, cmap=cmap)
            colors = [rgb2hex(scalar_map.to_rgba(value)) for value in values]
        for lat, lon, c in zip(lats, lngs, colors):
            self.ter(lats=[lat], lngs=[lon], c=c, size=size, marker=marker,
                         s=s, **kwargs)
initial_zoom = 12
num_pts = 40
lats = [37.428]
lons = [-122.145]
values = [random() * 20]
for pt in range(num_pts):
    lats.append(lats[-1] + (random() - 0.5)/100)
    lons.append(lons[-1] + random()/100)
    values.append(values[-1] + random())
gmap = CustomGoogleMapPlotter(lats[0], lons[0], initial_zoom,
                              map_type='satellite')
gmap.color_ter(lats, lons, values, colormap='coolwarm')
gmap.draw("mymap.html")

作为一个例子,我使用了一系列单调递增的值,这些值在coolwarm中很好地从蓝色映射到红色:

New map example with colors

3

通过注册 Mapbox(mapbox.com)并使用他们提供的 API 密钥,您可以让 folium 使用自定义磁贴集(他们的API_key=tile='Mapbox'参数似乎对我不起作用)。

例如,这对我有用(但是公开地图的分辨率根据位置而有所不同):

import folium
mapboxAccessToken = 'your api key from mapbox'
mapboxTilesetId = 'mapbox.satellite'
m = folium.Map(
    location=[51.4826486,12.7034238],
    zoom_start=16,
    tiles='https://api.tiles.mapbox.com/v4/' + mapboxTilesetId + '/{z}/{x}/{y}.png?access_token=' + mapboxAccessToken,
    attr='mapbox.com'
)
tooltip = 'Click me!'
folium.Marker([51.482696, 12.703918], popup='<i>Marker 1</i>', tooltip=tooltip).add_to(m)
folium.Marker([51.481696, 12.703818], popup='<b>Marker 2</b>', tooltip=tooltip).add_to(m)
m

我从来没有真正使用过 Mapbox,但它看起来像你甚至可以创建自己的 tileset,如果你碰巧有你想使用的图像。

NB:我在我的笔记本上运行这个安装 folium 首先:

import sys
!{sys.executable} -m pip install folium

针对评论:

Mapbox 是一家提供位置和地图服务的公司 (正如我提到的,我从来没有使用过它们,我猜你可以在https://www.mapbox.com找到更多)

Mapbox 需要令牌,因为它不是无限的免费服务...即他们给你一个令牌来跟踪请求...如果你使用超过包含在免费分配中,我猜他们会限制你的帐户

“v4”只是 Mapbox 的 API 路线的一部分。我猜他们也有 v1,v2 等。

是否有更新版本的瓷砖?我不确定,我猜你可以看看 Mapbox 的文档。它也看起来像你可以将自己的地图上传到 Mapbox,他们会将它们存储并提供给你。

如何将 x-/ y 轴添加到输出中?我不太确定。但是 folium 是LeafletJS的包装器,这是一个流行的库,有很多plugins。编写一个类来包装任何 LeafetJS 插件看起来不太棘手(请参阅开箱即用的示例here),所以也许你可以找到一个适合你的问题并包装?

3

使用 Bokeh,它可能是最简单的方法,根据我使用 AP 卫星瓦片。

from bokeh.io import output_notebook, show
from bokeh.models import ColumnDataSource, apOptions, HoverTool
from bokeh.plotting import gmap, figure
output_notebook()
api_key = your_gmap_api_key

您的地图选项

map_options = apOptions(lat=47.1839600, lng= 6.0014100, map_type="satellite", zoom=8, scale_control=True)

添加一些工具来制作交互式地图

hover=HoverTool(tooltips=[("(x,y)","($x,$y)")])
tools=[hover, 'lasso_select','tap']

创建地图并对其进行自定义

p = gmap(api_key, map_options, title="your_title", plot_height=600, plot_width=1000, tools=tools)
p.axis.visible = False
p.legend.click_policy='hide'

添加您的数据

your_source = ColumnDataSource(data=dict(lat=your_df.lat, lon=your_df.lon, size = your_df.value))
p.circle(x="lon",y="lat",size=size, fill_color="purple",legend = "your_legend", fill_alpha=0.2, line_alpha=0, source=your_source)
show(p)

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(974)
利润分配的程序是什么:如何从付费应用程序中分配利润
上一篇
加减法自动出题小程序:3表加减法(addition subtraction table)
下一篇

相关推荐

  • comeandgetyourlove音乐爱就在你身边

    Come and Get Your Love是一首热门的歌曲,由美国摇滚乐队Redbone演唱。这首歌曲于1974年发行,被收录在他们的专辑《Wovoka》中。歌曲以放克曲风为主,旋律活泼,曲调悠扬,歌词朗朗上口,深受歌迷喜爱。…

    2023-06-29 07:47:31
    0 34 40
  • css预编译器: center;}

    CSS预编译器是一种用于构建CSS的工具,它可以将CSS代码转换为更易于管理和维护的格式。它们可以使CSS代码更加灵活,更易于重用,并且可以帮助开发人员更轻松地组织和管理CSS代码。…

    2023-04-30 05:19:08
    0 99 13
  • python中predict函数参数:如何使用Python的predict函数进行机器学习预测

    示例示例predict函数是scikit-learn中的一个函数,用于预测新样本的输出结果。参数:…

    2023-03-30 08:03:12
    0 14 52
  • canvas 官网Bring Your Ideas to Life with Creative Artwork

    Canvas 官网是一个用于创建图形的 HTML5 API,它可以在浏览器中使用 JavaScript 来绘制 2D 图形。它提供了一个可以在网页上绘制图形的强大工具,可以用来创建动画、游戏、数据可视化等。…

    2023-02-28 09:52:08
    0 58 28
  • qt creator快速入门 第3版 pdf从零开始

    Qt Creator快速入门第3版是一本关于Qt Creator的教程书,旨在帮助读者快速掌握Qt Creator的使用。书中介绍了Qt Creator的基本功能,如如何创建项目、编辑代码、调试代码以及创建应用程序等等。书中还提供了一些实例代码,帮助读者更好地理解Qt Creator的用法。…

    2023-05-16 03:03:33
    0 36 79
  • cherry键盘win键不能用:解决Cherry键盘Win键无法使用的措施

    如果您的cherry键盘win键不能用,可能是由于系统设置问题导致的。下面提供一些代码,可以帮助您解决这个问题:打开“控制面板”,然后点击“硬件和声音”,打开“键盘”选项卡。…

    2023-08-27 03:36:33
    0 79 81
  • certificate意思一步一步指南

    示例示例是一种用于证明某个人或机构拥有某种资格或资质的文件。它可以是一种认证,也可以是一种奖励或认可。代码示例:…

    2023-09-14 15:01:58
    0 95 60
  • win10系统ctrl加c不能复制:解决win10系统下Ctrl+C不能复制的问题

    解决方案解决方案答:可能是由于系统快捷键被修改所导致的,可以尝试恢复系统默认快捷键;…

    2023-04-15 00:45:32
    0 98 64

发表评论

登录 后才能评论

评论列表(79条)