根据标注点坐标范围计算显示缩放级别zoom自适应显示地图

最近在开发百度地图,需要实现的是地图初始化的时候,能够把我们所有的标注点markers显示在地图上,并且让地图有一个合适的显示级别。以提高用户体验。

找到了了解决方案:
百度地图每一个显示级别对应了一个比例尺,这里我们由比例尺入手。 计算最大经纬度与最小经纬度之间的距离,然后把这个距离乘以10(这里的10表示地图通常占几个比例迟的大小)。再根据这个结果来确定我们的地图应该在一个什么样的比例尺,从而确定我们的缩放级别。

数据

//数据准备
var points = [{"lng":116,"lat":40,"status":1,"id":50},
	{"lng":117,"lat":31,"status":1,"id":2},
	{"lng":116,"lat":34,"status":0,"id":3},
	{"lng":118,"lat":39,"status":0,"id":4},
	{"lng":110,"lat":35,"status":1,"id":5}
];

加载地图

var map = new BMap.Map("container");

计算最大经纬度,最小经纬度。计算中心点。并调用getZoom()获取显示级别。

//根据原始数据计算中心坐标和缩放级别,并为地图设置中心坐标和缩放级别。
function setZoom(points){
	if(points.length>0){
		var maxLng = points[0].lng;
		var minLng = points[0].lng;
		var maxLat = points[0].lat;
		var minLat = points[0].lat;
		var res;
		for (var i = points.length - 1; i >= 0; i--) {
			res = points[i];
			if(res.lng > maxLng) maxLng =res.lng;
			if(res.lng < minLng) minLng =res.lng;
			if(res.lat > maxLat) maxLat =res.lat;
			if(res.lat < minLat) minLat =res.lat;
		};
		var cenLng =(parseFloat(maxLng)+parseFloat(minLng))/2;
		var cenLat = (parseFloat(maxLat)+parseFloat(minLat))/2;
		var zoom = getZoom(maxLng, minLng, maxLat, minLat);
		map.centerAndZoom(new BMap.Point(cenLng,cenLat), zoom);  
	}else{
		//没有坐标,显示全中国
		map.centerAndZoom(new BMap.Point(103.388611,35.563611), 5);  
	} 
}

getZoom()。我写的计算缩放级别的函数。

//根据经纬极值计算绽放级别。
function getZoom (maxLng, minLng, maxLat, minLat) {
	var zoom = ["50","100","200","500","1000","2000","5000","10000","20000","25000","50000","100000","200000","500000","1000000","2000000"]//级别18到3。
	var pointA = new BMap.Point(maxLng,maxLat);  // 创建点坐标A
	var pointB = new BMap.Point(minLng,minLat);  // 创建点坐标B
	var distance = map.getDistance(pointA,pointB).toFixed(1);  //获取两点距离,保留小数点后两位
	for (var i = 0,zoomLen = zoom.length; i < zoomLen; i++) {
		if(zoom[i] - distance > 0){
			return 18-i+3;//之所以会多3,是因为地图范围常常是比例尺距离的10倍以上。所以级别会增加3。
		}
	};
}

加载标注点

//在轨迹点上创建图标,并添加点击事件
function addMarker(points){  // 创建图标对象   

	// 创建标注对象并添加到地图   
	for(var i = 0,pointsLen = points.length;i <pointsLen;i++){
		var point = new BMap.Point(points[i].lng,points[i].lat);	
		var  marker = new BMap.Marker(point);   
		map.addOverlay(marker); 
		//给标注点添加点击事件。使用立即执行函数和闭包
		(function() {
			var thePoint = points[i];
			marker.addEventListener("click",function(){
				showInfo(this,thePoint);
			});
		})();
	}
}

注:百度地图api就可以实现这个功能

var points = [point1, point2,point3];
var view = map.getViewport(eval(points));
var mapZoom = view.zoom; 
var centerPoint = view.center; 
map.centerAndZoom(centerPoint,mapZoom);

还是对百度地图API不够熟悉啊

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
服务器端: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; public class Server extends JFrame implements ActionListener{ JPanel contentPane; JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField("4700"); JButton jButton1 = new JButton(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JButton jButton2 = new JButton(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); ServerSocket server = null; Socket socket = null;BufferedReader instr =null;PrintWriter os=null ; //Construct the frame public Server() { jbInit(); } class MyThread extends Thread{//该线程负责接受数据 public void run(){ try{ while(true){ this.sleep(100); instr= new BufferedReader(new InputStreamReader(socket.getInputStream())); if(instr.ready()){ //检查是否有数据 jTextArea1.append("客户端: "+instr.readLine()+"\n"); } } }catch(Exception ex){} } } public void actionPerformed(ActionEvent e){ if(e.getSource()==jButton1){ int port=Integer.parseInt(jTextField2.getText().trim()); listenClient(port); } if(e.getSource()==jButton2){ String s=this.jTextField3.getText().trim(); sendData(s); } } private void listenClient(int port){//侦听 try{ if(jButton1.getText().trim().equals("侦听")){ server = new ServerSocket(port); jButton1.setText("正在侦听..."); socket=server.accept();//等待,一直到客户端连接才望下执行 sendData("已经成功连接。。。"); jButton1.setText("正在聊天..."); jTextArea1.append("客户端已经连接到服务器\n"); MyThread t=new MyThread(); t.start(); } }catch(Exception ex){ } } private void sendData(String s){//发送数据 try{ os= new PrintWriter(socket.getOutputStream()); os.println(s); os.flush(); if(!s.equals("已经成功连接。。。")) this.jTextArea1.append("Server:"+s+"\n"); }catch(Exception ex){ } } //Component initialization private void jbInit() { contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(null); this.setSize(new Dimension(540, 340)); this.setTitle("服务器"); jLabel2.setBounds(new Rectangle(22, 27, 72, 28)); jLabel2.setText("端口号"); jLabel2.setFont(new java.awt.Font("宋体", 0, 14)); jTextField2.setBounds(new Rectangle(113, 27, 315, 24)); jButton1.setBounds(new Rectangle(440, 28, 73, 25)); jButton1.setFont(new java.awt.Font("Dialog", 0, 14)); jButton1.setBorder(BorderFactory.createEtchedBorder()); jButton1.setActionCommand("jButton1"); jButton1.setText("侦听"); jLabel3.setBounds(new Rectangle(23, 57, 87, 28)); jLabel3.setText("请输入信息"); jLabel3.setFont(new java.awt.Font("宋体", 0, 14)); jTextField3.setBounds(new Rectangle(114, 60, 314, 24)); jTextField3.setText(""); jButton2.setText("发送"); jButton2.setActionCommand("jButton1"); jButton2.setBorder(BorderFactory.createEtchedBorder()); jButton2.setFont(new java.awt.Font("Dialog", 0, 14)); jButton2.setBounds(new Rectangle(440, 58, 73, 25)); jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189)); contentPane.add(jTextField2, null); contentPane.add(jButton1, null); contentPane.add(jLabel3, null); contentPane.add(jTextField3, null); contentPane.add(jButton2, null); contentPane.add(jScrollPane1, null); contentPane.add(jLabel2, null); jScrollPane1.getViewport().add(jTextArea1, null); jButton1.addActionListener(this); jButton2.addActionListener(this); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ try{ socket.close(); instr.close(); System.exit(0); }catch(Exception ex){ } } }); } public static void main(String arg[]){ JFrame.setDefaultLookAndFeelDecorated(true); Server frm=new Server(); frm.setVisible(true); } } 客户端: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; public class Client extends JFrame implements ActionListener{ JPanel contentPane; JLabel jLabel1 = new JLabel(); JTextField jTextField1 = new JTextField("127.0.0.1"); JLabel jLabel2 = new JLabel(); JTextField jTextField2 = new JTextField("4700"); JButton jButton1 = new JButton(); JLabel jLabel3 = new JLabel(); JTextField jTextField3 = new JTextField(); JButton jButton2 = new JButton(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); BufferedReader instr =null; Socket socket = null; PrintWriter os=null; public Client() { jbInit(); } class MyThread extends Thread{ public void run(){ try{ os=new PrintWriter(socket.getOutputStream()); instr=new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true){ this.sleep(100); if(instr.ready()){ jTextArea1.append("服务器: " +instr.readLine()+"\n"); } } }catch(Exception ex){ } } } public void actionPerformed(ActionEvent e){ if(e.getSource()==jButton1){ String ip=jTextField3.getText().trim(); int port=Integer.parseInt(jTextField2.getText().trim()); connectServer(ip,port); } if(e.getSource()==jButton2){ String s=this.jTextField3.getText().trim(); sendData(s); } } private void connectServer(String ip,int port){//连接 try{ if(jButton1.getText().trim().equals("连接")){ jButton1.setText("连接服务器..."); socket=new Socket(ip,port); jButton1.setText("正在聊天"); MyThread t=new MyThread(); t.start(); } }catch(Exception ex){ } } private void sendData(String s){//发送数据 try{ os = new PrintWriter(socket.getOutputStream()); os.println(s); os.flush(); this.jTextArea1.append("Server:"+s+"\n"); }catch(Exception ex){ } } private void jbInit() { contentPane = (JPanel) this.getContentPane(); jLabel1.setFont(new java.awt.Font("宋体", 0, 14)); jLabel1.setText("服务器名称"); jLabel1.setBounds(new Rectangle(20, 22, 87, 28)); contentPane.setLayout(null); this.setSize(new Dimension(540, 340)); this.setTitle("客户端"); jTextField1.setBounds(new Rectangle(114, 26, 108, 24)); jLabel2.setBounds(new Rectangle(250, 25, 72, 28)); jLabel2.setText("端口号"); jLabel2.setFont(new java.awt.Font("宋体", 0, 14)); jTextField2.setBounds(new Rectangle(320, 27, 108, 24)); jButton1.setBounds(new Rectangle(440, 28, 73, 25)); jButton1.setFont(new java.awt.Font("Dialog", 0, 14)); jButton1.setBorder(BorderFactory.createEtchedBorder()); jButton1.setActionCommand("jButton1"); jButton1.setText("连接"); jLabel3.setBounds(new Rectangle(23, 57, 87, 28)); jLabel3.setText("请输入信息"); jLabel3.setFont(new java.awt.Font("宋体", 0, 14)); jTextField3.setBounds(new Rectangle(114, 60, 314, 24)); jButton2.setText("发送"); jButton2.setActionCommand("jButton1"); jButton2.setBorder(BorderFactory.createEtchedBorder()); jButton2.setFont(new java.awt.Font("Dialog", 0, 14)); jButton2.setBounds(new Rectangle(440, 58, 73, 25)); jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189)); contentPane.add(jLabel1, null); contentPane.add(jTextField1, null); contentPane.add(jLabel2, null); contentPane.add(jTextField2, null); contentPane.add(jButton1, null); contentPane.add(jLabel3, null); contentPane.add(jTextField3, null); contentPane.add(jButton2, null); contentPane.add(jScrollPane1, null); jScrollPane1.getViewport().add(jTextArea1, null); jButton1.addActionListener(this); jButton2.addActionListener(this); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ try{ socket.close();instr.close();os.close();System.exit(0); }catch(Exception ex){ } } }); } public static void main(String arg[]){ JFrame.setDefaultLookAndFeelDecorated(true); Client frm=new Client(); frm.setVisible(true); } } 先启动服务器端,侦听端口,再启动客户端,就行了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值