根据一个城市的右上角与左下角将城市绘制成一个大矩形,再在里面分成n分

前端html

<!DOCTYPE html>
<html lang="en">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
body, html {width: 100%;height: 100%;margin:0;font-family:"微软雅黑";}
#allmap{width:100%;height:500px;}
p{margin-left:5px; font-size:14px;}
</style>
<title>根据关键字本地搜索</title>
</head>
<style type="text/css">
.loader{
position: absolute;
left: 43%;
display: none;
}
.load{
position: relative;
left: 0%;
border: dotted red 1px;
color:red;
}
body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
#panel{
position:absolute;
left:5px;
top:5px;
}
#result{
background: #fff;
padding:5px;
}
</style>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的秘钥"></script>
<link href="/Content/map/css/DrawingManager_min.css" rel="stylesheet">
<script src="/Content/map/js/DrawingManager_min.js"></script>
<body>
<h1>城市范围查询法</h1>
<form action="./city.php" method="get">
<div><span>搜索关键字:</span><input type="text" name="query" class="query" value="母婴店"></div>

<!-- <div><span>搜索范围 :</span><br><input type="number" name="distance" class="query" value="5"><spqn>用千米为单位值(取值范围:1-100:也可以更大)</spqn></div> -->
<div>
<span>地区选择 :</span>
<select name="province" id="" class="province" >
<option value="0">请选择省</option>
</select>
<select id="" class="region" name="region">
<option value="0">请选择市</option>
</select>
</div>
<input type="text" style="display:none;" value="" name="chang" class="chang" />
<input type="text" style="display:none;" value="" name="centre" class="centre" />
<input type="text" style="display:none;" value="" name="ne_lng" class="ne_lng" />
<input type="text" style="display:none;" value="" name="sw_lng" class="sw_lng" />
<input type="text" style="display:none;" value="" name="ne_lat" class="ne_lat" />
<input type="text" style="display:none;" value="" name="sw_lat" class="sw_lat" />
<input type="submit" name="submit" id="submit" value="生成EXCEL">
</form>
<div class="loader"><img src="./loader.gif"><div class="load">数据加载中请等待60秒。。。。。。。。。。。。。。。</div></div>
<div id="allmap"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
// 百度地图API功能
var map = new BMap.Map("allmap");
map.centerAndZoom(new BMap.Point(116.331398,39.897445),11);
map.enableScrollWheelZoom(true);
var mercatorProjection = map.getMapType().getProjection();

// 用经纬度设置地图中心点
function theLocation(longitude,latitude){
if(longitude != "" && latitude != ""){
map.clearOverlays();
var new_point = new BMap.Point(longitude,latitude);
var marker = new BMap.Marker(new_point); // 创建标注
map.addOverlay(marker); // 将标注添加到地图中
map.panTo(new_point);
}
}

function getBoundary(city){
var bdary = new BMap.Boundary();
bdary.get(city, function(rs){ //获取行政区域
map.clearOverlays(); //清除地图覆盖物
var count = rs.boundaries.length; //行政区域的点有多少个
if (count === 0) {
alert('未能获取当前输入行政区域');
return ;
}
var pointArray = [];
for (var i = 0; i < count; i++) {
var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#ff0000"}); //建立多边形覆盖物
map.addOverlay(ply); //添加覆盖物
pointArray = pointArray.concat(ply.getPath());
}
var pathStr = "";
var pathMc = "";
for (var i = 0; i < pointArray.length; i++) {

var mc = mercatorProjection.lngLatToPoint(pointArray[i]);
pathStr += pointArray[i].lng + "," + pointArray[i].lat + ";";
pathMc += mc.x + "," + mc.y + ";";
}
$('#pathStr').html(pathStr);
$('#pathMc').html(pathMc);
var ply = new BMap.Polygon(pointArray , {strokeWeight: 2, strokeColor: "#ff0000"}); //建立多边形覆盖物
var bounds = ply.getBounds();
var ne = bounds.getNorthEast();
var sw = bounds.getSouthWest();
$('.ne_lng').val(ne.lng);
$('.ne_lat').val(ne.lat);
$('.sw_lng').val(sw.lng);
$('.sw_lat').val(sw.lat);
var neMc = mercatorProjection.lngLatToPoint(ne);
var swMc = mercatorProjection.lngLatToPoint(sw);
var pt = bounds.getCenter();
var centerjd=pt.lng;
var centerwd=pt.lat;
$('.centre').val(centerjd+','+centerwd);
map.setViewport(pointArray); //调整视野
});
}
$('#submit').click(function(){
$('.loader').show();
})
$(function(){
ajax(0,'province');
ajax(110000,'region');
})
var id;
$(".province").change(function () {
id = $(this).val();
ajax(id,'region');
});
$(".region").change(function () {
select_change();
});
function select_change(){
var value=$('.region option:selected').html();
$('.chang').val(value);
getBoundary(value);
}
function ajax(id,category){
var information=[];
$.ajax({
url: './region.php',
type: 'get',
dataType: 'json',
data: {id: id},
})
.done(function(data) {
$("."+category).find("option").remove();
$.each(data,function(i, v) {
var html='<option value="'+v.areaid+'">'+v.areaname+'</option>';
information.push(html);
});
$("."+category).append(information.join(''));
select_change();
})
.fail(function() {
alert('获取失败');
})
}



</script>
</body>
</html>

后端PHP处理

<?php
//矩形检索的主要请求参数是query查询的类别、bounds查询区域的左下、右上经纬度。lat,lng(左下角坐标),lat,lng(右上角坐标)。查询得到的结果与城市范围内检索结果相似。
//通过两种方式实现POI的区域检索都很便捷,但是当城市较大,某一类POI信息数量大时,由于百度API的限制,1.2.1城市内检索最多只能返回400条POI数据,会造成查不全的现象。这时,可以利用矩形检索,将区域的外包矩形划分为多个小网格,并确保每个网格中该类别POI数据的条数不会超过400条,这样逐个小网格进行矩形检索,最终得到城市区域某一类别POI的所有数据。
$conn = mysql_connect("127.0.0.1","root","123456");
mysql_select_db("baidu");//这个是数据库名
mysql_query('set names utf8');//需要加这句,不知道为什么,不然导出的中文乱码,大家在使用的时候,如果utf8乱码,就改为GBK,反正也可以
define('EARTH_RADIUS', 6378.137);//地球半径
define('PI', 3.1415926);
$ak="你的秘钥";
$address=$_GET['chang'];
$query = $_GET['query'];
$centre = $_GET['centre'];
$ne_lng=$_GET['ne_lng'];
$ne_lat=$_GET['ne_lat'];
$sw_lng=$_GET['sw_lng'];
$sw_lat=$_GET['sw_lat'];
$data=ls_row($sw_lat.",".$sw_lng.",".$ne_lat.",".$ne_lng);

$data_arr=[];

for($i=0;$i<count($data);$i++){
$url="http://api.map.baidu.com/place/v2/search?query=".$query."&bounds=".$data[$i]."&output=json&page_size=20&page_num=0&ak=".$ak;
$Data=file_get_contents($url);
$apiData=json_decode($Data);
$total=$apiData->total;
if($total>=400){
$count=20;
}else{
$count=$total/20;
}
if($count<=1){
$data_arr[]=$Data;
}else{
for($j=0;$j<=$count;$j++){
$uri="http://api.map.baidu.com/place/v2/search?query=".$query."&bounds=".$data[$i]."&output=json&page_size=20&page_num=".$j."&ak=".$ak;
$data_arr[]=file_get_contents($uri);
}
}
}

for($l=0;$l<=count($data_arr);$l++){
$results=json_decode($data_arr[$l]);
for($jj=0;$jj<count($results->results);$jj++){
$result=$results->results;
$sql="insert into info ('street_id','name','telephone','address','detail_url','keyword') values('".$result[$jj]->street_id."','". $result[$jj]->name."','".$result[$jj]->telephone."','".$result[$jj]->province.$result[$jj]->city.$result[$jj]->area.$result[$jj]->address."','".$result[$jj]->detail_info->detail_url."','".$query."')";
mysql_query($sql);
// echo iconv("utf-8", "gb2312", $result[$jj]->name)."\t";
// echo iconv("utf-8", "gb2312", $result[$jj]->telephone)."\t";
// echo iconv("utf-8", "gb2312", $result[$jj]->province.$result[$jj]->city.$result[$jj]->area.$result[$jj]->address)."\t";
// echo iconv("utf-8", "gb2312", $result[$jj]->detail_info->detail_url)."\n";
}
}


function lat_all($loc_all){
$loc_all=explode(',',$loc_all);
$lat_sw =$loc_all[0];
$lat_ne = $loc_all[2];
$lat_list = [];
$lat_count=($lat_ne - $lat_sw + 0.0001) / 0.1;
for($i=0;$i<=$lat_count;$i++){
$lat_list[]=$lat_sw+0.1*$i;
$lat_list[]=$lat_ne;
}
return $lat_list;
}


function lng_all($loc_all){
$loc_all=explode(',',$loc_all);
$lng_sw = $loc_all[1];
$lng_ne = $loc_all[3];
$lng_list = [];
$lng_count=($lng_ne-$lng_sw+0.0001)/0.1;
for($i=0;$i<=$lng_count;$i++){
$lng_list[]=$lng_sw+0.1*$i;
$lng_list[]=$lng_ne;
}
return $lng_list;
}

function ls_com($loc_all){
$l1 = lat_all($loc_all);
$l2 = lng_all($loc_all);
$ab_list = [];
for($i=0;$i<=count($l1);$i++){
$a = $l1[$i];
for($i2=0;$i2<=count($l2);$i2++){
$b = $l2[$i2];
if($b!=""&&$a!=""){
$ab = $a.','.$b;
$ab_list[]=$ab;
}
}
}
return $ab_list;
}

function ls_row($loc_all){
$l1 = lat_all($loc_all);
$l2 = lng_all($loc_all);
$ls_com_v = ls_com($loc_all);
$ls = [];
for($n=0;$n<=count($l1)-1;$n++){
for($i=0+count($l1)*$n;$i<=count($l2) + (count($l2)) * $n - 1;$i++){
$a = $ls_com_v[$i];
$b = $ls_com_v[$i + count($l2) + 1];
if($b!=""&&$a!=""){
$ab = $a. ','.$b;
$ls[]=$ab;
}

}
}
return $ls;
}

猜你喜欢

转载自www.cnblogs.com/wangyaoyu/p/9431083.html
今日推荐