<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="format-detection" content="telephone=no" />
<meta id="viewPorts" name="viewport" content="width=device-width">
<title>定位测试</title>
</head>
<body>
<div class="wrap">
<div class="box">
<div class="phtxt"><img src="__STATIC_PATH__/images/bftxt.png"></div>
<div class="baifang">
<form class="baifangform" id="baifangform" action="">
<p>
<label><font>*</font>地理位置</label>
<span class="area" id="show_address">地理位置正在获取中···</span>
<input type="hidden" name="province" value="" />
<input type="hidden" name="city" value="" />
<input type="hidden" name="district" value="" />
<input type="hidden" name="address" value="" />
<input type="hidden" name="lng" value="" />
<input type="hidden" name="lat" value="" />
</p>
<p class="btn">
<input type="button" onclick="submitData()" value="立即提交" />
</p>
</form>
</div>
</div>
</div>
</body>
<div style="display: none" id="allmap"></div>
<input type="hidden" name="deviceType" value="{$deviceType}" />
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript" src="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=*****"></script>
<script type="text/javascript" src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=*****"></script>
<script>
//微信公众号参数
wx.config({
debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId : '{$signPackage.appId}', // 必填,公众号的唯一标识
timestamp : '{$signPackage.timestamp}', // 必填,生成签名的时间戳
nonceStr : '{$signPackage.nonceStr}', // 必填,生成签名的随机串
signature : '{$signPackage.signature}',// 必填,签名,见附录1
jsApiList : ['getLocation','getLocalImgData']
});
//腾讯定位配置
var geolocation = new qq.maps.Geolocation("*****",'auth_zhao');
var options = {timeout: 8000,failTipFlag:true};
/**
* 获取定位
*/
function getAddress() {
var deviceType = $("input[name='deviceType']").val();
if(deviceType == 'android'){
getWxAddress();
}else{
geolocation.getLocation(getQQAddress, getWxAddress, options);
}
}
/**
* 腾讯定位
*/
function getQQAddress(position){
//alert('腾讯定位');alert(JSON.stringify(position));
if(position.addr){
$("input[name='province']").val(position.province);
$("input[name='city']").val(position.city);
$("input[name='district']").val(position.district);
$("input[name='address']").val(position.addr);
$("input[name='lng']").val(position.lng);
$("input[name='lat']").val(position.lat);
//补全市县信息
if(position.addr.indexOf(position.district) == -1){
position.addr = position.district + position.addr
}
if(position.addr.indexOf(position.city) == -1){
position.addr = position.city + position.addr
}
$("#show_address").html(position.addr);
}else{
getWxAddress();
}
}
/**
* 微信公众号定位【微信公众号api】
*/
function getWxAddress() {
wx.getLocation({
type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
//alert(JSON.stringify(res));
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
/************************微信定位GPS坐标转百度坐标START【百度api功能】************************/
var ggPoint = new BMapGL.Point(longitude,latitude);
//地图初始化
var bm = new BMapGL.Map("allmap");
bm.centerAndZoom(ggPoint, 15);
bm.addControl(new BMapGL.ZoomControl());
//添加gps marker和label
var markergg = new BMapGL.Marker(ggPoint);
bm.addOverlay(markergg); //添加GPS marker
var labelgg = new BMapGL.Label("未转换的GPS坐标(错误)",{offset:new BMapGL.Size(10, -10)});
markergg.setLabel(labelgg); //添加GPS label
//坐标转换完之后的回调函数
translateCallback = function (data){
var newPoint = JSON.stringify(data);
//坐标转换
var postData = {
newPoint:newPoint
};
$.ajax({
url : "{:U('visit/getNewPoint')}",
data : postData,
type : "POST",
success:function(data){
ajaxGetBaiDuAddress(data.longitude,data.latitude)
}
});
return false;
};
setTimeout(function(){
var convertor = new BMapGL.Convertor();
var pointArr = [];
pointArr.push(ggPoint);
convertor.translate(pointArr, COORDINATES_WGS84, COORDINATES_BD09, translateCallback)
}, 100);
/**
* 坐标常量说明:
* COORDINATES_WGS84 = 1, WGS84坐标
* COORDINATES_WGS84_MC = 2, WGS84的平面墨卡托坐标
* COORDINATES_GCJ02 = 3,GCJ02坐标
* COORDINATES_GCJ02_MC = 4, GCJ02的平面墨卡托坐标
* COORDINATES_BD09 = 5, 百度bd09经纬度坐标
* COORDINATES_BD09_MC = 6,百度bd09墨卡托坐标
* COORDINATES_MAPBAR = 7,mapbar地图坐标
* COORDINATES_51 = 8,51地图坐标
*/
/************************微信定位GPS坐标转百度坐标END【百度api功能】************************/
}
});
}
/**
* 用所定位的经纬度查找所在地省市街道等信息【百度api功能】
*/
function ajaxGetBaiDuAddress(longitude,latitude) {
var point = new BMap.Point(longitude,latitude);
var gc = new BMap.Geocoder();
gc.getLocation(point, function (rs) {
var addressData = JSON.stringify(rs);
var deviceType = $("input[name='deviceType']").val();
var postData = {
addressData:addressData,
deviceType:deviceType,
serverType:'baidu'
};
$.ajax({
url : "{:U('visit/getAddress')}",
data : postData,
type : "POST",
success:function(data){
if(data.status) {
$("input[name='province']").val(data.province);
$("input[name='city']").val(data.city);
$("input[name='district']").val(data.district);
$("input[name='address']").val(data.address);
$("input[name='lng']").val(data.lng);
$("input[name='lat']").val(data.lat);
$("#show_address").html(data.address);
}else{
TenCentApi(latitude,longitude);
}
}
});
});
}
/**
* 腾讯位置服务 WebService API
* 逆地址解析
* @param lat
* @param lng
* 逆地址解析
*/
function TenCentApi(lat,lng) {
var postData = {
lat:lat,
lng:lng,
};
$.ajax({
url : "{:U('Visit/tenCent')}",
data : postData,
type : "POST",
success:function(data){
if(data.status) {
$("input[name='province']").val(data.province);
$("input[name='city']").val(data.city);
$("input[name='district']").val(data.district);
$("input[name='address']").val(data.address);
$("input[name='lng']").val(data.lng);
$("input[name='lat']").val(data.lat);
$("#show_address").html(data.address);
}else{
layer_alert(data.message);
}
}
});
}
getAddress();
</script>
</html>
<?php
namespace Mobile\Controller;
class VisitController extends BaseController {
/**
* 拜访日志- 此页面中定位
*/
public function index(){
$deviceType = $this->getDeviceType();
$this->assign('deviceType',$deviceType);
$this->assign('seo_title','拜访日志');
$this->display();
}
/**
* 微信获取的GPS定位坐标转为百度坐标
* 此方法只是为了数据格式转换
*/
public function getNewPoint(){
try{
$param = I('param.');
$newPoint = $param['newPoint'];
$res = json_decode(htmlspecialchars_decode($newPoint),true);
$point = $res['points'][0];
$lng = $point['lng'];
$lat = $point['lat'];
$return['longitude'] = $lng;
$return['latitude'] = $lat;
$this->ajaxReturn($return);
}catch (\Exception $e){
$errorMsg = $e->getCode() == 50001 ? $e->getMessage() : '请求失败';
$return['status'] = 0;
$return['message'] = $errorMsg;
$this->ajaxReturn($return);
}
}
/**
* web端经纬度解析地址数据格式化
* 此方法只是为了数据格式转换
*/
public function getAddress(){
try{
$param = I('param.');
$addressData = $param['addressData'];
$res = json_decode(htmlspecialchars_decode($addressData),true);
$serverType = $param['serverType'] == 'baidu' ? 'baidu_' : 'tencent_';
if($param['deviceType'] == 'android'){
file_put_contents('map_android/'.$serverType.'map_android_'.$this->UID.'.txt',var_export($res,true));
}else{
file_put_contents('map_ios/'.$serverType.'map_ios_'.$this->UID.'.txt',var_export($res,true));
}
if($res['type'] == 'GEO_INFO'){//腾讯位置服务
$point = $res['detail']['location'];
$lng = $point['lng'];
$lat = $point['lat'];
$addressComponents = $res['detail']['addressComponents'];
$province = $addressComponents['province'];
$city = $addressComponents['city'];
$district = $addressComponents['district'];
$address = $res['detail']['address'];
}else{//百度位置服务
$point = $res['point'];
$lng = $point['lng'];
$lat = $point['lat'];
$addressComponents = $res['addressComponents'];
$province = $addressComponents['province'];
$city = $addressComponents['city'];
$district = $addressComponents['district'];
$surroundingPois = $res['surroundingPois'];
$address = $surroundingPois[0]['address'];
if(!$address){
throw new \Exception('百度未获取到详细位置',50001);
}
//补全地址中的市县信息
if(strpos($address,$district) === false){
$address = $district.$address;
}
if(strpos($address,$city) === false){
$address = $city.$address;
}
}
//统一数据返回
$return['status'] = 1;
$return['province'] = $province;
$return['city'] = $city;
$return['district'] = $district;
$return['lng'] = $lng;
$return['lat'] = $lat;
$return['address'] = $address;
$this->ajaxReturn($return);
}catch (\Exception $e){
$errorMsg = $e->getCode() == 50001 ? $e->getMessage() : '请求失败';
$return['status'] = 0;
$return['message'] = $errorMsg;
$this->ajaxReturn($return);
}
}
/**
* 腾讯位置服务 WebService API
* 逆地址解析
* https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder#2
*/
public function tenCent(){
$ApiUrl = 'https://apis.map.qq.com/ws/geocoder/v1/?';
$key = '*****';
$param = I('param.');
//经纬度(GCJ02坐标系),格式:location=lat<纬度>,lng<经度>
$location = $param['lat'].','.$param['lng'];
//是否返回周边地点(POI)列表,可选值:0 不返回(默认) 1 返回
$get_poi = 1;
//用于控制POI列表
$poi_options = 'address_format=short;radius=1000;page_size=20;page_index=1;policy=2';
$strIng = 'location='.$location.'&key='.$key.'&get_poi='.$get_poi.'&poi_options='.$poi_options;
$requestUrl = $ApiUrl.$strIng;
$res = curl_get($requestUrl);
$res = json_decode($res,true);
file_put_contents('mapData/map_'.$this->UID.'.txt',var_export($res,true));
if($res['status'] == 0){
$province = $res['result']['address_component']['province'];
$city = $res['result']['address_component']['city'];
$district = $res['result']['address_component']['district'];
$address = $res['result']['formatted_addresses']['recommend'];
$address = $address ? $address : $res['result']['address'];
//补全地址中的市县信息
if(strpos($address,$district) === false){
$address = $district.$address;
}
if(strpos($address,$city) === false){
$address = $city.$address;
}
//统一数据返回
$return['status'] = 1;
$return['province'] = $province;
$return['city'] = $city;
$return['district'] = $district;
$return['lng'] = $param['lng'];
$return['lat'] = $param['lat'];
$return['address'] = $address;
$this->ajaxReturn($return);
}else{
//统一数据返回
$return['status'] = 0;
$this->ajaxReturn($return);
}
}
/**
* 判断安卓IOS
*/
function getDeviceType(){
$agent = strtolower($_SERVER['HTTP_USER_AGENT']);
$type = 'other';
if(strpos($agent, 'iphone') || strpos($agent, 'ipad')){
$type = 'ios';
}else if(strpos($agent, 'android')) {
$type = 'android';
}
return $type;
}
}