Quantcast
Channel: TM's Workspace » JavaScript
Viewing all articles
Browse latest Browse all 10

GPS位置情報を記録するWebアプリ習作

$
0
0

 今日は早めに家に帰り着いたので、久しぶりに何かプログラムを作りたいと思い、JQueryMobileを使った、GPSの位置情報を記録する簡単なWebアプリを作ってみました。
 記録ボタンを押すとその地点の位置情報が記録され、グーグルマップへのリンクが作成されるという簡単なものです。また、逆ジオコーディングで地名を検索し、データをLocalStorageに記録しています。
 iPhoneとAndroid、PCならChromeで動くと思います。 プログラム実行

 
■ソースコード

<html lang="jp" class="ui-mobile landscape">
<head>
<title>LocaRec</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=8"/>
<link rel="stylesheet" media="screen" href="http://termat.sakura.ne.jp/javascript/jqmobile/jquery.mobile-1.1.0.min.css">
<link rel="stylesheet" media="screen" href="http://termat.sakura.ne.jp/javascript/jqmobile/jquery.mobile.structure-1.1.0.min.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="http://termat.sakura.ne.jp/javascript/jqmobile/jquery.mobile-1.1.0.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true" ></script>
<script type="text/javascript">
	var listNum=0;
	var dbName="locrec.data";
	var list=[];

	$(document).ready(function(){
		loadLink();
	});

	var getLocation=function(){
		if((navigator.geolocation == undefined)){
			alert("位置情報が取得できません。");
			return;
		}
		navigator.geolocation.getCurrentPosition(success,error);
	};

	var success=function(pos){
		var lat=pos.coords.latitude;
		var lon=pos.coords.longitude;
		var uri="http://maps.google.co.jp/?q="+lat+","+lon;
		var li=$("<li />");
		li.attr("id","li"+listNum);
		var a=$("<a />");
		a.attr("name","li"+listNum);
		listNum++;
		a.attr("uri",uri);
		a.attr("href",uri);
		a.text(uri);
		li.append(a);
		$("#link").append(li);
		var obj={uri:uri,text:""};
		addLink(obj);
		$("#link").listview('refresh');
		geo(lat,lon,a);
	};

	var error=function(){
		alert("位置情報が取得できません。");
	};

	var geo=function(lat,lon,a){
		var latlng=new google.maps.LatLng(lat,lon);
		var geocoder = new google.maps.Geocoder();
		var geocoderRequest = { "location": latlng };
		var geocoderCallback = function( results, status ){
			if( status == google.maps.GeocoderStatus.OK ){
				a.text(results[0].formatted_address);
				var item=list[listNum-1];
				item.text=results[0].formatted_address;
				list[listNum-1]=item;
				update();
			}else{
				alert( '失敗:' + status );
		    }
		};
		geocoder.geocode( geocoderRequest, geocoderCallback );
	};

	var setItemStatus=function(){
		var flg=true;
		var kids=$("#link").children();
		if(kids.length<=0)return;
		var tag="ui-icon ui-icon-delete ui-icon-shadow";
		if(isDelete(kids[0].getElementsByTagName("span")[0])){
			tag="ui-icon ui-icon-arrow-r ui-icon-shadow";
			flg=false;
		}
		for(var i=0;i<kids.length;i++){
			var span=kids[i].getElementsByTagName("span")[0];
			$(span).attr("class",tag);
			if(flg){
				var a=kids[i].getElementsByTagName("a")[0];
				var id=$(a).attr("name");
				$(a).attr("href","javascript:removeItem('"+id+"');");
			}else{
				var a=kids[i].getElementsByTagName("a")[0];
				var uri=$(a).attr("uri");
				$(a).attr("href",uri);
			}
		}
	};

	var isDelete=function(span){
		var name=$(span).attr("class");
		if(name.indexOf("delete")>0){
			return true;
		}else{
			return false;
		}
	};

	var getSpanItem=function(par){
		return par.getElementsByTagName("span")[0];
	};

	var removeItem=function(id){
		if(window.confirm('リンクを削除しますか?')){
			$("#"+id).remove();
			removeLink(id);
		}
	};

	var addLink=function(data){
		list.push(data);
		update();
	};

	var removeLink=function(id){
		var val=id.replace("li","");
		var n=Number(val);
		list.splice(n,1);
		update();
	};

	var update=function(){
		localStorage[dbName]= JSON.stringify({data: list});
	};

	var loadLink=function(){
		var data=localStorage[dbName];
		if(!data)return;
		var json=JSON.parse(data);
		list=json.data;
		var n=list.length;
		if(n==0)return;
		for(var i=0;i<n;i++){
			var item=list[i];
			var li=$("<li />");
			li.attr("id","li"+i);
			var a=$("<a />");
			a.attr("name","li"+i);
			a.attr("uri",item.uri);
			a.attr("href",item.uri);
			if(item.text.length>0){
				a.text(item.text);
			}else{
				a.text(item.uri);
			}
			li.append(a);
			$("#link").append(li);
		}
		listNum=n;
		$("#link").listview('refresh');
	};

</script>
<body>
<div data-role="page" class="ui-page ui-body-c ui-page-active">
	<div data-role="header" data-theme="b" id="header" data-position="inline" class="ui-bar-b ui-header" role="banner">
		<h1 class="ui-title" tabindex="0" role="heading" aria-level="1" id="title">ロケレコ</h1>
		<a href="javascript:getLocation();" data-role="button" data-icon="plus" class="ui-btn-left" title="Add"">追加</a>
		<a href="javascript:setItemStatus();" data-role="button" data-icon="gear" data-iconpos="notext" class="ui-btn-right" title="Del"">編集</a>
	</div>
	<div data-role="content">
		<ul data-role="listview" id="link">
		</ul>
	</div>
</div>
</body>
</html>

Viewing all articles
Browse latest Browse all 10

Trending Articles