259 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			259 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| 
								 | 
							
								<!DOCTYPE html>
							 | 
						|||
| 
								 | 
							
								<html>
							 | 
						|||
| 
								 | 
							
								<head>
							 | 
						|||
| 
								 | 
							
								    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
							 | 
						|||
| 
								 | 
							
								    <title>地址选择器</title>
							 | 
						|||
| 
								 | 
							
								    <link rel="stylesheet" href="__CDN__/assets/css/frontend.min.css"/>
							 | 
						|||
| 
								 | 
							
								    <link rel="stylesheet" href="__CDN__/assets/libs/font-awesome/css/font-awesome.min.css"/>
							 | 
						|||
| 
								 | 
							
								    <style type="text/css">
							 | 
						|||
| 
								 | 
							
								        body {
							 | 
						|||
| 
								 | 
							
								            margin: 0;
							 | 
						|||
| 
								 | 
							
								            padding: 0;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        #container {
							 | 
						|||
| 
								 | 
							
								            position: absolute;
							 | 
						|||
| 
								 | 
							
								            left: 0;
							 | 
						|||
| 
								 | 
							
								            top: 0;
							 | 
						|||
| 
								 | 
							
								            right: 0;
							 | 
						|||
| 
								 | 
							
								            bottom: 0;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        .confirm {
							 | 
						|||
| 
								 | 
							
								            position: absolute;
							 | 
						|||
| 
								 | 
							
								            bottom: 30px;
							 | 
						|||
| 
								 | 
							
								            right: 4%;
							 | 
						|||
| 
								 | 
							
								            z-index: 99;
							 | 
						|||
| 
								 | 
							
								            height: 50px;
							 | 
						|||
| 
								 | 
							
								            width: 50px;
							 | 
						|||
| 
								 | 
							
								            line-height: 50px;
							 | 
						|||
| 
								 | 
							
								            font-size: 15px;
							 | 
						|||
| 
								 | 
							
								            text-align: center;
							 | 
						|||
| 
								 | 
							
								            background-color: white;
							 | 
						|||
| 
								 | 
							
								            background: #1ABC9C;
							 | 
						|||
| 
								 | 
							
								            color: white;
							 | 
						|||
| 
								 | 
							
								            border: none;
							 | 
						|||
| 
								 | 
							
								            cursor: pointer;
							 | 
						|||
| 
								 | 
							
								            border-radius: 50%;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        .search {
							 | 
						|||
| 
								 | 
							
								            position: absolute;
							 | 
						|||
| 
								 | 
							
								            width: 400px;
							 | 
						|||
| 
								 | 
							
								            top: 0;
							 | 
						|||
| 
								 | 
							
								            left: 50%;
							 | 
						|||
| 
								 | 
							
								            padding: 5px;
							 | 
						|||
| 
								 | 
							
								            margin-left: -200px;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        .amap-marker-label {
							 | 
						|||
| 
								 | 
							
								            border: 0;
							 | 
						|||
| 
								 | 
							
								            background-color: transparent;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        .info {
							 | 
						|||
| 
								 | 
							
								            padding: .75rem 1.25rem;
							 | 
						|||
| 
								 | 
							
								            margin-bottom: 1rem;
							 | 
						|||
| 
								 | 
							
								            border-radius: .25rem;
							 | 
						|||
| 
								 | 
							
								            position: fixed;
							 | 
						|||
| 
								 | 
							
								            top: 2rem;
							 | 
						|||
| 
								 | 
							
								            background-color: white;
							 | 
						|||
| 
								 | 
							
								            width: auto;
							 | 
						|||
| 
								 | 
							
								            min-width: 22rem;
							 | 
						|||
| 
								 | 
							
								            border-width: 0;
							 | 
						|||
| 
								 | 
							
								            left: 1.8rem;
							 | 
						|||
| 
								 | 
							
								            box-shadow: 0 2px 6px 0 rgba(114, 124, 245, .5);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    </style>
							 | 
						|||
| 
								 | 
							
								</head>
							 | 
						|||
| 
								 | 
							
								<body>
							 | 
						|||
| 
								 | 
							
								<div class="search">
							 | 
						|||
| 
								 | 
							
								    <div class="input-group">
							 | 
						|||
| 
								 | 
							
								        <input type="text" id="place" name="q" class="form-control" placeholder="输入地点"/>
							 | 
						|||
| 
								 | 
							
								        <span class="input-group-btn">
							 | 
						|||
| 
								 | 
							
								            <button type="submit" name="search" id="search-btn" class="btn btn-success">
							 | 
						|||
| 
								 | 
							
								                <i class="fa fa-search"></i>
							 | 
						|||
| 
								 | 
							
								            </button>
							 | 
						|||
| 
								 | 
							
								        </span>
							 | 
						|||
| 
								 | 
							
								    </div>
							 | 
						|||
| 
								 | 
							
								</div>
							 | 
						|||
| 
								 | 
							
								<div class="confirm">确定</div>
							 | 
						|||
| 
								 | 
							
								<div id="container"></div>
							 | 
						|||
| 
								 | 
							
								<script type="text/javascript">
							 | 
						|||
| 
								 | 
							
								    window._AMapSecurityConfig = {
							 | 
						|||
| 
								 | 
							
								        securityJsCode: "{$config.amapsecurityjscode|default=''}",
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								</script>
							 | 
						|||
| 
								 | 
							
								<script type="text/javascript" src="//webapi.amap.com/maps?v=1.4.11&key={$config.amapkey|default=''}&plugin=AMap.ToolBar,AMap.Autocomplete,AMap.PlaceSearch,AMap.Geocoder"></script>
							 | 
						|||
| 
								 | 
							
								<!-- UI组件库 1.0 -->
							 | 
						|||
| 
								 | 
							
								<script src="//webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
							 | 
						|||
| 
								 | 
							
								<script src="__CDN__/assets/libs/jquery/dist/jquery.min.js"></script>
							 | 
						|||
| 
								 | 
							
								<script src="__CDN__/assets/addons/address/js/gcoord.min.js"></script>
							 | 
						|||
| 
								 | 
							
								<script type="text/javascript">
							 | 
						|||
| 
								 | 
							
								    $(function () {
							 | 
						|||
| 
								 | 
							
								        var as, map, geocoder, address, fromtype, totype;
							 | 
						|||
| 
								 | 
							
								        address = "{$address|htmlentities}";
							 | 
						|||
| 
								 | 
							
								        var lng = Number("{$lng}");
							 | 
						|||
| 
								 | 
							
								        var lat = Number("{$lat}");
							 | 
						|||
| 
								 | 
							
								        fromtype = "GCJ02";
							 | 
						|||
| 
								 | 
							
								        totype = "{$config.coordtype|default='DEFAULT'}"
							 | 
						|||
| 
								 | 
							
								        totype = totype === 'DEFAULT' ? "GCJ02" : totype;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if (lng && lat && fromtype !== totype) {
							 | 
						|||
| 
								 | 
							
								            var result = gcoord.transform([lng, lat], gcoord[totype], gcoord[fromtype]);
							 | 
						|||
| 
								 | 
							
								            lng = result[0] || lng;
							 | 
						|||
| 
								 | 
							
								            lat = result[1] || lat;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        var init = function () {
							 | 
						|||
| 
								 | 
							
								            AMapUI.loadUI(['misc/PositionPicker', 'misc/PoiPicker'], function (PositionPicker, PoiPicker) {
							 | 
						|||
| 
								 | 
							
								                //加载PositionPicker,loadUI的路径参数为模块名中 'ui/' 之后的部分
							 | 
						|||
| 
								 | 
							
								                map = new AMap.Map('container', {
							 | 
						|||
| 
								 | 
							
								                    zoom: parseInt('{$zoom}'),
							 | 
						|||
| 
								 | 
							
								                    center: [lng, lat]
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                geocoder = new AMap.Geocoder({
							 | 
						|||
| 
								 | 
							
								                    radius: 1000 //范围,默认:500
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                var positionPicker = new PositionPicker({
							 | 
						|||
| 
								 | 
							
								                    mode: 'dragMarker',//设定为拖拽地图模式,可选'dragMap'、'dragMarker',默认为'dragMap'
							 | 
						|||
| 
								 | 
							
								                    map: map//依赖地图对象
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                //输入提示
							 | 
						|||
| 
								 | 
							
								                var autoOptions = {
							 | 
						|||
| 
								 | 
							
								                    input: "place"
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                var relocation = function (lnglat, addr) {
							 | 
						|||
| 
								 | 
							
								                    lng = lnglat.lng;
							 | 
						|||
| 
								 | 
							
								                    lat = lnglat.lat;
							 | 
						|||
| 
								 | 
							
								                    map.panTo([lng, lat]);
							 | 
						|||
| 
								 | 
							
								                    positionPicker.start(lnglat);
							 | 
						|||
| 
								 | 
							
								                    if (addr) {
							 | 
						|||
| 
								 | 
							
								                        // var label = '<div class="info">地址:' + addr + '<br>经度:' + lng + '<br>纬度:' + lat + '</div>';
							 | 
						|||
| 
								 | 
							
								                        var label = '<div class="info">地址:' + addr + '</div>';
							 | 
						|||
| 
								 | 
							
								                        positionPicker.marker.setLabel({
							 | 
						|||
| 
								 | 
							
								                            content: label //显示内容
							 | 
						|||
| 
								 | 
							
								                        });
							 | 
						|||
| 
								 | 
							
								                    } else {
							 | 
						|||
| 
								 | 
							
								                        geocoder.getAddress(lng + ',' + lat, function (status, result) {
							 | 
						|||
| 
								 | 
							
								                            if (status === 'complete' && result.regeocode) {
							 | 
						|||
| 
								 | 
							
								                                var address = result.regeocode.formattedAddress;
							 | 
						|||
| 
								 | 
							
								                                // var label = '<div class="info">地址:' + address + '<br>经度:' + lng + '<br>纬度:' + lat + '</div>';
							 | 
						|||
| 
								 | 
							
								                                var label = '<div class="info">地址:' + address + '</div>';
							 | 
						|||
| 
								 | 
							
								                                positionPicker.marker.setLabel({
							 | 
						|||
| 
								 | 
							
								                                    content: label //显示内容
							 | 
						|||
| 
								 | 
							
								                                });
							 | 
						|||
| 
								 | 
							
								                            } else {
							 | 
						|||
| 
								 | 
							
								                                console.log(JSON.stringify(result));
							 | 
						|||
| 
								 | 
							
								                            }
							 | 
						|||
| 
								 | 
							
								                        });
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								                var auto = new AMap.Autocomplete(autoOptions);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                //构造地点查询类
							 | 
						|||
| 
								 | 
							
								                var placeSearch = new AMap.PlaceSearch({
							 | 
						|||
| 
								 | 
							
								                    map: map
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                //注册监听,当选中某条记录时会触发
							 | 
						|||
| 
								 | 
							
								                AMap.event.addListener(auto, "select", function (e) {
							 | 
						|||
| 
								 | 
							
								                    placeSearch.setCity(e.poi.adcode);
							 | 
						|||
| 
								 | 
							
								                    placeSearch.search(e.poi.name, function (status, result) {
							 | 
						|||
| 
								 | 
							
								                        $(map.getAllOverlays("marker")).each(function (i, j) {
							 | 
						|||
| 
								 | 
							
								                            j.on("click", function () {
							 | 
						|||
| 
								 | 
							
								                                relocation(j.De.position);
							 | 
						|||
| 
								 | 
							
								                            });
							 | 
						|||
| 
								 | 
							
								                        });
							 | 
						|||
| 
								 | 
							
								                    });  //关键字查询查询
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                AMap.event.addListener(map, 'click', function (e) {
							 | 
						|||
| 
								 | 
							
								                    relocation(e.lnglat);
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                //加载工具条
							 | 
						|||
| 
								 | 
							
								                var tool = new AMap.ToolBar();
							 | 
						|||
| 
								 | 
							
								                map.addControl(tool);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                var poiPicker = new PoiPicker({
							 | 
						|||
| 
								 | 
							
								                    input: 'place',
							 | 
						|||
| 
								 | 
							
								                    placeSearchOptions: {
							 | 
						|||
| 
								 | 
							
								                        map: map,
							 | 
						|||
| 
								 | 
							
								                        pageSize: 6 //关联搜索分页
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                poiPicker.on('poiPicked', function (poiResult) {
							 | 
						|||
| 
								 | 
							
								                    poiPicker.hideSearchResults();
							 | 
						|||
| 
								 | 
							
								                    $('.poi .nearpoi').text(poiResult.item.name);
							 | 
						|||
| 
								 | 
							
								                    $('.address .info').text(poiResult.item.address);
							 | 
						|||
| 
								 | 
							
								                    $('#address').val(poiResult.item.address);
							 | 
						|||
| 
								 | 
							
								                    $("#place").val(poiResult.item.name);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    relocation(poiResult.item.location);
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                positionPicker.on('success', function (positionResult) {
							 | 
						|||
| 
								 | 
							
								                    console.log(positionResult);
							 | 
						|||
| 
								 | 
							
								                    as = positionResult.position;
							 | 
						|||
| 
								 | 
							
								                    address = positionResult.address;
							 | 
						|||
| 
								 | 
							
								                    lat = as.lat;
							 | 
						|||
| 
								 | 
							
								                    lng = as.lng;
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                positionPicker.on('fail', function (positionResult) {
							 | 
						|||
| 
								 | 
							
								                    address = '';
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                positionPicker.start();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                if (address) {
							 | 
						|||
| 
								 | 
							
								                    // 添加label
							 | 
						|||
| 
								 | 
							
								                    var label = '<div class="info">地址:' + address + '</div>';
							 | 
						|||
| 
								 | 
							
								                    positionPicker.marker.setLabel({
							 | 
						|||
| 
								 | 
							
								                        content: label //显示内容
							 | 
						|||
| 
								 | 
							
								                    });
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                //点击搜索按钮
							 | 
						|||
| 
								 | 
							
								                $(document).on('click', '#search-btn', function () {
							 | 
						|||
| 
								 | 
							
								                    if ($("#place").val() == '')
							 | 
						|||
| 
								 | 
							
								                        return;
							 | 
						|||
| 
								 | 
							
								                    placeSearch.search($("#place").val(), function (status, result) {
							 | 
						|||
| 
								 | 
							
								                        $(map.getAllOverlays("marker")).each(function (i, j) {
							 | 
						|||
| 
								 | 
							
								                            j.on("click", function () {
							 | 
						|||
| 
								 | 
							
								                                relocation(j.De.position);
							 | 
						|||
| 
								 | 
							
								                            });
							 | 
						|||
| 
								 | 
							
								                        });
							 | 
						|||
| 
								 | 
							
								                    });
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //点击确定后执行回调赋值
							 | 
						|||
| 
								 | 
							
								        var close = function (data) {
							 | 
						|||
| 
								 | 
							
								            var index = parent.Layer.getFrameIndex(window.name);
							 | 
						|||
| 
								 | 
							
								            var callback = parent.$("#layui-layer" + index).data("callback");
							 | 
						|||
| 
								 | 
							
								            //再执行关闭
							 | 
						|||
| 
								 | 
							
								            parent.Layer.close(index);
							 | 
						|||
| 
								 | 
							
								            //再调用回传函数
							 | 
						|||
| 
								 | 
							
								            if (typeof callback === 'function') {
							 | 
						|||
| 
								 | 
							
								                callback.call(undefined, data);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //点击搜索按钮
							 | 
						|||
| 
								 | 
							
								        $(document).on('click', '.confirm', function () {
							 | 
						|||
| 
								 | 
							
								            var zoom = map.getZoom();
							 | 
						|||
| 
								 | 
							
								            var data = {lat: lat, lng: lng, zoom: zoom, address: address};
							 | 
						|||
| 
								 | 
							
								            if (fromtype !== totype) {
							 | 
						|||
| 
								 | 
							
								                var result = gcoord.transform([data.lng, data.lat], gcoord[fromtype], gcoord[totype]);
							 | 
						|||
| 
								 | 
							
								                data.lng = (result[0] || data.lng).toFixed(5);
							 | 
						|||
| 
								 | 
							
								                data.lat = (result[1] || data.lat).toFixed(5);
							 | 
						|||
| 
								 | 
							
								                console.log(data, result, fromtype, totype);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            close(data);
							 | 
						|||
| 
								 | 
							
								        });
							 | 
						|||
| 
								 | 
							
								        init();
							 | 
						|||
| 
								 | 
							
								    });
							 | 
						|||
| 
								 | 
							
								</script>
							 | 
						|||
| 
								 | 
							
								</body>
							 | 
						|||
| 
								 | 
							
								</html>
							 |