關於實現手機定位,通過伺服器,再發送給查詢者,或指定人
目的:
這週六我要出去一趟,確保小夥伴的安全,但我想保證自己的安全,能讓別人時刻知道我的具體位置
方案一:通過ip定位
使用 :
1. python2.7
2. pip install geoip2
3. 再去http://dev.maxmind.com/geoip/geoip2/geolite2下載city的db
不足:
ip唯一,子網沒辦法查到
效果:
這是我手機的ip地址 我在濟寧 定位到北京....
原始碼:
#-*-coding:utf-8-*-
import geoip2.database
reader = geoip2.database.Reader('C:\\study\\location\\GeoLite2-City.mmdb')
#ip = raw_input("輸入你要查詢的IP:")
response = reader.city('218.92.225.159')# 有多種語言,我們這裡主要輸出英文和中文print("你查詢的IP的地理位置是:")
try:
print(u"地區:{}({})".format(response.continent.names["es"],
response.continent.names["zh-CN"]))
except:
print()
try:
print(u"國家:{}({}) ,簡稱:{}".format(response.country.name,
response.country.names["zh-CN"],
response.country.iso_code))
except:
print()
try:
print(u"洲/省:{}({})".format(response.subdivisions.most_specific.name,
response.subdivisions.most_specific.names["zh-CN"]))
except:
print()
try:
print(u"城市:{}({})".format(response.city.name,
response.city.names["zh-CN"]))
except:
print()
try:
print(u"經度:{},緯度{}".format(response.location.longitude,
response.location.latitude))
except:
print()
try:
print(u"郵編:{}".format(response.postal.code))
except:
print()
#print(u"時區:{}".format(response.location.time_zone))
方案二:
通過百度api獲得當前位置 需要事先知道經緯度 獲得一個地圖
靈感:
突然想到和同學暑假做的一個安卓,她負責百度定位,當時用的就是百度API,並沒有輸入經緯度,或許我該去看看百度API的官網了
原始碼:
<!DOCTYPE html>
<html>
<title>HTML5呼叫百度地圖API進行地理定位例項</title>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=xxx"></script>
</head>
<body style="margin:50px 10px;">
<div id="status" style="text-align: center"></div>
<div style="width:600px;height:480px;border:1px solid gray;margin:30px auto" id="container"></div>
<script type="text/javascript">
//預設地理位置設定為曲師大
var x=116.96256,y=35.59329;
window.onload = function() {
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
document.getElementById("status").innerHTML = "HTML5 Geolocation is supported in your browser.";
// 百度地圖API功能
var map = new BMap.Map("container");
var point = new BMap.Point(x,y);
map.centerAndZoom(point,12);
var geolocation = new BMap.Geolocation();
geolocation.getCurrentPosition(function(r){
if(this.getStatus() == BMAP_STATUS_SUCCESS){
alert(r.point.latitude);
var mk = new BMap.Marker(r.point);
map.addOverlay(mk);
map.panTo(r.point);
}
else {
alert('failed'+this.getStatus());
}
},{enableHighAccuracy: true});
return;
}
alert("你的瀏覽器不支援獲取地理位置!");
};
function showPosition(position){
x=position.coords.latitude;
y=position.coords.longitude;
}
</script>
</body>
</html>
方案三: 網頁獲取地址 並實時展示地圖,將經緯度傳到伺服器的檔案中,地圖10分鐘左右重新整理一次,本來想再寫個功能,能讓別人檢視我的位置,因為太餓了 不想寫了
對我來說最大的困難在於 ajax不會,json沒接觸過,所以浪費在這兩個上面的時間也最長
loc.html:
<html>
<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,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微軟雅黑";}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=dKkaAiL0OANV5xG4sCbFpBOdqOhex1jq"></script>
<title>瀏覽器定位</title>
</head>
<body>
<div id="allmap"></div>
<!--發現問題
1. 百度api定位與web定位的地址不同,如果要在百度地圖精準顯示,需要經過座標轉換
2. 先彈出是否允許獲得當前座標 如果不點選 一會自動彈出您的座標為... 點選之後才彈出 web定位
3. 搜尋過程中出現 django
4. 將scripts中內容寫入body中 有三種方式 學過jsp和document.write()
5. 精彩文章 https://zhuanlan.zhihu.com/p/24376846
6. 本來想通過將js資料寫入表單 再自動提交表單到後臺 現在發現可以直接將js提交後臺....
-->
</body>
</html>
<script type="text/javascript">
var longitude,latitude;
navigator.geolocation.getCurrentPosition(function (position) {
longitude = position.coords.longitude;
latitude = position.coords.latitude;
});
// 百度地圖API功能
var map = new BMap.Map("allmap");
var point = new BMap.Point(longitude,latitude);
map.centerAndZoom(point,12);
var geolocation = new BMap.Geolocation();
geolocation.getCurrentPosition(function(r){
if(this.getStatus() == BMAP_STATUS_SUCCESS){
r.point.lng='116.97710470620571';
r.point.lat='35.60307342340916';
var mk = new BMap.Marker(r.point);
map.addOverlay(mk);
map.panTo(r.point);
locfun();
}
else {
}
},{enableHighAccuracy: true})
function locfun() {
var xmlhttp;
var loc = {
"longitude": longitude,
"latitude": latitude
};
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行程式碼
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 瀏覽器執行程式碼
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState===4 && xmlhttp.status===200)
{
}
};
xmlhttp.open("POST","/loc2",true);
xmlhttp.setRequestHeader("Content-type","application/json");
// 後面這兩部很重要,我看網上很多都是使用xmlhttp.send("username="+username+"&password="+"),這樣接收還要解析一番感覺還是直接傳送以下格式的好些
var data_json = JSON.stringify(loc);
xmlhttp.send(data_json);
}
window.onload = function()
{
setTimeout("window.location.reload()", 500000);
}
</script>
loc_2.py:
# -*- coding: utf-8 -*-
import json
import socket
from flask import Flask
from flask import request
from flask import redirect
from flask import jsonify,render_template
app = Flask(__name__)
@app.route('/loc2' , methods=['GET', 'POST'])
def index():
if request.method == 'POST':
a = request.get_data()
dict1 = json.loads(a)
f=open("C:\\study\\location\\loc.txt","a+")
f.write(json.dumps(dict1["longitude"])+","+json.dumps(dict1["latitude"]))
f.write("\n")
f.close()
#print(dict1)
#return render_template('res.html',longitude=json.dumps(dict1["longitude"]),latitude=json.dumps(dict1["latitude"]))
elif request.method == 'GET':
a = request.get_data()
dict1 = json.loads(a)
f=open("C:\\study\\location\\loc.txt","a+")
f.write(json.dumps(dict1["longitude"])+","+json.dumps(dict1["latitude"]))
f.write("\n")
f.close()
#return render_template('res.html',longitude=json.dumps(dict1["longitude"]),latitude=json.dumps(dict1["latitude"]))
else:
return '<h1>no!</h1>'
@app.route('/loc')
def loc():
return render_template('loca.html')
if __name__ =='__main__':
hostname = socket.gethostname()
ip='0.0.0.0'
app.run( host=ip,port=5000,debug=False )