全球网站免费空间注册南京市建设执业资格中心网站
web/
2025/10/2 3:03:19/
文章来源:
全球网站免费空间注册,南京市建设执业资格中心网站,办公用品网站系统建设源码,wordpress主题防修改视频学习地址 国内的一些地址解析供应商的API都开始付费了#xff0c;就想找个免费的地址解析和逆地址解析的应用#xff0c;最终选择了Nominatim OpenStreetMap 文章目录 一、选型1-1、数据源1-2、地理编码引擎2-1、初尝Nominatim2-1-1、地址解析2-1-2、逆地址解析 2-2、OS…视频学习地址 国内的一些地址解析供应商的API都开始付费了就想找个免费的地址解析和逆地址解析的应用最终选择了Nominatim OpenStreetMap 文章目录 一、选型1-1、数据源1-2、地理编码引擎2-1、初尝Nominatim2-1-1、地址解析2-1-2、逆地址解析 2-2、OSM数据解析2-2-1、place表2-2-2、placex表 2-3、Nominatim和OSM数据关系映射2-4、举一反三2-5、Nominatim API解析 三、安装四、关于数据源 重要五、替代方案N、其它N-1、place和placexN-2、相关资料N-3、测试覆盖地址解析 逆地址解析 这篇文章将会从调研、选型、测试、应用全方面的解析如果你也在找地址解析和逆地址解析的开源方案它一定会给你带来帮助 地址解析通过一个地名深圳获取当前地方的经纬度、省市区级别 逆地址解析通过经纬度获取当前位置的名称、省市区级别 一、选型 1-1、数据源 对于地图解析这个应用来说最重要不是软件部分而是数据只有数据全面了才有可能得出相对准确的结果。目前开源免费的全面的数据大概率只有 OpenStreetMap了它是由各个国家的志愿者一起维护的数据
OpenStreetMap后面简称OSM 是一个众包的地图项目旨在创建一个可自由编辑和使用的世界地图数据库。它由全球的志愿者贡献者更新和维护提供了一个详细和准确的地理数据集合。OSM 数据包括道路、建筑物、自然特征、商业设施等简单理解就是很多志愿者一起维护了一份地图数据 OpenStreeMap 相关文档链接 (后面会详解)
描述地址官网https://www.openstreetmap.org没有找到合适的中国数据而且中国数据和台湾都是分开的这必然不行直接用亚洲的数据https://download.openstreetmap.fr/extracts/每一个地址都会有标签标签很多想知道某个标签的含义可去标签系统搜索下面会讲解https://taginfo.openstreetmap.org 1-2、地理编码引擎 调研时间24年5月
开源方案NominatimPeliasPhoton支持数据源OpenStreetMapOpenStreetMap、OpenAddresses、Geonames等OpenStreetMap核心功能地理编码和逆地理编码地理编码和逆地理编码支持全文搜索高效地进行地理编码和逆地理编码开发语言Python、PHPTwigJavaGitHub关注数2.9K3.1K1.8KGitHub最新版本时间2024-03-07无2024-03-06GitHub待解决问题数9224257GitHub活跃度高去年发布10个版本低无正式版本中去年发布2个版本GitHub代码贡献者数902849系统对接REST APIREST APIREST API Nominatim能满足功能需求需要额外处理直辖市和港澳台问题Photon 不支持中文国际化无法满足 Nominatim 是一个开源的地理编码引擎专门用于从 OSM 数据中提取地理信息。它提供了两种主要功能
地理编码将地址转换为经纬度坐标逆地理编码将经纬度坐标转换为地址 Nominatim 的API其实已经研究过了是满足的下面详细讲解它的API 2-1、初尝Nominatim 这个要VPN才可以访问
2-1-1、地址解析 请求地址
https://nominatim.openstreetmap.org/search?11q深圳市formatgeocodejsonaddressdetails1accept-languagezhzoom8limit1请求结果
{type: FeatureCollection,geocoding: {version: 0.1.0,attribution: Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright,licence: ODbL,query: 深圳市},features: [{type: Feature,properties: {geocoding: {place_id: 368109611,osm_type: relation,osm_id: 3464353,osm_key: boundary,osm_value: administrative,type: city,label: 深圳市, 广东省, 中国,name: 深圳市,state: 广东省,country: 中国,country_code: cn,admin: {level5: 深圳市,level4: 广东省}}},geometry: {type: Point,coordinates: [114.0545429,22.5445741]}}]
}2-1-2、逆地址解析 请求地址
https://nominatim.openstreetmap.org/reverse?formatgeocodejsonlat43.767755lon87.51623addressdetails1accept-languagezhzoom8limit1请求结果
{type: FeatureCollection,geocoding: {version: 0.1.0,attribution: Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright,licence: ODbL,query: },features: [{type: Feature,properties: {geocoding: {place_id: 190215046,osm_type: relation,osm_id: 5663100,osm_key: boundary,osm_value: administrative,type: district,accuracy: 0,label: 沙依巴克区, 乌鲁木齐市, 新疆维吾尔自治区, 830000, 中国,name: 沙依巴克区,postcode: 830000,city: 乌鲁木齐市,state: 新疆维吾尔自治区,country: 中国,country_code: cn,admin: {level6: 沙依巴克区,level5: 乌鲁木齐市,level4: 新疆维吾尔自治区}}},geometry: {type: Point,coordinates: [87.46749,43.726972]}}]
}2-2、OSM数据解析 对于地图服务真正难的是数据核心也还是OSM的数据后面会讲怎么导入数据这里先解析数据。把OSM的数据导入到 PostgreSQL后它有两张重要的表个人感觉对于一般应用来说理解这两张表就够够了 下面是我的理解供参考
placeplace表维护的是每一条独立的数据可以是一棵树、也可以是一条河、一个城市placex因为地区是包含关系placex维护的是有关系的上下级数据
表字段很多下面讲重要的如果对这两张表结构感兴趣的可以参看下面的 N-1 2-2-1、place表 字段描述osm_id数据的唯一idosm_type数据类型N、R、W 对表500w数据 distinct 搜索 1.节点Node存储为一个经纬度坐标点。例如一个节点可能表示一个具体的地理位置如一座建筑物的角落或一棵树 2.路径Way由一系列节点组成每个节点都有其自己的经纬度坐标。路径可以表示线性特征如道路或闭合区域如湖泊 3.关系Relation由多个节点和路径组成表示更复杂的地理特征和逻辑关系如边界、多边形区域或路线class这两个字段是一起的 keyvalue是对这条数据打的标签目前有 9w个key highwaysecondary 1. highway标签是用于任何类型道路的主要标签 2. highwaysecondary 次要道路是连接重要城镇的道路注https://taginfo.openstreetmap.org 因为keyvalue 太多了官方有专门维护描述typeadmin_level当前数据的等级数据库有 1-15级 抽样查看了每一层的数据并不是特别的标准name当前数据的各种语言的描述地址解析的时候我猜就是匹配这个字段 eg: “name”“深圳市”, “name:af”“Shenzhen”, “name:ar”“شنجن (الصين)”, “name:az”“Şençjen”, “name:ba”“Шэньчжэнь”, “name:be”“Шэньчжэнь”,geometry当前数据的经纬度数据存在多种可能性比如点、线、多线、多边形、几何图形 等 注数据并不全是存的明文有些是加密的可以通过在线工具解密https://www.zaixianjisuan.com/dilicesuan/wkt%20_%20wkb%20_%20geojson%20convert%20online.html geometry 存储数据样例
POINT(117.1767305 39.1448629)
LINESTRING(117.1847722 39.1481168, 117.1845921 39.1481353)
POLYGON((117.1829091 39.1494689, 117.182913 39.1494281, 117.1829335 39.1493904, 117.1829685 39.1493598, 117.1830143 39.1493394, 117.183066 39.1493315, 117.1831199 39.1493372, 117.1831478 39.1493482, 117.1831683 39.1493563, 117.183206 39.1493867, 117.1832286 39.1494251, 117.1832337 39.149467, 117.1832206 39.149508, 117.183191 39.1495433, 117.183148 39.1495691, 117.1830964 39.1495825, 117.183042 39.1495819, 117.1829924 39.1495681, 117.182951 39.1495428, 117.1829222 39.1495085, 117.1829091 39.1494689))2-2-2、placex表 placex 表的关键信息它很多字段和place表一样
字段名描述place_id数据的唯一idparent_place_id上级idimportance数据权重匹配到多条数据这个字段是排序规则之一centroid当前区域的中心点 是个POINT类型的 经纬度参看上面的 geometrypostcode邮编country_code国家编码 cnosm_type同 place表osm_id同 place表class同 place表type同 place表admin_level同 place表name同 place表geometry同 place表 这个表数据很重要解析和逆解析都是对这个表进行搜索 2-3、Nominatim和OSM数据关系映射 Nominatim和OpenStreetMap 字段映射关系从上面的返回值抽取稳定有用的字段
Nominatim 返回字段OpenStreeMap 字段对应表 placexplace_idplace_idosm_idosm_idosm_typeosm_typeosm_keyclassosm_valuetypeadmin[]在 placex 表有个parent_place_id一直向上取到 parent_place_id 0 key level admin_level value name - ‘name’postcodepostcodelabeladmin postcodegeometrycentroid 2-4、举一反三 通过上面的分析得出2点
Nominatim 就是一个地图搜索引擎用的是OSM的数据Nominatim 不管是解析还是逆解析返回的都是 placex 表的某条数据place_id 通过对数据的分析和一些文档描述大概知道了它搜索的逻辑地址解析就是去模糊匹配 name逆地址解析就是拿入参的经纬度去找数据库距离最近权重最高的数据返回 地址解析SQL
SELECTplace_id,ST_AsText(geometry) AS geometry
FROM placex
WHERE name - name ILIKE %中国%
AND importance IS NOT NULL
ORDER BY importance DESC
LIMIT 1;逆地址解析SQL
SELECT place_id,ST_X(centroid) AS lon,ST_Y(centroid) AS lat,ST_Distance(geometry::geography, ST_SetSRID(ST_MakePoint(90.392926,30.014464), 4326)::geography) AS distance
FROM placex
WHERE ST_Distance(geometry::geography, ST_SetSRID(ST_MakePoint(90.392926,30.014464), 4326)::geography) BETWEEN 1 AND 1000
ORDER BYdistance ASC,importance DESC
LIMIT 1;测试结果和Nominatim返回的结果相似度90%但性能没法比SQL运行结果很慢 2-5、Nominatim API解析 https://nominatim.openstreetmap.org/search?11q深圳市formatgeocodejsonaddressdetails1accept-languagezhzoom8limit1
https://nominatim.openstreetmap.org/reverse?formatgeocodejsonlat43.767755lon87.51623addressdetails1accept-languagezhzoom8limit1上面这两个URL在绝大部分场景下已经是最佳答案了如果你还需要其它的请参考官方API文档
https://nominatim.org/release-docs/develop/api/Search/https://nominatim.org/release-docs/develop/api/Reverse/ 字段描述q文本查询 不和省、市、区 这些字段一起使用format返回的数据格式相信我 geocodejson 是最好的格式因为它最接近数据库的数据addressdetails是否返回地址详情accept-languagezh 返回中文不然可能会有少数民族文字limit限制返回条数数据已经是按照权重排好序了大部分场景只要一条数据所以 limit1zoom8返回的层级 4级基本是省份5级基本是城市 建议带上这个参数不然极少数情况会出错作者说的lat、lon经纬度 三、安装 https://download.openstreetmap.fr/extracts/asia.osm.pbf 下载亚洲的 PBF文件 先看四
然后去你的服务上用docker安装差不多要300G磁盘执行过程大概4天半左右
docker run -d -it
--shm-size12g -e
PBF_PATH/nominatim/osm_data/下载下来的数据.pbf
-e IMPORT_STYLEaddress
-e NOMINATIM_FLATNODE_FILE/nominatim/flat_data/flatnode.file
-p 8090:8080 -p 5432:5432
-v /nominatim/flat_data:/nominatim/flat_data
-v /nominatim/osm_data:/nominatim/osm_data
--name planet mediagis/nominatim:4.4官网dockert安装地址https://github.com/mediagis/nominatim-docker/tree/master/4.4 非docker安装需要很多各种依赖较为麻烦 四、关于数据源 重要 尝试过的数据源
问题数据范围数据源Nominatim不支持map和img格式中国https://download3.bbbike.org/osm/garmin/region/asia/china/Nominatim不支持map和img格式中国https://download3.bbbike.org/osm/mapsforge/region/asia/china/数据不全部分数据有问题中国https://download.openstreetmap.fr/extracts/asia/china-latest.osm.pbf数据不全部分数据有问题中国https://download.geofabrik.de/asia.html数据不全部分数据有问题中国https://osmtoday.com/asia.html完美 亚洲https://download.openstreetmap.fr/extracts/asia.osm.pbf 数据源相关文章
https://wiki.openstreetmap.org/wiki/Zh-hans:Planet.osm https://www.chinaflier.com/thread-202695-1-1.html https://github.com/osm-search/Nominatim/discussions/3434 尝试了很多的中国数据一直都不准最后抱着试试的心理尝试了亚洲的数据完美 服务器4核32G亚洲 pbf 15g导入时间 4天半消耗空间 277G 五、替代方案 如果你只是需要简单的地址解析和逆地址解析其实也不用如此大费周章可以参看
https://blog.csdn.net/Tomwildboar/article/details/139882311 N、其它 N-1、place和placex
CREATE TABLE public.place (osm_type char(1) COLLATE pg_catalog.default NOT NULL,osm_id int8 NOT NULL,class text COLLATE pg_catalog.default NOT NULL,type text COLLATE pg_catalog.default NOT NULL,admin_level int2,name public.hstore,address public.hstore,extratags public.hstore,geometry geometry(GEOMETRY, 4326) NOT NULL
)CREATE TABLE public.placex (place_id int8 NOT NULL,parent_place_id int8,linked_place_id int8,importance float8,indexed_date timestamp(6),geometry_sector int4,rank_address int2,rank_search int2,partition int2,indexed_status int2,osm_type char(1) COLLATE pg_catalog.default NOT NULL,osm_id int8 NOT NULL,class text COLLATE pg_catalog.default NOT NULL,type text COLLATE pg_catalog.default NOT NULL,admin_level int2,name public.hstore,address public.hstore,extratags public.hstore,geometry geometry(GEOMETRY, 4326) NOT NULL,wikipedia text COLLATE pg_catalog.default,token_info jsonb,country_code varchar(2) COLLATE pg_catalog.default,housenumber text COLLATE pg_catalog.default,postcode text COLLATE pg_catalog.default,centroid geometry(GEOMETRY, 4326)
)
;N-2、相关资料 描述地址OSM 官网https://www.openstreetmap.orgOSM官方对中国地图的描述https://wiki.openstreetmap.org/wiki/Zh-hans:%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD数据标签查询https://taginfo.openstreetmap.orgNominatim 地址解析APIhttps://nominatim.org/release-docs/develop/api/Search/Nominatim 逆地址解析APIhttps://nominatim.org/release-docs/develop/api/Reverse/Nominatim docker安装地址https://github.com/mediagis/nominatim-docker/tree/master/4.4官网API查询数据没有 level5问题https://github.com/osm-search/Nominatim/issues/3437官方说明只能导入 pbf、osm 格式https://github.com/osm-search/Nominatim/discussions/3436pbf、bz2、shp.zip 数据格式含义https://download.geofabrik.de/technical.html数据源https://download.geofabrik.de/asia.html福建省数据不是很准数据源https://download3.bbbike.org/osm/garmin/region/asia/china/ Nominatim不支持map和img格式数据源https://osmtoday.com/asia.html 数据不全部分数据有问题数据源https://download.openstreetmap.fr/extracts/asia/china-latest.osm.pbf数据不全部分数据有问题百度提供的在线经纬度获取https://api.map.baidu.com/lbsapi/getpoint/index.html经纬度在线解析https://www.zaixianjisuan.com/dilicesuan/wkt%20_%20wkb%20_%20geojson%20convert%20online.html其它阅读https://wiki.openstreetmap.org/wiki/Zh-hans:Planet.osm https://www.chinaflier.com/thread-202695-1-1.html https://github.com/osm-search/Nominatim/discussions/3434  N-3、测试覆盖 我此次的需求只需要精确到 省、市直接用GPT列举出全部的市级以上的数据然后再自己每个省份描点经纬度100个再让GPT生成随机每个省的经纬度 1000个。
让自建API和腾讯API进行对比问题如下 地址解析
香港、澳门腾讯的是带了 【行政区】 后缀且存在部分的繁体字台湾 腾讯返回的都是简体字自建地图大部分数据返回的是繁体字 逆地址解析
入参自建腾讯百度110.39119,20.091971{longitude110.3715545, latitude20.0748919, nation‘中国’, province‘海南省’, city‘海口市’}{nation‘中国’, province‘中国区域’, city‘’, district‘’, street‘’}海南省海口市美兰区101.808916,36.653178{longitude101.8128242, latitude36.649104, nation‘中国’, province‘青海省’, city‘西宁市’}{nation‘中国’, province‘青海省’, city‘海东市’, district‘互助土族自治县’, street‘’}青海省西宁市城北区91.276412,29.525961{longitude91.4130822, latitude29.2551346, nation‘中国’, province‘西藏自治区’, city‘山南市’}{nation‘中国’, province‘西藏自治区’, city‘拉萨市’, district‘城关区’, street‘’}西藏自治区山南市扎囊县113.795412,34.887975{longitude113.7888121, latitude34.921496, nation‘中国’, province‘河南省’, city‘新乡市’}{nation‘中国’, province‘河南省’, city‘郑州市’, district‘惠济区’, street‘’}河南省郑州市惠济区112.12054,40.707765{longitude112.120318174164, latitude40.71081296482041, nation‘中国’, province‘内蒙古自治区’, city‘乌兰察布市’}{nation‘中国’, province‘内蒙古自治区’, city‘呼和浩特市’, district‘赛罕区’, street‘’}内蒙古自治区呼和浩特市赛罕区113.273535,27.875086{longitude113.7001702, latitude28.2178951, nation‘中国’, province‘湖南省’, city‘长沙市’}{nation‘中国’, province‘湖南省’, city‘株洲市’, district‘荷塘区’, street‘’}湖南省株洲市荷塘区X004(宋芷路)101.885386,36.529808{longitude101.9975, latitude36.399977, nation‘中国’, province‘青海省’, city‘海东市’}{nation‘中国’, province‘青海省’, city‘西宁市’, district‘湟中区’, street‘’}青海省西宁市湟中区121.827422,24.73118{longitude120.9820179, latitude23.9739374, nation‘中国’, province‘臺灣’, city‘臺灣’}{nation‘中国’, province‘台湾省’, city‘宜兰县’, district‘壮围乡’, street‘’}台湾省宜兰县 结论
1.现在的亚洲的数据和官网几乎一样 2.和腾讯比也只有很少边界的地方存在误差
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85389.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!