mysql谷歌地图查询存储在用户位置自定义绘图工具?

时间:2018-01-21 09:44:23

标签: mysql google-maps maps

我正在使用此工具Drawing Tool places在地图中绘制地点,我正在尝试获取覆盖用户位置的地方。

例如:

用户不在粉色或橙色形状内。 (地方) enter image description here

第二个形状内的用户(橙色位置) enter image description here

每个形状都有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查询如何获得正确的位置   如果其覆盖用户位置

,则在其范围内

非常感谢任何想法

3 个答案:

答案 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)替换为floatdouble,并为每个位置创建索引,例如: UNIQUE KEY location (lat, long)