首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用esy-osm-pbf中的纬度和经度值在Python中获取给定半径处的设施列表

的方法如下:

  1. 导入必要的库和模块:
代码语言:txt
复制
import osmium
import math
  1. 创建自定义的处理器类,继承自osmium.SimpleHandler:
代码语言:txt
复制
class FacilityHandler(osmium.SimpleHandler):
    def __init__(self, center_lat, center_lon, radius):
        super(FacilityHandler, self).__init__()
        self.facilities = []
        self.center_lat = center_lat
        self.center_lon = center_lon
        self.radius = radius
    
    def way(self, w):
        for tag in w.tags:
            if tag.k == "amenity":
                lat = w.center().lat
                lon = w.center().lon
                distance = self.calculate_distance(lat, lon)
                
                if distance <= self.radius:
                    facility_info = {
                        "name": tag.v,
                        "lat": lat,
                        "lon": lon,
                        "distance": distance
                    }
                    self.facilities.append(facility_info)
                    break
    
    def calculate_distance(self, lat, lon):
        lat1 = math.radians(self.center_lat)
        lon1 = math.radians(self.center_lon)
        lat2 = math.radians(lat)
        lon2 = math.radians(lon)
        
        radius = 6371  # approximate radius of the Earth in kilometers
        
        dlat = lat2 - lat1
        dlon = lon2 - lon1
        
        a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2) * math.sin(dlon/2)
        c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
        
        distance = radius * c
        return distance
  1. 定义函数来执行处理操作,并返回设施列表:
代码语言:txt
复制
def get_facilities(center_lat, center_lon, radius, pbf_file_path):
    facility_handler = FacilityHandler(center_lat, center_lon, radius)
    
    # 创建Osmium Reader并使用处理器处理PBF文件
    reader = osmium.io.Reader(pbf_file_path)
    osmium.apply(reader, facility_handler)
    reader.close()
    
    return facility_handler.facilities
  1. 调用函数并打印设施列表:
代码语言:txt
复制
center_lat = 40.7128
center_lon = -74.0060
radius = 10  # 单位:千米
pbf_file_path = "path/to/pbf/file.pbf"

facilities = get_facilities(center_lat, center_lon, radius, pbf_file_path)

for facility in facilities:
    print(facility)

注意:这里的代码示例假设你已经安装了 esy-osm-pbf 和相关的库,并且已经下载了 OpenStreetMap 的 PBF 数据文件。另外,你还需要根据实际情况修改代码中的经纬度、半径和 PBF 文件路径。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

redis常用命令和数据类型

,则都不会创建成功 设置获取指定范围内 设置并且指定过期时间 获取原来,并设置新 二、list(列表)类型 操作list命令,自己看吧https://www.runoob.com...语法: geoadd key 经度 纬度 地名 经度 纬度 地名 ... ... 2、geopos:获取地理位置坐标(经度纬度) geopos key 地名 3、geodist:计算两个位置之间距离...georadius 以给定纬度为中心, 返回键包含位置元素当中, 与中心距离不超过给定最大距离所有位置元素 georadius key 经度 纬度 半径 单位 [WITHCOORD] [WITHDIST...georadiusbymember GEORADIUS 命令一样, 都可以找出位于指定范围内元素, 但是 georadiusbymember 中心点是由给定位置元素决定, 而不是使用经度纬度来决定中心点...二、Bitmaps 用来统计用户是否访问过网站,访问为1,没有为0 详解redisbitmap亿级项目中应用 设置setbit:设置Bitmaps某个偏移量(0或1),offset从0

90010

redis | 九、redis之Geospatial

sorted set使用一种称为Geohash技术进行填充。经度纬度位是交错,以形成一个独特52位整数....从key里返回所有给定位置元素位置(经度纬度)。...返回 GEOPOS 命令返回一个数组, 数组每个项都由两个元素组成:第一个元素为给定位置元素经度, 而第二个元素则为给定位置元素纬度。 当给定位置元素不存在时, 对应数组项为空。...返回 没有给定任何 WITH 选项情况下, 命令只会返回一个像 [“New York”,”Milan”,”Paris”] 这样线性(linear)列表。...以给定纬度为中心, 找出某一半径元素 Redis GEOADD 命令 将指定地理空间位置(纬度经度、名称)添加到指定key Redis GEORADIUSBYMEMBER 命令 找出位于指定范围内元素

66020
  • 使用Redis实现附近的人及打车服务

    当用户登录应用时,或者保持用户登录后用户使用应用时,客户端是可以时刻获取用户位置信息(前提是用户要开启位置获取权限),客户端获取到最新地理位置后,上传到后端服务器进行更新。...这就要用到GEO类型GeoHash编码。 工作原理 sorted set 使用一种称为 Geohash 技术进行填充。经度纬度位是交错,以形成一个独特 52 位整数....,把经度116.37定位在[112.5, 123.75]这个区间,得到经度5位编码:11010 对纬度编码方式,经度一样,只是纬度范围[-90,90],如对纬度39.86编码过程...字符串越长,表示范围越精确。 GEOPOS 从key里返回所有给定位置元素位置(经度纬度)。...范围可使用如下单位: 在给定以下可选项时, 命令会返回额外信息: WITHDIST: 返回位置元素同时, 将位置元素与中心之间距离也一并返回。

    1.2K20

    深入浅出Redis(十一):Geosptial、Hypeloglog、Bitmap、Bloom Filter布隆过滤器

    ,底层实现使用zset对象 因此也可以使用Zset命令geoadd 添加geoadd key 经度 纬度 名称将指定地理空间位置(纬度经度、名称)添加到指定key(可添加多个)有效经度从-180...geopos key 成员名...从key里返回所有给定位置元素位置(经度纬度) 127.0.0.1:6379> geopos china:city beijing shenzhen 1) 1) "...110,30为中心,半径1500km范围内成员 列出成员坐标经纬度成员到中心直线距离 127.0.0.1:6379> georadius china:city 110 30 1500 km withcoord...打卡,未打卡)使用setbit key offset value设置keyoffsetbit(0/1)getbit key offset 获得keyoffsetbit(0/1)bitcount...1判断是否集合:将Key经过多个hash函数得到索引,查看位数组对应索引上是否为1,为1则可能存在(该索引上设置为1还有可能是添加其他Key设置),如果为0,那么该Key一定不存在集合布隆过滤器误判率与空间大小有关

    34431

    Redis实现附近的人

    当用户登录应用时,或者保持用户登录后用户使用应用时,客户端是可以时刻获取用户位置信息(前提是用户要开启位置获取权限),客户端获取到最新地理位置后,上传到后端服务器进行更新。...字符串越长,表示范围越精确。 ? GEOPOS 从key里返回所有给定位置元素位置(经度纬度)。...GEORADIUS 使用输入经度纬度来决定中心点 指定成员位置被用作查询中心 ?...工作原理 sorted set 使用一种称为 Geohash 技术进行填充。经度纬度位是交错,以形成一个独特 52 位整数....当在社交网站其他大多数需要查询半径应用中使用时,这些偏差都不算问题。但是,最坏情况下偏差可能是 0.5%,所以一些地理位置很关键应用还是需要谨慎考虑。 代码实战 更新坐标 ?

    73320

    Redis 实战篇:Geo 算法教你邂逅附近女神

    ” 以用户为中心,给定一个 1000 米作为半径画圆,那么圆形区域内用户就是我们想要邂逅「附近的人」。...「宅男」登陆 app获取「心动女生」时候,app根据「宅男」纬度查找附近「女神」。 获取到位置符合「女神」ID 列表后,再从数据库获取 ID 对应「女神」信息返回用户。...” 思路对了,为了实现对经纬度比较,Redis 采用业界广泛使用 GeoHash 编码,分别对经度纬度编码,最后再把经纬度各自编码组合成一个最终编码。...进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) [0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码经度落在了左分区还是右分区。...一个地图应用,车数据、餐馆数据、人数据可能会有百万千万条,如果使用 Redis Geo 数据结构,它们将全部放在一个 zset 集合

    1.6K10

    Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

    ” 以用户为中心,给定一个 1000 米作为半径画圆,那么圆形区域内用户就是我们想要邂逅「附近的人」。 将经纬度存储到 MySQL: ?...「宅男」登陆 app获取「心动女生」时候,app根据「宅男」纬度查找附近「女神」。 获取到位置符合「女神」ID 列表后,再从数据库获取 ID 对应「女神」信息返回用户。...” 思路对了,为了实现对经纬度比较,Redis 采用业界广泛使用 GeoHash 编码,分别对经度纬度编码,最后再把经纬度各自编码组合成一个最终编码。...进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) [0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码经度落在了左分区还是右分区。...一个地图应用,车数据、餐馆数据、人数据可能会有百万千万条,如果使用 Redis Geo 数据结构,它们将全部放在一个 zset 集合

    1.3K20

    Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

    ” 以用户为中心,给定一个 1000 米作为半径画圆,那么圆形区域内用户就是我们想要邂逅「附近的人」。...「宅男」登陆 app获取「心动女生」时候,app根据「宅男」纬度查找附近「女神」。 获取到位置符合「女神」ID 列表后,再从数据库获取 ID 对应「女神」信息返回用户。...” 思路对了,为了实现对经纬度比较,Redis 采用业界广泛使用 GeoHash 编码,分别对经度纬度编码,最后再把经纬度各自编码组合成一个最终编码。...进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) [0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码经度落在了左分区还是右分区。...一个地图应用,车数据、餐馆数据、人数据可能会有百万千万条,如果使用 Redis Geo 数据结构,它们将全部放在一个 zset 集合

    1.1K50

    Redis除了五大数据类型,还有特殊数据类型!

    指令含义:将指定地理空间位置(纬度经度、名称)添加到指定key。...这些数据将会存储到Zset,这样目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。 该命令采用标准格式参数x,y,所以经度必须在纬度之前。...指令含义:从key里返回所有给定位置元素位置(经度纬度) 因为GEOPOS命令接受可变数量位置元素作为输入,所以即使用户只给定了一个位置元素,命令也会返回数组回复。...命令一样,都可以找出位于指定范围内元素,但是GEORADIUSBYMEMBER中心点是由给定位置元素决定,而不是像GEORADIUS那样,使用输入经度纬度来决定中心点指定成员位置被用作查询中心...(字符串)offsetbit

    21230

    利用RedisGeo功能实现查找附近位置

    GEO相关命令如下: Redis 命令 描述 GEOHASH 返回一个或多个位置元素 Geohash 表示 GEOPOS 从 key 里返回所有给定位置元素位置(经度纬度) GEODIST 返回两个给定位置之间距离...GEORADIUS 以给定纬度为中心, 找出某一半径元素 GEOADD 将指定地理空间位置(纬度经度、名称)添加到指定 key GEORADIUSBYMEMBER 找出位于指定范围内元素...纬度为39.08地点tianjin经度为114.29纬度为38.02地点shijiazhuang加入key为cities:locs sorted set集合。...2.2 统计单位半径地区 我们可以借助于GEORADIUS来找出以给定纬度,某一半径所有元素。...WITHCOORD 将位置元素经度维度也一并返回,非必选。 WITHDIST 返回位置元素同时, 将位置元素与中心点距离也一并返回。 距离单位查询单位一致,非必选。

    2.4K50

    python练习题(3)——地球数据计算

    Python作为一门功能强大且易学编程语言,为我们提供了处理地球数据优秀工具技术。本文中,我们将探索一道关于地球数据Python程序练习题,通过实践应用,发现Python编程魅力。...编程练习有助于我们更深入地理解Python各种功能概念,同时帮助我们发现纠正在实践可能犯错误。只有实际应用,我们才能真正体会到编程乐趣挑战。...地球半径是6371千米,假设地球是一个规则球体,编写程序完成以下计算并输出结果,结果保留2位小数。π引用math库常数pi。...我们可以使用地球平均半径约为6371公里来简化问题。 例如,给定点A(纬度:40.7128,经度:-74.0060)点B(纬度:34.0522,经度:-118.2437),计算它们之间距离。...本文Python程序练习题涉及地球数据计算,通过实践应用,我们将探索如何使用Python编程计算地球上表面积,体积,赤道长度等。

    54710

    一口气说出 4种 “附近的人” 实现方式,面试官笑了!

    指定精度后计算用户坐标的geoHash码,再获取到用户周边8个方位geoHash码在数据库搜索用户,最后过滤掉超出给定距离(500米内)用户。...GEOADD:将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS:从key里面返回所有给定位置对象位置(经度纬度); GEODIST:返回两个给定位置之间距离; GEOHASH...获取目标集合与中心距离不超过给定最大距离(500米内)所有位置对象,也就是“附近的人”。...WITHDIST:返回位置对象同时,将位置对象与中心之间距离也一并返回。距离单位用户给定范围单位保持一致。 WITHCOORD:将位置对象经度维度也一并返回。...每个元素都是一个带位置对象,元素score为通过经、纬度计算出52位geohash

    2.1K20

    一口气说出 4种 LBS “附近的人” 实现方式,面试官笑了

    指定精度后计算用户坐标的geoHash码,再获取到用户周边8个方位geoHash码在数据库搜索用户,最后过滤掉超出给定距离(500米内)用户。...GEOADD:将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS:从key里面返回所有给定位置对象位置(经度纬度); GEODIST:返回两个给定位置之间距离; GEOHASH...,获取目标集合与中心距离不超过给定最大距离(500米内)所有位置对象,也就是“附近的人”。...WITHDIST:返回位置对象同时,将位置对象与中心之间距离也一并返回。距离单位用户给定范围单位保持一致。 WITHCOORD:将位置对象经度维度也一并返回。...zset每个元素都是一个带位置对象,元素score为通过经、纬度计算出52位geohash

    1.5K30

    Redis各种数据类型

    lrange list 0 1 获取list 通过区间获取具体 取出 pop lpop 移除列表第一个元素 rpop 移除列表最后一个元素 获取下标 lindex list...返回一个或多个位置元素 Geohash 表示 Redis GEOPOS 命令 从key里返回所有给定位置元素位置(经度纬度) Redis GEODIST...,中心点是由给定位置元素决定 geoadd 添加地理位置 (经度 纬度 名称 )添加到指定key 规则 : 两级无法直接添加我们一般会下载城市数据 直接通过java一次性导入 127.0.0.1...一个坐标值 127.0.0.1:6379> geopos china:city beijing 获取指定城市经度纬度 1) 1) "116.40528291463852" 2) "39.904988422912503...通过半径来查询 georedius 以给定纬度为中心 找出某一半径元素 所有的数据应该录入到China:city 127.0.0.1:6379> georadius china:city 110

    68010

    利用RedisGeo功能实现查找附近

    GEO相关命令如下: Redis 命令 描述 GEOHASH 返回一个或多个位置元素 Geohash 表示 GEOPOS 从 key 里返回所有给定位置元素位置(经度纬度) GEODIST 返回两个给定位置之间距离...GEORADIUS 以给定纬度为中心, 找出某一半径元素 GEOADD 将指定地理空间位置(纬度经度、名称)添加到指定 key GEORADIUSBYMEMBER 找出位于指定范围内元素...纬度为39.08地点tianjin经度为114.29纬度为38.02地点shijiazhuang加入key为cities:locs sorted set集合。...2.2 统计单位半径地区 我们可以借助于GEORADIUS来找出以给定纬度,某一半径所有元素。...WITHCOORD 将位置元素经度维度也一并返回,非必选。 WITHDIST 返回位置元素同时, 将位置元素与中心点距离也一并返回。距离单位查询单位一致,非必选。

    1.5K30

    Redis 新数据类型

    举个例子:假如我要统计网页 UV(浏览用户数量,一天内同一个用户多次访问只能算一次),传统解决方案是使用 Set 来保存用户 id,然后统计 Set 元素数量来获取页面 UV。...例子: geopos china:city 北京 上海 重庆 # 返回经度纬度 获取两个位置之间直线距离 geodist [m|km|ft|mi] 例子: geodist...ft 表示单位为英尺 以给定纬度为中心,找出某一半径元素 georadius 距离 m|km|ft|mi 例子: georadius china:city 110...将一个或多个 HLL 合并后结果存 储另一个 HLL 指令 含义 geoadd ......获得指定地区坐标值 geodist [m|km|ft|mi] 获取两个位置之间直线距离 georadius 距离 m|km|ft|mi 以给定纬度为中心

    58310

    Redis 到底是怎么实现“附近的人”这个功能呢?

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...将给定位置对象(纬度经度、名字)添加到指定key。 其中,key为集合名称,member为该经纬度所对应对象。...(zset)保存位置对象,有序集合每个元素都是一个带位置对象,元素score为其经纬度对应52位geohash。...距离单位用户给定范围单位保持一致。 WITHCOORD:将位置对象经度维度也一并返回。...实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格点(蓝点红点)与中心点距离,最终筛选出距离范围内

    1.2K10

    Redis 到底是怎么实现“附近的人”这个功能

    Redis Geo模块包含了以下6个命令: GEOADD: 将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS: 从key里面返回所有给定位置对象位置(经度纬度); GEODIST...其中,组合使用GEOADDGEORADIUS可实现“附近的人”“增”“查”基本功能。 要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...将给定位置对象(纬度经度、名字)添加到指定key。 其中,key为集合名称,member为该经纬度所对应对象。...距离单位用户给定范围单位保持一致。 - WITHCOORD:将位置对象经度维度也一并返回。...实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格点(蓝点红点)与中心点距离,最终筛选出距离范围内

    93630
    领券