地理数据库GeoNames,并导入Mysql

由于最近实验室的工作需要用到全世界的地名数据库,但是呢,从网上的各种结果来看,都是些相对不太完整 或者 导出格式不太方便的表格。因此这里先给出本文的主角——Geonames数据库。该数据库含有经纬度,所属国家及相应的人口密度,可以说是免费的数据库里最为详细的了,所以强烈推荐有需要的同学拿走哦:D

GeoNames数据库

首先贴上百度百科的的介绍:

GeoNames是一个免费的全球地理数据库。
GeoNames的目标是把各种来源的免费数据进行集成并制作成一个数据库或一系列的Web服务。

GeoNames地名辞典包含了1100万个地点将近200种语言的1100万个地名和200万种别名。地理信息还详细到坐标、行政区划、邮政编码、人口、海拔和时区。GeoNames的数据收集自(美国)国家测绘机构、国家统计署、国家邮政局,还有美国陆军。

如何下载并利用这些数据?

首先贴上GeoName数据库的官网:http://www.geonames.org/

然后进入主页,找到相应的下载位置:
在这里插入图片描述
可以看到这里也支持直接的web查询,不过这不是我们的重点。我们直接对其数据进行下载并导入mysql数据库。

点击Free Gazetteer Data,进入下载页面:
http://download.geonames.org/export/dump/

在这里插入图片描述
这里有好几种文件的名称,前面缩写的如,CN.zip就是中国地区的地名。不过这里演示的是总的,含有全球地名的zip——allCountries.zip,就是大小最大的文件。

然后当我们解压完该文件时竟然惊奇的发现,哇!居然是超过1个G的txt,甚至无法直接打开(汗),看来只有导入数据库进行使用了。

导入Mysql数据库

首先要导入数据库,就得知道如何创建相应的表支持其txt里各项值。当然这一点GeoNames官网肯定会有相应的介绍。
其实就在刚刚下载页面的下方,就有相应的文字说明:
多余的部分我就不贴上来了,这里就放上关于allCountries中的说明:
在这里插入图片描述

说实话导入数据库我花了很长的时间,这里面也有非常的多的坑,在网上不停的查询,论坛提问最后我才找到了一个亲试可行的办法。
这里直接贴上Mysql语句:

创建表

CREATE TABLE AllCountries (
    geonameid MEDIUMINT UNSIGNED NOT NULL  COMMENT "integer id of record in geonames database",
    name     VARCHAR(200) CHARACTER SET utf8mb4  COMMENT "name of geographical point (utf8) varchar(200)",
    asciiname  VARCHAR(200)    COMMENT "name of geographical point in plain ascii characters, varchar(200)",
    alternatenames TEXT CHARACTER SET utf8mb4   COMMENT "alternatenames, comma separated, ascii names automatically transliterated, convenience attribute from alternatename table, varchar(10000)",
    latitude   DECIMAL(7,5)    COMMENT "latitude in decimal degrees (wgs84)",
    longitude  DECIMAL(8,5)    COMMENT "longitude in decimal degrees (wgs84)",
    feature_class CHAR(1)      COMMENT "see http://www.geonames.org/export/codes.html, char(1)",
    feature_code  VARCHAR(10)  COMMENT "see http://www.geonames.org/export/codes.html, varchar(10)",
    country_code  CHAR(2)      COMMENT "ISO-3166 2-letter country code, 2 characters",
    cc2          VARCHAR(200)  COMMENT "alternate country codes, comma separated, ISO-3166 2-letter country code, 200 characters",
    admin1_code  VARCHAR(20)   COMMENT "fipscode (subject to change to iso code), see exceptions below, see file admin1Codes.txt for display names of this code; varchar(20)",
    admin2_code  VARCHAR(80)   COMMENT "code for the second administrative division, a county in the US, see file admin2Codes.txt; varchar(80) ",
    admin3_code  VARCHAR(20)   COMMENT "code for third level administrative division, varchar(20)",
    admin4_code  VARCHAR(20)   COMMENT "code for fourth level administrative division, varchar(20)",
    population  DECIMAL(11,0)  COMMENT "bigint (8 byte int) ",
    elevation  SMALLINT UNSIGNED  COMMENT "in meters, integer",
    dem        SMALLINT UNSIGNED  COMMENT "digital elevation model, srtm3 or gtopo30, average elevation of 3''x3'' (ca 90mx90m) or 30''x30'' (ca 900mx900m) area in meters, integer. srtm processed by cgiar/ciat.",
    timezone   VARCHAR(40)     COMMENT "the timezone id (see file timeZone.txt) varchar(40)",
    modification_date DATE     COMMENT "date of last modification in yyyy-MM-dd format",
    PRIMARY KEY(geonameid)
) ENGINE=InnoDB DEFAULT CHARACTER SET ascii COMMENT 'http://download.geonames.org/export/dump/';

导入allCountries.txt

LOAD DATA INFILE 'C:\\Users\\Administrator\\Desktop\\allcountries.txt'
    INTO TABLE allcountries
    CHARACTER SET utf8mb4
    FIELDS TERMINATED BY "\t"
    LINES TERMINATED BY '\n';

然后就可以静候导入成功啦!(超过40分钟的导入过程)
在这里插入图片描述
可以看到这里的行数超过1200万条!!!

这里贴上原论坛大神的链接:
https://dba.stackexchange.com/questions/145080/import-geonames-allcountries-txt-into-mysql-5-7-using-load-infile-error-1300

TXT文本转表格

最后贴上一个python代码,如果有想将国家地名的txt转为表格形式的可以试试下面的代码:

from openpyxl import Workbook
def txt2xls(filename, xlsname):
    """
    :文本转换成xls的函数
    :param filename txt文本文件名称、
    :param xlsname 表示转换后的excel文件名
    """
    print(filename)
    try:
        f = open(filename, encoding='utf-8')
        xls = Workbook()
        # 生成excel的方法,声明excel
        sheet = xls.get_sheet_by_name('Sheet')  # 通过表名获取
        x = 1
        while True:
            # 按行循环,读取文本文件
            line = f.readline()
            if not line:
                break  # 如果没有内容,则退出循环
            for i in range(len(line.split('\t'))):
                item = line.split('\t')[i]
                sheet.cell(x,i+1).value = item 
            x += 1  # excel另起一行
        f.close()
        xls.save(xlsname)  # 保存xls文件
    except:
        raise

需要提醒的是US.zip即美国的地名超过excel最大行数1048576,所以往往一个表格不够用(美国地名超过两百万),所以可以单独试试下面的代码:

from openpyxl import Workbook
def US2xls(filename, xlsname):
    """
    :文本转换成xls的函数
    :param filename txt文本文件名称、
    :param xlsname 表示转换后的excel文件名
    """
    print(filename)
    num = 1
    try:
        f = open(filename, encoding='utf-8')
        xls = Workbook()
        # 生成excel的方法,声明excel
        sheet = xls.get_sheet_by_name('Sheet')  # 通过表名获取
        x = 1
        while True:
            # 按行循环,读取文本文件
            line = f.readline()
            if not line:
                break  # 如果没有内容,则退出循环
            for i in range(len(line.split('\t'))):
                item = line.split('\t')[i]
                sheet.cell(x,i+1).value = item
            x += 1  # excel另起一行
            if x== 1048576:
                xls.save(xlsname)  # 保存xls文件
                xls = Workbook()# 创建一个新的excel文件
                sheet = xls.get_sheet_by_name('Sheet')  # 通过表名获取
                xlsname = str(xlsname).replace('.xls', str(num)+'.xls')# 更新保存的路径
                num += 1
                x = 1# 重置行数
        f.close()
        xls.save(xlsname)  # 保存xls文件
    except:
        raise

写在最后:
因为本身找到这个数据库并将其导入Mysql中确实不容易花费至少一个星期的时间,所以最后成功导入后就像把帖子分享出来,本身Geonames数据库很全,而且还是免费(划重点),但是呢查出来的方法往往都是很早以前的版本,而且大部分都是英语的网页,所以就特别想把这个分享出来,给需要的人尤其是需要这方面数据的朋友。

  • 29
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值