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