经纬度与地址互转
本模块基于 BuildAdmin 提供正向地理编码、逆地理编码能力。支持高德、百度、腾讯地图接入以及本地部署服务(本地部署仅支持经纬度转省市区)。

介绍

本模块基于 BuildAdmin 提供正向地理编码、逆地理编码能力。支持高德、百度、腾讯地图接入以及本地部署服务(本地部署仅支持经纬度转省市区)。

使用场景包括不限于:

  • 地址转经纬度场景,如用户输入地址,需要获取该地址的经纬度。

  • 经纬度转地址场景,如用户上传了一个位置,需要获取该位置的详细地址信息。

  • 经纬度转省市区用量特别大的场景,三大地图平台有额度限制,本模块提供了本地部署服务,免费高效。

  • 经常更换地图平台但是不想修改代码的场景,本模块提供了统一的接口,只需要在配置中切换平台即可。

模块能力:

  • 高德、百度、腾讯平台地址转经纬度
  • 高德、百度、腾讯平台经纬度转地址
  • 本地部署经纬度转省市区
  • WGS84、GCJ02、BD09 坐标系转换

安装后包含内容

  • 后台增加菜单:常规管理 -> 地理编码配置
  • 数据库config表增加配置项

平台配置说明

本地部署

注意事项

  • 本地部署服务仅支持经纬度转省市区,如107.399482,33.653499可转换为陕西省宝鸡市太白县
  • 暂不支持地址转经纬度。

获取服务

  • 一键下载:在后台常规管理 -> 地理编码配置中,平台切换到本地部署,选择服务器环境点击下载服务按钮,等待下载完成后点击刷新按钮查看已下载服务,下载过程会持续1-2分钟左右
  • 手动下载:在本地部署配置页,点开页面底部的服务下载说明,可根据实际服务器环境点击下载链接进行下载。手动下载后,将服务程序放置到/modules/geocoding/services/目录下
  • /modules/geocoding/services/geocoding.go文件为本地GEO服务的源码,感兴趣可自行编译

运行

  • Windows环境运行服务:

    • 进入目录/modules/geocoding/services/双击运行[实际服务文件名].exe文件
    • 指定端口:在系统环境变量中新建一个变量,变量名为GEO_PORT,变量值为自定义端口号
    • 配置Key:在系统环境变量中新建一个变量,变量名为GEO_KEY,变量值为自定义的Key
    • 修改后需要重新运行服务才会生效,配置项中的请求地址也需要重新配置
  • Linux环境运行服务:

    • 进入目录/modules/geocoding/services/,执行命令./geocoding启动服务,此执行方式为临时调试使用,生产环境建议使用服务管理工具(如systemd、supervisor等)管理服务
    • 指定端口:在系统环境变量中添加GEO_PORT=自定义端口号,也可以在命令前添加GEO_PORT=自定义端口号,如:GEO_PORT=9512 ./geocoding
    • 配置Key:在系统环境变量中添加GEO_KEY=自定义Key,也可以在命令前添加GEO_KEY=自定义Key,如:GEO_KEY=xxxxxx ./geocoding
    • 同时修改端口和Key: GEO_PORT=9513 GEO_KEY=xxxxxx ./geocoding
    • 修改后需要重新运行服务才会生效,配置项中的请求地址也需要重新配置
    • 如果运行报错permission denied是因为文件没有执行权限,可执行chmod +x ./geocoding命令添加权限

配置项

  • 请求地址:本地GEO服务请求地址,默认值为http://localhost:9511,需根据实际情况修改
  • Key:本地GEO服务签名Key,默认值会在程序安装时写入到配置项中

高德地图

申请应用

在高德地图控制台应用管理中申请应用,申请信息根据实际情况填写,服务平台需选择Web服务

配置项

  • Key:应用管理列表中获取Key。
  • 开启数字签名:应用设置中,权限:数字签名若开启,则本配置项也要设为开启状态。
  • 私钥:应用设置中获取私钥,若开启了数字签名,本配置项必填

百度地图

创建应用

在百度地图控制台我的应用中创建应用,创建信息根据实际情况填写,应用类型需选择服务端,启用服务需勾选地理编码逆地理编码

配置项

  • AK:我的应用中获取访问应用(AK)

腾讯地图

创建应用

在腾讯地图控制台我的应用中创建应用,创建信息根据实际情况填写,需勾选WebServiceAPI

配置项

  • Key:我的应用中获取Key
  • 开启签名校验:应用编辑中,若选中签名校验,则本配置项也要设为开启状态。
  • Secret key( SK ):应用编辑中获取Secret key( SK ),若开启了签名校验,本配置项必填。

统一接口使用方法

经纬度转地址

快速获取地址信息

方法:Geo::lnglatToAddress(),等价写法Geo::L2A()

  • 参数1:经度
  • 参数2:纬度
  • 参数3:格式化地址信息,格式化标签:
    • 省份:{province}
    • 城市:{city}
    • 区县:{district}
    • 区域编码:{adcode}
    • 街道:{street}
    • 街道编码:{streetCode}
    • 社区:{neighborhood}
  • 参数4:输入经纬度的坐标系,当前方法默认接收GCJ02(高德、腾讯地图等)坐标系,若经纬度来源为百度地图、GPS、北斗等其它坐标系,转换的地址会有偏差。可选值为 GCJ02WGS84BD09,详见坐标系转换说明
php 复制代码
use modules\geocoding\library\Geo;

// 返回:河北省邯郸市肥乡区北高镇旧店乡派出所艺达小学警卫室
$address = Geo::lnglatToAddress(114.916718, 36.633492);
// 等价写法,L2A 为 lnglatToAddress 的别名
$address = Geo::L2A(114.916718, 36.633492);

// 格式化地址信息
$address = Geo::L2A(114.916718, 36.633492, '{province}/{city}/{district}'); //返回:河北省/邯郸市/肥乡区

$address = Geo::L2A(114.916718, 36.633492, '{province}-{city}-{district}'); //返回:河北省-邯郸市-肥乡区

// 若输入的经纬度来源为百度地图,需要指定坐标系为 BD09
$address = Geo::L2A(114.916718, 36.633492, null, Geo::COORDSYS_BD09); //返回:河北省/邯郸市/肥乡区

通过实例获取更多信息

获取实例方法Geo::getL2AInstance()

实例化参数:

  • 参数1:经度
  • 参数2:纬度
  • 参数3:可选参数,输入经纬度的坐标系,当前方法默认接收GCJ02(高德、腾讯地图等)坐标系,若经纬度来源为百度地图、GPS、北斗等其它坐标系,转换的地址会有偏差。可选值为 GCJ02WGS84BD09,详见坐标系转换说明
  • 参数4:可选参数,额外请求参数,键值对数组格式,用于向第三方接口传递额外的请求参数
php 复制代码
use modules\geocoding\library\Geo;

// 获取地址转经纬度服务类实例(\modules\geocoding\library\LnglatToAddress)
$L2AInstance = Geo::getL2AInstance(114.916718, 36.633492);

// 获取完整地址信息
$address = $L2AInstance->getAddress(); //返回:河北省邯郸市肥乡区北高镇旧店乡派出所艺达小学警卫室

// 格式化地址信息,格式化标签:{province}=省份、{city}=城市、{district}=区县、{adcode}=区域编码、{street}=街道、{neighborhood}=社区、{streetCode}=街道编码
$address = $L2AInstance->getAddress('{province}/{city}/{district}'); //返回:河北省/邯郸市/肥乡区

// 获取省份
$province = $L2AInstance->getProvince();
// 获取城市
$city = $L2AInstance->getCity();
// 获取区县
$district = $L2AInstance->getDistrict();
// 获取街道
$street = $L2AInstance->getStreet();
// 获取区域编码
$adcode = $L2AInstance->getAdcode();
// 获取街道编码
$streetCode = $L2AInstance->getStreetCode();

// 获取第三方接口原始信息
$originData = $L2AInstance->getOriginData();
// 等价写法
$originData = $L2AInstance->getData();

经纬度转地区

方法:Geo::lnglatToRegion(),等价写法Geo::L2R()

  • 参数1:经度
  • 参数2:纬度
  • 参数3:省、市、区之间的连接符,默认空格
  • 参数4:输入经纬度的坐标系,当前方法默认接收GCJ02(高德、腾讯地图等)坐标系,若经纬度来源为百度地图、GPS、北斗等其它坐标系,转换结果会有偏差。可选值为 GCJ02WGS84BD09,详见坐标系转换说明
php 复制代码
use modules\geocoding\library\Geo;

// 返回:河北省 邯郸市 肥乡区
$region = Geo::lnglatToRegion(114.916718, 36.633492);
// 等价写法,L2R 为 lnglatToRegion 的别名
$region = Geo::L2R(114.916718, 36.633492);

// 自定义地区连接符
$region = Geo::L2R(114.916718, 36.633492, '/'); //返回:河北省/邯郸市/肥乡区
$region = Geo::L2R(114.916718, 36.633492, '-'); //返回:河北省-邯郸市-肥乡区

// 若输入的经纬度来源为百度地图,需要指定坐标系为 BD09
$region = Geo::L2R(114.916718, 36.633492, '/', Geo::COORDSYS_BD09); //返回:河北省/邯郸市/肥乡区

地址转经纬度

快速获取经纬度

方法:Geo::addressToLnglat(),等价写法Geo::A2L()

  • 参数1:地址字符串
  • 参数2:返回经纬度的坐标系,默认返回GCJ02(高德、腾讯地图等)坐标系。可选值为 GCJ02WGS84BD09,详见坐标系转换说明
php 复制代码
use modules\geocoding\library\Geo;

// 返回 GCJ02 坐标系经纬度
[$lng, $lat] = Geo::addressToLnglat('北京市东城区东华门街道');
// 等价写法
[$lng, $lat] = Geo::A2L('北京市东城区东华门街道');

// 返回 WGS84 坐标系经纬度
[$lng, $lat] = Geo::A2L('北京市东城区东华门街道', Geo::COORDSYS_WGS84);

// 返回 BD09 坐标系经纬度
[$lng, $lat] = Geo::A2L('北京市东城区东华门街道', Geo::COORDSYS_BD09);

通过实例获取更多信息

获取实例方法Geo::getA2LInstance()

实例化参数:

  • 参数1:地址字符串
  • 参数2:可选参数,返回经纬度的坐标系,默认返回GCJ02(高德、腾讯地图等)坐标系。可选值为 GCJ02WGS84BD09,详见坐标系转换说明
  • 参数3:可选参数,额外请求参数,键值对数组格式,用于向第三方接口传递额外的请求参数
php 复制代码
use modules\geocoding\library\Geo;

// 获取地址转经纬度服务类实例
$A2LInstance = Geo::getA2LInstance('北京市东城区东华门街道');

// 获取经纬度
[$lng, $lat] = $A2LInstance->getLnglat();

// 获取第三方接口返回的原始信息,返回的数组,部分平台会返回多个匹配结果
$raw = $A2LInstance->getOriginData();

// 获取第三方接口返回的原始信息,取第一个匹配结果,正常情况直接使用这个就好
$raw = $A2LInstance->getData();

坐标系转换

支持的坐标系

  • WGS84:国际通用坐标系,如 GPS、北斗、OpenStreetMap、谷歌海外地图等
  • GCJ02:火星坐标系,如高德地图、腾讯地图等国内常见地图平台
  • BD09:百度坐标系,百度地图在GCJ02基础上再次加密后的坐标系

模块中默认使用的坐标系为GCJ02,相关常量定义在CoordinateSystem.php中:

php 复制代码
use modules\geocoding\library\CoordinateSystem;

CoordinateSystem::COORDSYS_WGS84;
CoordinateSystem::COORDSYS_GCJ02;
CoordinateSystem::COORDSYS_BD09;

支持的转换方法

CoordinateSystem.php当前内置以下 4 个直接转换方法:

  • wgs84togcj02($lng, $lat)WGS84GCJ02
  • gcj02towgs84($lng, $lat)GCJ02WGS84
  • gcj02tobd09($lng, $lat)GCJ02BD09
  • bd09togcj02($lng, $lat)BD09GCJ02

说明:

  • 当前未直接提供WGS84BD09互转方法,如需转换,可通过GCJ02中转。
  • 方法返回值均为数组格式:[$lng, $lat]

使用示例

php 复制代码
use modules\geocoding\library\CoordinateSystem;

$coords = new CoordinateSystem();

// WGS84 转 GCJ02
[$lng, $lat] = $coords->wgs84togcj02(114.916718, 36.633492);

// GCJ02 转 WGS84
[$lng, $lat] = $coords->gcj02towgs84(116.403988, 39.914266);

// GCJ02 转 BD09
[$lng, $lat] = $coords->gcj02tobd09(116.403988, 39.914266);

// BD09 转 GCJ02
[$lng, $lat] = $coords->bd09togcj02(116.410369, 39.920237);

注意事项

  • 逆地理编码、地理编码时若传错坐标系,结果会出现明显偏移,因此应先确认经纬度来源平台。
  • 若坐标点不在中国范围内,转换方法会直接返回原始经纬度,不做偏移处理。
  • GCJ02WGS84采用常见反算方式,结果可满足大多数业务场景;如对测绘级精度有更高要求,建议结合专业 GIS 工具进一步校验。

更新日志

  • 2026-03-14 16:58:19

    v1.0.0

    首次发布

    无详细更新日志

fenglei
fenglei
这家伙很懒,什么也没写~
模块授权
正版授权,允许商业使用
免费更新至一年内发布的所有版本
一年内发布的所有版本永久免费下载
不加密源代码,私有部署,二开方便
可复制产品,不支持七天无理由退款
禁止转售、分享等任何形式的再分发
仅 BuildAdmin 后台管理系统可以使用
模块信息
模块价格
¥9.90
访问次数
194
模块标识
geocoding
下载次数
1
模块分类
第三方整合
上次更新
2026-03-14 16:58:19
开发者主页
-
购买送积分
-
新品上架TypeScript纯手写