在节点 js mysql 查询中传递经度和纬度和距离作为参数

Posted

技术标签:

【中文标题】在节点 js mysql 查询中传递经度和纬度和距离作为参数【英文标题】:passing longitude and latitude and distance as parameters in node js mysql query 【发布时间】:2020-11-04 12:04:03 【问题描述】:

你好,我写了这个长长的 mysql 查询,它以用户的经度、纬度和米作为输入,并显示 100 米内的位置。 但是我总是在附近得到一个mysql错误?当我在浏览器中输入http://localhost:3002/closest/20.8877387/5.847748474/100 时。有人可以给我一个提示吗?

 app.get('/closest/:lat/:lon/meters', (request, response) => 
        const lat = request.params.lat;
        const lon = request.params.lon;
        pool.query('SELECT *, ( ( ( Acos(Sin((  WHERE lat =? * Pi() / 180 )) * Sin((  map.lat* Pi() / 180 )) + Cos (( WHERE lat =? * Pi() / 180 )) * Cos(( map.lat* Pi() / 180 )) *  Cos  ((    (  WHERE lon = ? - map.lon ) * Pi() / 180 ))) ) *  180 / Pi  ()   ) * 60 * 1.1515 * 1.609344 * 1000 ) AS `METERS` FROM   base.map WHERE  "METERS" <= ?',lat,lon, (error, result) => 
            if (error) throw error;
     
            response.send(result);
        );
    );

【问题讨论】:

考虑到您在标题中声明“mysql”,我将假设这与 SQL Server 无关。 您是否尝试过直接在 MySQL 客户端程序中运行查询? @O.Jones 是的,我收到相同的错误消息,即附近存在语法错误? ,我认为WHERE lat=? 不正确 【参考方案1】:

    您似乎没有设置? 参数的值。您需要将它们作为数组作为.query(sqlStatement, parameterArray, callback) 的第二个参数提供。您的查询中有四个 ?s,因此您提供的数组必须有四个元素。 [lat, lat, lon, radius]对应你的四个?s的目的。查询中的 ? 表示条件参数。你想要的

    您的查询是这样说的。

SELECT bigFatFormula AS METERS FROM tbl WHERE METERS  < someDistance

那个 WHERE 子句不起作用。你不得不说

SELECT * FROM
         (SELECT bigFatFormula AS METERS FROM tbl) result
  WHERE METERS < someDistance

在查询的 WHERE 子句中,您的 METERS 别名不在范围内。嵌套查询将其置于范围内。

    您的查询包含一堆嵌套的 WHERE 子句。这行不通。

    您的 get 处理程序的第一行需要说明这一点,meters 上有一个冒号。

 app.get('/closest/:lat/:lon/:meters', (request, response) => 

所以,你想要这样的东西。

const lat = Number(request.params.lat);
const lon = Number(request.params.lon);
const radius = Number(request.params.meters);
var q = '
    SELECT * FROM (
        SELECT *, ( ( ( Acos(Sin(( ? * Pi() / 180 )) 
              * Sin((  map.lat* Pi() / 180 ))
              + Cos (( lat =? * Pi() / 180 )) *
                Cos(( map.lat* Pi() / 180 )) *
                Cos  (((   ? - map.lon ) * Pi() / 180 ))) )
               * 180 / Pi  ()   ) * 60 * 1.1515 * 1.609344 * 1000 ) 
                    AS METERS 
           FROM   base.map
    ) resultset WHERE METERS <= ?';

pool.query(q, [lat, lat, lon, radius], (error, result) => 

我还没有调试过这个。

专业提示:如果您的表中有很多行,您的查询会很慢。 Read this 提出建议。

专业提示:您可能希望为 lat/lng 到距离函数使用存储函数,以便下一个人更容易阅读您的查询。这是stable function。

专业提示:在尝试将此类复杂查询嵌入程序之前,最好先使用 SQL 客户端程序调试此类复杂查询。

【讨论】:

谢谢 :) 执行查询时我没有收到任何错误,但是当我在浏览器中输入带有参数的 localhost 时,我只得到一个空白页

以上是关于在节点 js mysql 查询中传递经度和纬度和距离作为参数的主要内容,如果未能解决你的问题,请参考以下文章

我有带有纬度和经度等的表名,现在我想在 mysql 查询中以半径获取数据?

MYSQL查询对GPS坐标进行排序

查找两个经度纬度之间的距离-Mysql

MySQL:多个纬度和经度的附近位置

将经度和纬度从 CLLocationManager 传递到 URL?

用于查找使用纬度和经度之间的距离的Sql返回错误的距离