使用MySql或Postgres获取给定半径内的日志

使用MySql或Postgres获取给定半径内的日志,mysql,sql,postgresql,geolocation,postgis,Mysql,Sql,Postgresql,Geolocation,Postgis,我有下表,其中纬度和经度字段指定了地图上的一个点 |id |latitud |longitud | | --- | ------ --------| ---------------- | | 001 |19.4400570537131|-99.1270470974249 | | 002 |19.437904276995 |-99.1286576775023 | | 003 |19.4360705910348|-99.1297865731994 | | 00

我有下表,其中纬度和经度字段指定了地图上的一个点

|id   |latitud         |longitud         |
| --- | ------ --------| ---------------- | 
| 001 |19.4400570537131|-99.1270470974249 | 
| 002 |19.437904276995 |-99.1286576775023 |
| 003 |19.4360705910348|-99.1297865731994 |
| 001 |19.4424869116657|-99.1238332599196 |
我需要进行一个查询,返回1000米半径内点(19.4400570537131,-99.1270470974249)周围的记录数

如果MySQL无法实现,我可以在PostgreSQL中使用PostgreSQL(使用PostGIS),调用您要查找的函数。要将其与米一起使用,您必须将坐标设置为以米为单位的坐标,或者使用
地理
而不是
几何
。下面的示例创建了一个查询时间内的点,将其强制转换为
geography
,并使用
ST_DWithin
和问题中提到的1000米半径内的点应用过滤器

WITH j (id,lat,lon) AS ( VALUES
  (001,19.4400570537131,-99.1270470974249),
  (002,19.437904276995 ,-99.1286576775023),
  (003,19.4360705910348,-99.1297865731994),
  (001,19.4424869116657,-99.1238332599196)
) 
SELECT 
  id,
  ST_Distance(
    ST_MakePoint(lon,lat)::geography,
    ST_MakePoint(-99.1270470974249,19.4400570537131)::geography) AS distance,
  ST_MakePoint(lon,lat)::geography AS geom
FROM j 
WHERE ST_DWithin(
        ST_MakePoint(lon,lat)::geography,
        ST_MakePoint(-99.1270470974249,19.4400570537131)::geography,1000);

 id |   distance   |                        geom                        
----+--------------+----------------------------------------------------
  1 |            0 | 0101000020E6100000781F268A21C858C067123E94A7703340
  2 | 292.22521599 | 0101000020E61000001C5069ED3BC858C0D878A47E1A703340
  3 |   526.781174 | 0101000020E61000007CD6576C4EC858C0EA3D7F52A26F3340
  1 |  431.5655003 | 0101000020E6100000C16056E2ECC758C021837ED246713340

注意:我强烈建议您将这些点存储在
几何体
地理
列中,并对其进行适当索引。在查询时使用分离的纬度和经度值创建几何体会产生不必要的开销,并且可能会显著降低查询速度。此外,如果你不在显微镜领域工作,考虑减少你的点的精度;) 进一步阅读:


您的纬度(194400570537131)和经度(-991270470974249)值的单位是什么?请回答你的问题。它们看起来不像十进制度数或某种UTM坐标系。同时在一般问题上,我省略了逗号。非常感谢您的赏识。这个问题似乎已经在这里得到了回答:;在这里: