我正在使用此工具Drawing Tool places在地图中绘制地点,我正在尝试获取覆盖用户位置的地方。
例如:
每个形状都有long / lat数组,我已将它们添加到places表中,例如橙色形状数组是:
cursel: polygon [object Object]; pos: undefined ; path: [ 53.750107,-1.459851 , 53.750842,-1.461568 , 53.749954,-1.461825 , 53.749751,-1.464272 , 53.749117,-1.466203 , 53.748812,-1.469336 , 53.742493,-1.466074 , 53.738686,-1.46337 , 53.739143,-1.4538 , 53.740539,-1.45247 , 53.746985,-1.452899 , 53.749345,-1.455903 , 53.749218,-1.458092 ,
用户位置是:53.746858,-1.46513
**放置表记录:**
placeId | long | lat
1 | 53.750919 | -1.471567
1 | 53.749675 | -1.473541
1 | 53.749066 | -1.472383
........
2 | 53.750107 | -1.459851
2 | 53.750842 | -1.461568
2 | 53.749954 | -1.461825
2 | 53.749751 | -1.464272
.......
我在做这个查询:
select * from places where lat > '$lat' AND long < '$long'
这是表格结构:
//Place Name and ID
CREATE TABLE IF NOT EXISTS `place` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name ` varchar(70) NOT NULL
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
//Place Long/Lat borders <<-- here where i store the Array of long/lat of the place after it being draw
CREATE TABLE IF NOT EXISTS `places` (
`id` int(10) unsigned NOT NULL,
`lat ` varchar(70) NOT NULL,
`long ` varchar(70) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
我的问题与mysql查询如何获得正确的位置 如果其覆盖用户位置
,则在其范围内
非常感谢任何想法
答案 0 :(得分:2)
select * from places where lat > '$lat' AND long < '$long'
仅检查[$ lat,$ long]的西北方向。因此,它或它的任何变体对于这个问题可能都是无用的。
在SPATIAL
上制作the_polygon
索引。
使用WHERE ST_Within(user_point, the_polygon)
确定用户是否在多边形中。
如果您需要更多帮助,请提供SHOW CREATE TABLE
,以便我们在上下文中进行讨论。
答案 1 :(得分:1)
正如@Rick James所说使用Spatial Data Types。
表架构:
CREATE TABLE IF NOT EXISTS `place` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(70) NOT NULL,
`geometry` polygon NOT NULL,
PRIMARY KEY (`id`),
SPATIAL INDEX `si_place_geometry` (`geometry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
添加地点记录:
INSERT INTO `place`(
`name`,
`geometry`)
VALUES (
'area01',
POLYGON(
LINESTRING(
POINT(53.750107, -1.459851), POINT(53.750842, -1.461568),
POINT(53.749954, -1.461825), POINT(53.749751, -1.464272),
POINT(53.749117, -1.466203), POINT(53.748812, -1.469336),
POINT(53.742493, -1.466074), POINT(53.738686, -1.46337 ),
POINT(53.739143, -1.4538 ), POINT(53.740539, -1.45247 ),
POINT(53.746985, -1.452899), POINT(53.749345, -1.455903),
POINT(53.749218, -1.458092), POINT(53.750107, -1.459851))
)
);
查询语句可能是这样的:
SELECT *
FROM `place`
WHERE ST_Within(POINT(53.746858, -1.46513), `geometry`);
*************************** 1. row ***************************
id: 1
name: area01
geometry: ...binary data...
1 row in set (0.00 sec)
答案 2 :(得分:0)
由于您有一个places
表,其中包含每个place
的所有位置,因此您只需从places
表中检索用户位置即可找出正确的位置。
SELECT id, name
FROM place
WHERE id = (SELECT id FROM places WHERE lat = '$lat' AND long = '$long');
如果此用户未在places
表格中的某个位置找到,您将获得空结果集。
此外,为了获得更好的效果,我建议您将varchar(70)
替换为float
或double
,并为每个位置创建索引,例如: UNIQUE KEY location (lat, long)
。