【问题标题】:Use script to compare coordinates from client API against DB使用脚本将来自客户端 API 的坐标与 DB 进行比较
【发布时间】:2021-10-24 22:58:32
【问题描述】:

我正在尝试将数据库中某个事件的坐标与用户从其客户端 API 发送的坐标进行比较(在批准后),但不知道如何正确设置比较。现在,用户坐标只是在终端登录:

这是我在 guestValidate.js 下的脚本:

if(confirm('Compare wants to use your current location to briefly checkin. Do you approve?')) {
    navigator.geolocation.getCurrentPosition(function (position) {
        console.log(position.coords.latitude)
        console.log(position.coords.longitude)
    }) 
} else { 
console.log("The Locator was denied.");
}

console.log(eventCoords)

这是我运行 ejs 的页面:

<% layout('layouts/boilerplate') %> 

<h1>Prompt</h1>

<script>
    const eventCoords = '<%- event.geometry.coordinates %>'
    const eventID = '<%- event.id %>';
</script>


<script src="/javascripts/guestValidate.js"></script>

我附上了下面终端的输出。两者都在工作我只需要将它们构造为对象并进行比较,我想?有人可以帮我比较一下这两组坐标吗?

如果它们相等,我想将“true”发送回数据库路由。

【问题讨论】:

  • 你想从哪个api获取用户以前的位置,比较之后你想提交到哪个api?
  • 它从我的 guestValidate.js 脚本中提取 if else。现在它正在记录 position.coordinates.lattitude & longitude。我需要以某种方式将该数据与 eventCoords 进行比较。有什么想法吗?

标签: javascript node.js express mongoose


【解决方案1】:

如果场地相对较小或形状不奇怪,一种方法是选择场地中心的纬度/经度,并允许从该点开始您认为合理的半径。您可能需要一些空间来解决位置不准确的问题,因为用户位置服务有时可能不可靠。这在混凝土建筑的室内尤其常见。

您可以只使用the Haversine formula,但由于地球实际上不是一个球体,并且您正试图在我认为相对较小的位置进行检查,因此球体的haversine 的潜在错误使使用它变得很糟糕主意。 (误差可能高达 0.3%,听起来还不错,但地球很大,所以误差可达 20 公里)。

相反,我会推荐 Chris Veness 在https://github.com/chrisveness/geodesy 提供的一个很酷的库@

如果你有兴趣,这里有关于这个库背后的数学的完整解释供你使用:https://www.movable-type.co.uk/scripts/latlong-vincenty.html

在您的情况下,如果您想在浏览器中进行此比较,用法如下所示:

<script src="https://cdn.jsdelivr.net/npm/geodesy@2.2.1/latlon-ellipsoidal-vincenty.js"></script>
<script type="module">
  import LatLon from 'https://cdn.jsdelivr.net/npm/geodesy@2.2.1/latlon-ellipsoidal-vincenty.js';

  function getDistanceBetweenPoints(user, venue) {
    const p1 = new LatLon(user.lat, user.lon);
    const p2 = new LatLon(venue.lat, venue.lon);
    return p1.distanceTo(p2);
  }

  let user = { lat: 30.2696082, lon: -97.7521805 };
  let venue = { lat: 30.2699360, lon: -97.7485410 };

  console.log(`Distance between user and venue is ${getDistanceBetweenPoints(user, venue)} meters`);
</script>

此示例使用您上面提供的坐标导致用户与场地之间的距离约为 352 米。现在,根据捕获这些坐标时用户是否被认为实际在场地,这可能非常准确,或者向您显示我之前提到的用户设备不准确。

还有一点,用户可以在技术上欺骗他们的位置,所以我不建议将其用于任何与安全相关的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2021-11-14
    • 2022-01-21
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多