macs / geonames-bundle
GeoNames.org地理数据及其相关功能
Requires
- php: *
- guzzlehttp/guzzle: >=6
- jms/serializer: *
- knplabs/doctrine-behaviors: >=2
- macs/common: >=1
- ramsey/uuid: >=3.9
- symfony/framework-bundle: >=5
Requires (Dev)
- jms/cg: >=1.2
- symfony/console: >=5
- symfony/css-selector: >=5
- symfony/dom-crawler: >=5
README
简介
为[symfony 2][sf2]应用程序提供对geonames.org导出的数据的访问。
什么是geonames.org
来自geonames.org网站
GeoNames地理数据库涵盖了所有国家,包含超过八百万个可免费下载的地名。
何时使用此捆绑包
此捆绑包最有用的应用是将存储在数据库中的地理信息(如国家、州和城市)进行标准化。得益于geonames.org的广泛数据,几乎覆盖了全球所有城市、城镇和郊区。
功能
-
导入以下geonames.org数据
- 国家
- 时区
- 州和省
- 城市、城镇、郊区、村庄等
-
提供以下数据存储实现
- Doctrine ORM
安装
-
使用composer安装捆绑包
composer require jjs/geonames-bundle:*
或直接将其添加到您的
composer.json
文件中{ require: { "jjs/geonames-bundle": "*" } }
-
将捆绑包添加到您的
AppKernel.php
// AppKernel::registerBundles() $bundles = array( // ... new JJs\Bundle\GeonamesBundle\JJsGeonamesBundle(), // ... );
安装或更新数据库模式
捆绑包的数据库模式使用doctrine migrations定义。迁移版本设计为可以合并到您的应用程序迁移中,或者手动迁移模式。
独立版本控制
使用提供的迁移配置执行迁移
# Run in your project root directory
app/console doctrine:migrations:migrate --configuration=vendor/jjs/geonames-bundle/JJs/GeonamesBundle/migrations.xml
应用程序版本控制
此模式管理策略需要更多配置和管理,但提供了更大的控制权。这是由于增量数据库版本和语义捆绑包版本之间的映射。它涉及将geonames模式版本控制“折叠”到您自己的迁移中,并作为整体管理数据库迁移。
迄今为止,此版本控制策略尚未记录,如果您有兴趣使用它,请与我联系,我将编写文档。
导入数据
注意从远程geonames.org存储库导入数据涉及从geonames.org下载近250 MB数据。
以下命令可以按顺序使用,以从geonames.org导出加载所有支持的数据(http://download.geonames.org/export/dump)
导入国家
加载所有引用其他导入数据的国家的列表,例如时区和地方。
app/console geonames:load:countries
导入时区
加载映射到国家的时区列表
app/console geonames:load:timezones
过滤地方
此分支允许您过滤要导入到数据库中的地方。
注意此功能测试较少,请自担风险使用。
启用过滤器
要使用过滤器,您必须指定过滤器选项geonames:load:localities --filter="rule" [countries]
。
您可以同时使用多个规则geonames:load:localities --filter="rule,rule2" [countries]
。
添加过滤器规则
过滤器规则由三部分组成
- 值名称
- 比较函数
- 比较值
使用:
作为分隔符:valuename:compare_func:compare_value
。
值名称
值名称用于访问Locality类中的特定变量。
它会被内部转换为调用相应变量的获取函数(population
将转换为 getPopulation
)。
只有值名称的第一个字符会被转换为大写字母,
因此请确保检查 Import/Locality.php
以获取正确的获取函数拼写。
比较函数
在此阶段,您可以使用以下函数
检查值
... 是否等于比较值(字符串和整数)使用 =
、equal
或 equals
。
... 是否小于或等于比较值(整数)使用 <=
。
... 是否大于或等于比较值(整数)使用 >=
。
... 是否包含比较值(字符串)使用 contains
。
示例
以下是一些示例
# load all localities from germany with a population >= 2000 app/console geonames:load:localities --filter="population:>=:2000" DE # load all localities with the locality-name "Kiel" app/console geonames:load:localities --filter="nameUtf8:equals:Kiel" # load all localities that contain "Test" in the locality-name app/console geonames:load:localities --filter="nameUtf8:contains:Test" # load all localities from germany with a population between 42000 and 100000 app/console geonames:load:localities --filter="population:>=:42000,population:<=:100000" DE
导入地区
导入地区有两种选项——一次导入整个世界或按国家批量导入。内部使用相同的导入机制,导入过程将为每个国家下载一个数据文件,然后分别处理国家文件。
注意 完整加载过程可能需要几个小时才能完成,并且需要大量内存。
# All countries app/console geonames:load:localities # Subset of countries (list the desired contries as arguments) app/console geonames:load:localities US CA #Using the filter function (all countries) app/console geonames:load:localities --filter="option:func:value" #Using the filter function (specific countries, as argument list) app/console geonames:load:localities --filter="option:func:value" US CA