[英]How to display the nearest latitude and longitude to my location using javascript?
[英]How to find nearest location using latitude and longitude from a json data
我正在嘗試創建一個詢問用戶位置的網站,然后使用 GeoLocation 從其位置找到最近的位置(半徑 100m)並以 HTML 顯示結果。
我嘗試過的。
$.getJSON("places.json", function (data) {
for (var i = 0; i < data.length; i++) {
if ((data[i].lat - poslat) > 0.00200 || (data[i].lng - poslng) > 0.00200) {
return data[i];
}
html += '<p>' + data[i].location + ' - ' + data[i].code + '</p>';
$('#nearbystops').append(html);
}
});
地點.json
[
{
"code": "0001",
"lat": "1.28210155945393",
"lng": "103.81722480263163",
"location": "Stop 1"
},
{
"code": "0003",
"lat": "1.2777380589964",
"lng": "103.83749709165197",
"location": "Stop 2"
},
{
"code": "0002",
"lat": "1.27832046633393",
"lng": "103.83762574759974",
"location": "Stop 3"
}
]
先感謝您! :)
要計算兩個坐標之間的距離,您不能只減去這些值。 這很好,但它為您提供了正方形內的坐標。 這可能是合適的,但大多數人確實傾向於按半徑搜索位置。 這個功能會做到這一點......
function distance(lat1, lon1, lat2, lon2, unit) {
var radlat1 = Math.PI * lat1/180
var radlat2 = Math.PI * lat2/180
var theta = lon1-lon2
var radtheta = Math.PI * theta/180
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
if (dist > 1) {
dist = 1;
}
dist = Math.acos(dist)
dist = dist * 180/Math.PI
dist = dist * 60 * 1.1515
if (unit=="K") { dist = dist * 1.609344 }
if (unit=="N") { dist = dist * 0.8684 }
return dist
}
這是我從這里復制的一段常見代碼......
https://www.geodatasource.com/developers/javascript
在這里,在您的示例中使用...
function distance(lat1, lon1, lat2, lon2, unit) { var radlat1 = Math.PI * lat1/180 var radlat2 = Math.PI * lat2/180 var theta = lon1-lon2 var radtheta = Math.PI * theta/180 var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); if (dist > 1) { dist = 1; } dist = Math.acos(dist) dist = dist * 180/Math.PI dist = dist * 60 * 1.1515 if (unit=="K") { dist = dist * 1.609344 } if (unit=="N") { dist = dist * 0.8684 } return dist } var data = [{ "code": "0001", "lat": "1.28210155945393", "lng": "103.81722480263163", "location": "Stop 1" }, { "code": "0003", "lat": "1.2777380589964", "lng": "103.83749709165197", "location": "Stop 2" }, { "code": "0002", "lat": "1.27832046633393", "lng": "103.83762574759974", "location": "Stop 3" }]; var html = ""; var poslat = 1.28210155945393; var poslng = 103.81722480263163; for (var i = 0; i < data.length; i++) { // if this location is within 0.1KM of the user, add it to the list if (distance(poslat, poslng, data[i].lat, data[i].lng, "K") <= 0.1) { html += '<p>' + data[i].location + ' - ' + data[i].code + '</p>'; } } $('#nearbystops').append(html);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <div id="nearbystops"></div>
使用 HTML5 地理定位獲取當前用戶的位置,並在 100 米內找到最近的位置。
在谷歌地圖庫下面包含和使用
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&libraries=geometry"> </script>
片段
//calculates distance between two points in km's
function calcDistance(p1, p2) {
return (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
}
function getPosition(position) {
var userPosition = {
lat: position.coords.latitude,
lng: position.coords.longitude
};
$.getJSON("places.json", function(data) {
for (var i = 0; i < data.length; i++) {
var p1 = new google.maps.LatLng(userPosition.lat, userPosition.lng);
var p2 = new google.maps.LatLng(data[i].lat, data[i].lng);
var distance = calcDistance(p1, p2) * 1000;
if ((distance * 1000) <= 100) {
html += '<p>' + data[i].location + ' - ' + data[i].code + '</p>';
$('#nearbystops').append(html);
}
}
})
}
// get user's current latitude & longitude
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(getPosition);
} else {
alert("Geolocation is not supported by this browser.");
}
}
getLocation();
為了計算兩點(緯度,經度)之間的距離,在打字稿中實現了半正弦公式的函數。
//There are 6200 points in the JSON file
import data from './json/test.json';
let radians = function (degree: number) {
// degrees to radians
let rad: number = degree * Math.PI / 180;
return rad;
}
const haversine = (lat1: number, lon1: number, lat2: number, lon2: number) => {
let dlat, dlon, a, c, R: number;
R = 6372.8; // km
dlat = radians(lat2 - lat1);
dlon = radians(lon2 - lon1);
lat1 = radians(lat1);
lat2 = radians(lat2);
a = Math.sin(dlat / 2) * Math.sin(dlat / 2) + Math.sin(dlon / 2) * Math.sin(dlon / 2) * Math.cos(lat1) * Math.cos(lat2)
c = 2 * Math.asin(Math.sqrt(a));
return R * c;
}
let test = function () {
const keys = Object.keys(data);
let count: number = keys.length;
for (var _i = 0; _i < count; _i++) {
var _dummy: number = haversine(
36.12, -86.67, data[_i].position.lat, data[_i].position.lng);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.