python读取csv----python根据IP列表生成百度IP热点图tilemap

1、安装Python库,用到读取csv的库pandas,获取IP经度和纬度的库pygeoip

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. pip install pandas  
  2. pip install pygeoip  


2、下载GeoIP库

http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

解压后放于/usr/local/python2.7.6/lib/python2.7/site-packages/pygeoip/目录


3、读取ip,转化为point.js文件,源码如下:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #!/usr/bin/python  
  2.   
  3. import pandas as pd  
  4. import pygeoip  
  5. import types  
  6.   
  7. #初始化pygeoip  
  8. gi = pygeoip.GeoIP('/usr/local/python2.7.6/lib/python2.7/site-packages/pygeoip/GeoLiteCity.dat', pygeoip.MEMORY_CACHE)  
  9.   
  10. #转换IP为经度和纬度  
  11. def getLocal(ip):  
  12.     if type(ip) != types.StringType:  
  13.         print ip  
  14.         return  
  15.     location = gi.record_by_addr(ip)  
  16.     if location is None:  
  17.         print ip  
  18.         return  
  19.     lng = location['longitude']  
  20.     lat = location['latitude']  
  21.     str_temp = '{"lat":' + str(lat) + ',"lng":' + str(lng) + '},\n'  
  22.     #print ip,lng,lat,str_temp  
  23.     file.write(str_temp)  
  24.       
  25. file = open('/root/point.js''w')  
  26. file.write("var points =[\n")  
  27. #读取ip列表  
  28. df = pd.read_csv("/root/iplist.csv")  
  29. df.apply(lambda x:getLocal(x.sip), axis=1)  
  30. file.write("];\n")  
  31. file.close()  

4、编写map.html文件,把point.js的数据传给百度,生成地图

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5.     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />  
  6.     <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=KrmZxHHwvLnl4Xfyt0FMMVzgGLaaxU2j"></script>  
  7.     <script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>  
  8.     <script type="text/javascript" src="./point.js"></script>  
  9.     <title>热力图功能示例</title>  
  10.     <style type="text/css">  
  11.         ul,li{list-style: none;margin:0;padding:0;float:left;}  
  12.         html{height:100%}  
  13.         body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}  
  14.     </style>      
  15. </head>  
  16. <body>  
  17.     <div id="container"></div>  
  18.     <div id="r-result">  
  19.         <input type="button"  onclick="openHeatmap();" value="显示热力图"/><input type="button"  onclick="closeHeatmap();" value="关闭热力图"/>  
  20.     </div>  
  21. </body>  
  22. </html>  
  23. <script type="text/javascript">  
  24.     var map = new BMap.Map("container");          // 创建地图实例  
  25.   
  26.     var point = new BMap.Point(113.418261, 33.921984);  
  27.     map.centerAndZoom(point, 6);             // 初始化地图,设置中心点坐标和地图级别  
  28.     map.enableScrollWheelZoom(); // 允许滚轮缩放  
  29.          
  30.     if(!isSupportCanvas()){  
  31.         alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')  
  32.     }  
  33.   
  34.     heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":20});  
  35.     map.addOverlay(heatmapOverlay);  
  36.     heatmapOverlay.setDataSet({data:points,max:100});  
  37.     //是否显示热力图  
  38.     function openHeatmap(){  
  39.         heatmapOverlay.show();  
  40.     }  
  41.     function closeHeatmap(){  
  42.         heatmapOverlay.hide();  
  43.     }  
  44.     openHeatmap();  
  45.     function setGradient(){  
  46.         var gradient = {};  
  47.         var colors = document.querySelectorAll("input[type='color']");  
  48.         colors = [].slice.call(colors,0);  
  49.         colors.forEach(function(ele){  
  50.             gradient[ele.getAttribute("data-key")] = ele.value;   
  51.         });  
  52.         heatmapOverlay.setOptions({"gradient":gradient});  
  53.     }  
  54.     //判断浏览区是否支持canvas  
  55.     function isSupportCanvas(){  
  56.         var elem = document.createElement('canvas');  
  57.         return !!(elem.getContext && elem.getContext('2d'));  
  58.     }  
  59. </script>  

5、把map.html和point.js放在一个目录,双击map.html得到地图

最终热力图的样子如下:



来源http://blog.youkuaiyun.com/mergerly/article/details/53522479

以下是一个简单的示例,展示如何在Python中使用scikit-learn库对数据进行聚类,并将结果传递给Flask应用程序以供使用Leaflet前端可视化。 1. 导入必要的库 ```python from flask import Flask, render_template, jsonify from sklearn.cluster import KMeans import pandas as pd ``` 2. 读取数据并进行聚类 ```python # 读取数据 data = pd.read_csv('data.csv') # 根据需要进行数据预处理 # 进行聚类 kmeans = KMeans(n_clusters=4).fit(data) labels = kmeans.labels_ ``` 3. 创建Flask应用程序 ```python app = Flask(__name__) ``` 4. 创建视函数并将聚类结果传递给前端 ```python @app.route('/') def index(): # 将聚类结果转换为JSON格式 data_json = data.to_json(orient='records') labels_json = jsonify(list(labels)) # 渲染HTML模板并将数据传递给前端 return render_template('map.html', data=data_json, labels=labels_json) ``` 5. 创建HTML模板 ```html <!DOCTYPE html> <html> <head> <title>Leaflet Map</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.min.css" integrity="sha512-5r5J5W5z8Nc6+XO6RjKkxWl2J+3w/3f6dHvKzJU6lq3BqX9qySr+Hf1A8J1YwZzjrJZsHsCNz2Q2dLhJj9yFg==" crossorigin="anonymous" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/leaflet.min.js" integrity="sha512-p4W8iKgVwL1jEjGzHtWm8E3Pu3TMDT3pSJN/1WfzY1LwOomRJNvOoQfQ2U1+6U9RyEdFV6UW8Q3qGZaMUdZLpA==" crossorigin="anonymous"></script> </head> <body> <div id="map" style="height: 500px;"></div> <script> // 将聚类结果从JSON格式转换为JavaScript对象 var data = {{ data|safe }}; var labels = {{ labels|safe }}; // 创建地 var map = L.map('map').setView([51.505, -0.09], 13); // 添加地瓦片 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>', maxZoom: 18, id: 'mapbox/streets-v11', tileSize: 512, zoomOffset: -1 }).addTo(map); // 将数据添加到地上 for (var i = 0; i < data.length; i++) { var marker = L.marker([data[i].lat, data[i].lng]).addTo(map); // 根据聚类标签设置标记颜色 if (labels[i] == 0) { marker.setIcon(L.icon({iconUrl: 'red-marker.png'})); } else if (labels[i] == 1) { marker.setIcon(L.icon({iconUrl: 'blue-marker.png'})); } else if (labels[i] == 2) { marker.setIcon(L.icon({iconUrl: 'green-marker.png'})); } else { marker.setIcon(L.icon({iconUrl: 'yellow-marker.png'})); } } </script> </body> </html> ``` 这是一个简单的示例,展示了如何在Python中使用scikit-learn库对数据进行聚类,并将结果传递给Flask应用程序以供使用Leaflet前端可视化。实际应用中可能需要根据具体需求进行更多的数据处理和可视化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值