我正在开发一个网站,该网站必须使用谷歌API进行地址,地理位置和可能的地理围栏。
这对我来说是个问题。
- 用户在网站上注册并表示他将在A位置工作,并在该位置周围5公里处工作。 - 消费者搜索网站,看看他是否可以找到位置B的某个人。现在,位置B可能会落在位置A周围5公里范围内,而不是再次没有。
问题很明显。我怎么知道位置B在位置A的半径5公里处?
现在,让我们稍微调整一下。
所以现在我们有多个用户,每个用户都有自己独特的工作半径。只有用户A,B和C可以在我们搜索的地方工作。用户D不能!
实现这一目标的最佳方法是什么?
这将是我所拥有的信息。 - 用户的所有位置及其工作半径。 - 我们正在搜索的位置。
我正在寻找这里的抽象解决方案,并且可能链接到某些类似于我在这里要求的教程。
如果我在这个问题上放错了标签,请告诉我,以便我可以纠正它们。你必须原谅我,但我不熟悉这种问题。
答案 0 :(得分:0)
所以我设法提出了一个解决方案,我不做计算,而是依赖数据库。由于这是SQL Server(我不知道其他数据库提供程序是否可用),我将使用名为geography的数据类型。
我可以这样创建表格
USE [Test]
GO
/****** Object: Table [dbo].[Address] Script Date: 19.2.2016. 13:10:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Address](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Location] [geography] NOT NULL,
[Radius] [decimal](7, 2) NOT NULL,
CONSTRAINT [PK_Adresa] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
我可以像这样在表中插入一些值
INSERT INTO Address(Location, Radius)
VALUES(geography::Point(43.0026805, 17.2788935, 4326), 2);
之后是查询表格。在我进行查询之前,我需要初始化地理数据类型。 这将是如何查询此表的示例
GO
DECLARE @p GEOGRAPHY = geography::Point(42.9945355, 17.2634869, 4326)
SELECT *, Location.STBuffer(Radius * 1000).STIntersects(@p) as Valid
FROM Address
这是我能提出的最佳选择。我相信它比手动执行数学运算更快,尽管我没有看到数据库会以任何方式避免这些操作。这里唯一的区别是我可以在spacegraphy数据类型上放置空间索引,这样可以更快地执行。