当前位置: 首页 > 面试题库 >

轻松显示适用于Python的OpenStreetMap磁贴

张晔
2023-03-14
问题内容

我想在我的python代码中包含开放式街道地图(OSM)。

我已经阅读了很多有关OSM的网页。但是不幸的是,我对哪种包装最满意感到迷茫。

我正在寻找一种在我的应用中获取OSM映像的简便方法。当我开始时,我想到的是:

import matplotlib.pyplot as plt

# Pseudo - Code for required function 'GetOSMImage'
Map = GetOSMImage(lat,long,delta_lat,delta_long)

imgplot = plt.imshow(Map)

稍后,我想在此plt中添加绘图我的其他数据。(我知道我需要处理预测等)

我不需要/想要的:

  • 在我自己的网站上显示
  • 要将我的数据上传到某些Internet服务器
  • 互动功能,例如缩放,滚动(首先)
  • 从OSM手动处理和呈现.xml数据
  • 首先,我不想定义渲染样式的每个细节。我希望/期望存在一些默认样式。

你对我有一个很好的起点吗?还是我低估了这个主题的复杂性?


问题答案:

根据您的输入,我能够实现目标。这是我给其他人的代码,它们正在寻找OSM的起点。(当然,还有很多改进的余地)。

更新资料

请遵守开放街道地图的使用政策!

OpenStreetMap数据可供所有人免费使用。 我们的磁贴服务器不是。

要求

  • 未经操作工作组的事先许可,禁止大量使用(例如,分发使用openstreetmap.org中的图块的应用程序)。请参阅下面的替代方法。
  • 清楚显示许可证归属。
  • 不要主动或被动地鼓励侵犯版权。
  • 只能直接通过最终用户操作来触发对/ cgi-bin / export的调用。(例如:“单击此处进行导出”。)导出调用是运行时非常昂贵的(CPU
  • RAM)函数,在服务器处于高负载时会经常拒绝。
  • 推荐:请勿在tile.openstreetmap.org上对任何URL进行硬编码,因为这样做会限制您在服务中断或阻止时快速做出反应的能力。
    * 推荐:添加一个指向https://www.openstreetmap.org/fixthemap的链接,以允许您的用户报告并解决我们数据中的问题。


技术使用要求

  • 有效的HTTP User-Agent识别应用程序。伪造另一个应用程序的User-Agent会让您被阻止。
  • 如果已知,则为有效的HTTP引用。
  • 不要发送无缓存头。(“缓存控制:不缓存”,“编译指示:不缓存”等)
  • 缓存切片根据HTTP Expiry标头在本地下载,或者至少7天。
  • 最多2个下载线程。(可接受未修改的Web浏览器的下载线程限制。)

有关更多详细信息,请参见:https :
//operations.osmfoundation.org/policies/tiles/

这是代码:

import matplotlib.pyplot as plt
import numpy as np

import math
import urllib2
import StringIO
from PIL import Image



def deg2num(lat_deg, lon_deg, zoom):
  lat_rad = math.radians(lat_deg)
  n = 2.0 ** zoom
  xtile = int((lon_deg + 180.0) / 360.0 * n)
  ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
  return (xtile, ytile)

def num2deg(xtile, ytile, zoom):
  n = 2.0 ** zoom
  lon_deg = xtile / n * 360.0 - 180.0
  lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
  lat_deg = math.degrees(lat_rad)
  return (lat_deg, lon_deg)



def getImageCluster(lat_deg, lon_deg, delta_lat,  delta_long, zoom):
    smurl = r"http://a.tile.openstreetmap.org/{0}/{1}/{2}.png"
    xmin, ymax =deg2num(lat_deg, lon_deg, zoom)
    xmax, ymin =deg2num(lat_deg + delta_lat, lon_deg + delta_long, zoom)

    Cluster = Image.new('RGB',((xmax-xmin+1)*256-1,(ymax-ymin+1)*256-1) ) 
    for xtile in range(xmin, xmax+1):
        for ytile in range(ymin,  ymax+1):
            try:
                imgurl=smurl.format(zoom, xtile, ytile)
                print("Opening: " + imgurl)
                imgstr = urllib2.urlopen(imgurl).read()
                tile = Image.open(StringIO.StringIO(imgstr))
                Cluster.paste(tile, box=((xtile-xmin)*256 ,  (ytile-ymin)*255))
            except: 
                print("Couldn't download image")
                tile = None

    return Cluster



if __name__ == '__main__':

    a = getImageCluster(38.5, -77.04, 0.02,  0.05, 13)
    fig = plt.figure()
    fig.patch.set_facecolor('white')
    plt.imshow(np.asarray(a))
    plt.show()


 类似资料:
  • 本文向大家介绍轻松理解Python 中的 descriptor,包括了轻松理解Python 中的 descriptor的使用技巧和注意事项,需要的朋友参考一下 定义 通常,一个 descriptor 是具有“绑定行为”的对象属性。所绑定行为可通过 descriptor 协议被自定义的 __get__() , __set__() 和 __delete__() 方法重写。如果一个对象的上述三个方法任意

  • 问题内容: 我是python的新手(我使用python 3),并且我尝试使用JSon中的一个字符串和两个列表作为成员序列化一个类。我发现python标准中有一个json库,但似乎我需要手动实现序列化方法。是否有一个JSon编码器,我可以在其中简单地传递一个对象,并以字符串形式接收序列化的对象,而无需实现序列化方法。例: 谢谢。 问题答案: 不了解任何预构建的内容,但是如果您的对象足够简单,则可以编

  • 轻松上传是魔方加密开发的快速上传组件。轻松上传的环境要求: Microsoft Windows 操作系统 Google Chrome 浏览器 使用步骤 安装轻松上传后,您可以通过以下步骤使用: 打开 Windows 资源管理器,选择需要上传的 PHP 文件 按下 CTRL+C 复制文件 打开魔方加密页面 按下 CTRL+V 粘贴文件 等待文件上传 安装方法 点击这里 打开 Chrome 网上应用店

  • 第一节 Go语言安装与测试 轻松友好的安装方式,多平台支持。 第二节 内置基础数据类型 认识Go提供的清晰的数据类型,很清晰,不骗你。 第三节 变量与常量定义 学语言绕不开的变量,当然Go是静态语言,变量都是有固定类型的,程序运行过程中无法改变变量类型。 第四节 控制流程 很简单,只有if,for,switch三种流程,连while都没有。 第五节 数组,切片和字典 内置高级数据类型。如果我们需要

  • Go轻松学是一款学习GoLang的小型学习App。基于Android平台。主要包含Go基础和Go实例两部分。 Go轻松学,可以让你随时随地浏览Go提供的独特功能,本应用提供了翔实的测试例程序,100%测试通过。并且可以根据反馈持续更新。在这里,变量,函数,结构体,指针,并行计算,包和测试都有详细的讲解。 Go基础部分由本人的读书笔记归纳整理而来,而实例部分则由网址http://gobyexampl

  • 本文向大家介绍如何在VSCode上轻松舒适的配置Python的方法步骤,包括了如何在VSCode上轻松舒适的配置Python的方法步骤的使用技巧和注意事项,需要的朋友参考一下 前言 之前被学长推荐使用了VSCode,后惊叹了VSCode的强大,尤其是他的配置,比之前使用sublime方便多了,刚好实验室也来了一批新的学弟学妹,来仔细的逐步的讲解一些,在自己的电脑上轻松的配置VSCode并完成美化等