Python实现POI名称-编码之间的映射(GB_T 35648-2017 地理信息兴趣点分类与编码)

什么是POI?

POI是英文Point of Interest(兴趣点)的缩写,是指在地图或者导航系统中标注的各类地点信息,包括餐厅、酒店、景点、加油站、银行、医院等公共设施以及商业、文化、娱乐等各类场所。在地图应用和导航系统中,POI作为一种重要的信息资源,可以帮助用户找到目的地,并提供详细的位置、地址、电话等与兴趣点相关的重要信息。


GB_T 35648-2017 地理信息兴趣点分类与编码.PDF 资源

百度网盘链接:https://pan.baidu.com/s/11hl7tOcs4kodNSnU8JOeAA?pwd=1yx0
提取码:1yx0


GB_T 35648-2017 重点

POI编码总共6位,最后四位为0000为大类,最后两位为00为中类,剩下就是小类。


代码一(通过字典进行读取)

# 定义一个POI类别编码表,参考中国国家标准GB/T 35648-2017
poi_code_table = {
    "110000": "餐饮",
    "110100": "中餐厅",
    "110200": "西餐厅",
    # ......你可以添加更多
}


# 定义一个工具类,实现POI名称-编码之间的映射
class POIMapper:

    def __init__(self, code_table):
        self.code_table = code_table  # 传入编码表
        self.name_table = {}  # 创建一个空的名称表
        self.build_name_table()  # 构建名称表

    def build_name_table(self):
        # 遍历编码表,将编码-名称对调,存入名称表中
        for code, name in self.code_table.items():
            self.name_table[name] = code

    def get_code_by_name(self, name):
        # 根据名称查找对应的编码,如果找不到则返回None
        return self.name_table.get(name)

    def get_name_by_code(self, code):
        # 根据编码查找对应的名称,如果找不到则返回None
        return self.code_table.get(code)


# 创建一个工具类对象,并测试其功能

mapper = POIMapper(poi_code_table)

print(mapper.get_name_by_code("110000"))  # 输出:餐饮

print(mapper.get_code_by_name("中餐厅"))  # 输出:110100

print(mapper.get_code_by_name("海"))  # 输出:None

print(mapper.get_name_by_code("0301"))  # 输出:None

代码二(通过CSV文件进行读取)

# 定义一个类来存储POI代码和名称
class POI:
    # 用csv文件名初始化类
    def __init__(self, file_name):
        # 创建三个字典来存储所有类别的代码和名称
        self.major_code_dict = {}  # 大类
        self.medium_code_dict = {}  # 中类
        self.minor_code_dict = {}  # 小类
        self.major_name_dict = {}
        self.medium_name_dict = {}
        self.minor_name_dict = {}

        # 读取GB/T 35648-2017标准文件(假设它是csv格式)
        import csv
        with open(file_name, encoding='utf-8') as f:
            reader = csv.reader(f)
            # 跳过标题行
            next(reader)
            # 循环遍历每一行
            for row in reader:
                # 获取每个类别的代码和名称
                code = row[0]
                name = row[1]
                # 检查代码的长度以确定类别级别
                if code[2:] == "0000":
                    # 大类
                    self.major_code_dict[code] = name
                    self.major_name_dict[name] = code
                elif code[4:] == "00":
                    # 中类
                    self.medium_code_dict[code] = name
                    self.medium_code_dict[name] = code
                else:
                    # 小类
                    self.minor_code_dict[code] = name
                    self.minor_code_dict[name] = code

    # 定义一个方法来通过名称获取代码
    def get_code_by_name(self, name):
        # 循环遍历每个字典,如果找到,返回第一个匹配的代码
        for code, value in self.major_code_dict.items():
            if value == name:
                return code

        for code, value in self.medium_code_dict.items():
            if value == name:
                return code

        for code, value in self.minor_code_dict.items():
            if value == name:
                return code

        # 如果没有找到匹配的代码,则返回None
        return None

    # 定义一个通过代码获取名称的方法
    def get_name_by_code(self, code):
        # 循环遍历每个字典,如果找到,返回第一个匹配的代码
        for name, value in self.major_name_dict.items():
            if value == code:
                return code

        for code, value in self.medium_name_dict.items():
            if value == code:
                return code

        for code, value in self.minor_name_dict.items():
            if value == code:
                return code

        # 如果没有找到匹配的代码,则返回None
        return None

mapper = POI('./asserts/文件名称.csv')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值