質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

Geolocation

Geolocation(ジオロケーション)は、携帯電話やインターネットに接続したコンピューターターミナルなど、オブジェクトの現実世界での地理的位置の情報を扱う技術であり、位置評価の実施や、実際に評価された位置を示す場合もあります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

0回答

1570閲覧

GeolocationAPIを用いて、距離が近い順にソートを行いたい

pppppppppp

総合スコア6

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

Geolocation

Geolocation(ジオロケーション)は、携帯電話やインターネットに接続したコンピューターターミナルなど、オブジェクトの現実世界での地理的位置の情報を扱う技術であり、位置評価の実施や、実際に評価された位置を示す場合もあります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/08/06 10:10

編集2020/08/09 10:32

やりたいこと

下記リストを、GeolocationAPIを用いて距離が近い順に並び替えたい

##コード
vue.jsを用いてリストを表示させています。

html

1<div class="container"> 2 3 4 <!--商品一覧--> 5 <div v-if="isError" class="error">{{message}}</div> 6 7 <div class="list"> 8 <div class="item" v-for="product in filteredList" v-bind:key="product.id"> 9 <figure class="image"> 10 <!-- <template v-if="product.isSale"> 11 12 </template> --> 13 <img v-bind:src="product.image" alt="病院画像"> 14 15 </figure> 16 <div class="detail clearfix"> 17 <figcaption v-html="product.name" class="name"></figcaption> 18 <div class="adress"><i class="fas fa-hospital-alt fa-lg"></i> {{product.adress}}</div> 19 <div class="price"><i class="fas fa-phone fa-lg"></i> {{product.price}}</div> 20 <div class="station"><i class="fas fa-subway fa-lg"></i> {{product.station}}駅</div> 21 <!-- <template v-if="product.delv == 0"> 22 <div class="shipping-fee none">送料無料</div> 23 </template> 24 <template v-else> 25 <div class="shipping-fee">+送料{{product.delv | number_format}}円</div> 26 </template> --> 27 </div> 28 <figure class="schedule"> 29 <img v-bind:src="product.schedule" alt=""> 30 </figure> 31 <div class ="byoin-bg3"> 32 <a href="https://docs.google.com/forms/d/e/1FAIpQLScLxeWPRbhwJxPbZQAdm8TSJpS2u-6D2DAL7Oa8dYmNdtXrxw/viewform?usp=sf_link"> <p class="byoin-bg3-text">この病院を予約</p></a> 33 </div> 34 </div> 35 </div> 36 </div>

リストはこれです

js

1products([ 2 { "id": 1, "name": "南青山アンティーク通りクリニック", "adress": "東京都港区南青山5-14-1 グリーンビル3F", "price": "03-3400-0612", "image": "minamiaoyama.jpg","schedule":"minamiaoyama_sche.png", "station": "表参道", "delv": 0, "isSale": true }, 3 { "id": 2, "name": "東京メンタルクリニック", "adress": "東京都港区新橋2-19-2 リプロ新橋ビル5F", "price": "03-6263-8314", "image": "toukyoumentaru.jpg", "schedule":"tokyomental_sche.png", "station": "新橋", "delv": 0, "isSale": true }, 4 { "id": 3, "name": "かわぐちクリニック", "adress": "大阪府大阪市北区紅梅町2-2カザリーノⅡ3F", "price": "06-6882-1533", "image": "kawaguti.jpg", "schedule":"kawaguti_sche.png", "station": "大阪天満宮", "delv": 0, "isSale": true }, 5 { "id": 4, "name": "野口クリニック", "adress": "神奈川県川崎市宮前区鷺沼3-1-12伏見ビル3F", "price": "044-853-0080", "image": "noguti.jpg", "schedule":"noguti_sche.png", "station": "鷺沼", "delv": 0, "isSale": true }, 6 { "id": 5, "name": "中原こころのクリニック", "adress": "神奈川県川崎市中原区上小田中6-21-7リパーク4F", "price": "044-819-6733", "image": "nakahara.jpg", "schedule":"nakahara_sche.png", "station": "武蔵中原", "delv": 0, "isSale": true }, 7 { "id": 6, "name": "医療法人菅原クリニック", "adress": "京都府京都市下京区塩小路通烏丸西入る東塩小路町579F", "price": "075-351-4111", "image": "sugawara.jpg", "schedule":"sugawara_sche.png", "station": "京都", "delv": 0, "isSale": true }, 8 { "id": 7, "name": "財団法人長岡記念財団 長岡病院", "adress": "京都府長岡京市友岡4-18-1", "price": "075-951-9201", "image": "nagaoka.jpg", "schedule":"nagaoka_sche.png", "station": "西山天王山", "delv": 0, "isSale": true }, 9 { "id": 8, "name": "財医療法人高柳会 赤城病院", "adress": "群馬県前橋市江木町1072", "price": "027-269-5111", "image": "akagi.jpg", "schedule":"akagi_sche.png", "station": "前橋", "delv": 0, "isSale": true }, 10 { "id": 9, "name": "北越谷駅前さくらメンタルクリニック", "adress": "埼玉県越谷市北越谷4-21-1GMCビル北越谷3F", "price": "048-940-3117", "image": "sakura.jpg", "schedule":"sakura_sche.png", "station": "北越谷", "delv": 0, "isSale": true }, 11]);

GeolocationAPIの内容を記載した部分はこちらです

js

1// データリストの緯度経度を取得 2function dfdGeocode(){ 3 var dfd = $.Deferred(); 4 5 // Geocoderのインスタンスを生成 6 var geocoder = new google.maps.Geocoder(); 7 8 // カウンター 9 var cnt = 0; 10 11 // データ分緯度経度の取得 12 $.each(products, function(i, data){ 13 geocoder.geocode({ 14 adress: data.adress 15 }, function(d, status){ 16 data.lat = d[0].geometry.location.lat(); //緯度 17 data.lng = d[0].geometry.location.lng(); //経度 18 cnt++; 19 if( cnt === products.length ){ 20 dfd.resolve(); 21 } 22 }); 23 }); 24 25 return dfd.promise(); 26} 27 28 29// 現在位置の取得 30function dfdCurrentPosition(){ 31 var dfd = $.Deferred(); 32 33 // Geolocationが使用可能かチェック 34 if( !window.navigator.geolocation ) dfd.reject(); 35 36 // 現在地の取得 37 window.navigator.geolocation.getCurrentPosition( 38 // Success 39 function(position){ 40 dfd.resolve(position); 41 }, 42 // Error 43 function(error){ 44 dfd.reject(); 45 }, 46 // Options 47 { 48 enableHighAccuracy:true, //位置情報の精度を高く 49 timeout: 10000, //10秒でタイムアウト 50 maximumAge: 600000 //10分間有効 51 } 52 ); 53 54 return dfd.promise(); 55} 56 57 58// DOM Content Loaded 59function dfdDocumentReady(){ 60 var dfd = $.Deferred(); 61 $(function(){ 62 dfd.resolve($(document)); 63 }); 64 return dfd.promise(); 65} 66 67 68// データが揃った段階でソートを開始 69$.when( 70 dfdCurrentPosition(), 71 // dfdGeocode(), 72 dfdDocumentReady() 73) 74.done(function(position){ 75 76 // 現在地 77 var coords = position.coords; 78 79 // 距離の割り出しを行ない、各データにdistance属性を設定 80 $.each(products, function(i, data){ 81 data.distance = getDistance(data.lat, data.lng, coords.latitude, coords.longitude, 0) / 1000; //kmで算出 82 }); 83 84 // 現在地からの距離が小さい順にソート 85 dataList.sort(function(a, b){ 86 return (a.distance < b.distance) ? -1 : 1; 87 }); 88 89 // データを出力 90 var html = ""; 91 92 $.each(dataList, function(i, data){ 93 html += ' <div class="list">'; 94 html += '<div class="item" v-for="product in filteredList" v-bind:key="product.id">'+(i+1)+'</div>'; 95 html += '<div class="item" v-for="product in filteredList" v-bind:key="product.id"><a href="https://maps.google.co.jp/maps?q='+data.lat+','+data.lng+'&z=17&iwloc=A" target="_blank">'; 96 html += data.name; 97 html += '</a></div>'; 98 html += '<div class="item" v-for="product in filteredList" v-bind:key="product.id">'+data.distance+'km</div>'; 99 html += '</div>'; 100 }); 101 102 $("#data-list").append(html); 103 104}) 105.fail(function(){ 106 alert("お使いの端末の位置情報サービスが無効になっているか対応していないため、エラーが発生しました"); 107 console.log("error", arguments); 108}); 109 110 111/** 112* 2点間の緯度経度から距離を取得 113* 測地線航海算法を使用して距離を算出する。 114* @see http://hamasyou.com/blog/2010/09/07/post-2/ 115* @param float 緯度1 116* @param float 経度2 117* @param float 緯度2 118* @param float 経度2 119* @param 小数点以下の桁数(べき乗で算出精度を指定) 120*/ 121function getDistance(lat1, lng1, lat2, lng2, precision){ 122var distance = 0; 123if( ( Math.abs(lat1 - lat2) < 0.00001 ) && ( Math.abs(lng1 - lng2) < 0.00001 ) ) { 124 distance = 0; 125}else{ 126 lat1 = lat1 * Math.PI / 180; 127 lng1 = lng1 * Math.PI / 180; 128 lat2 = lat2 * Math.PI / 180; 129 lng2 = lng2 * Math.PI / 180; 130 131 var A = 6378140; 132 var B = 6356755; 133 var F = ( A - B ) / A; 134 135 var P1 = Math.atan( ( B / A ) * Math.tan(lat1) ); 136 var P2 = Math.atan( ( B / A ) * Math.tan(lat2) ); 137 138 var X = Math.acos( Math.sin(P1) * Math.sin(P2) + Math.cos(P1) * Math.cos(P2) * Math.cos(lng1 - lng2) ); 139 var L = ( F / 8 ) * ( ( Math.sin(X) - X ) * Math.pow( (Math.sin(P1) + Math.sin(P2) ), 2) / Math.pow( Math.cos(X / 2), 2 ) - ( Math.sin(X) - X ) * Math.pow( Math.sin(P1) - Math.sin(P2), 2 ) / Math.pow( Math.sin(X), 2) ); 140 141 distance = A * ( X + L ); 142 var decimal_no = Math.pow(10, precision); 143 distance = Math.round(decimal_no * distance / 1) / decimal_no; 144} 145return distance; 146}

困っていることイメージ説明

ページを開くと、添付画像のようなポップアップが表示される。

##トライしたこと
Chromeの設定を確認。位置情報を許可していることを確認。
コードが古いのでは?と探してみたところ、違いすぎてどこから書き換えればいいのかわからない状態になってしまいました、、、

参考

http://webdesign-dackel.com/2015/01/18/google-maps-api/
https://developer.mozilla.org/ja/docs/Web/API/Geolocation_API

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問