如何使用空间来搜索邮政编码的半径?

2024-03-20

背景

我正在编写一个应用程序,用于查找邮政编码特定半径内的事件。您可以将其想象为 Ticketmaster,您输入邮政编码,x 半径内的所有音乐会都会显示出来。

我有一个数据库表,其中包含邮政编码以及每个邮政编码的纬度和经度。我还有一个“EventListings”表,其中每个“事件”都有一个邮政编码字段。

Problem

目前,我在服务层的 Linq-to-Entities 查询中使用半正矢公式来查找半径内的事件。现在,我将它用作 where 子句中的过滤器。我还想将其放在 select 子句中,以便在网站上我可以显示“这是 4.6 英里远”等。

我无法将此代码移动到单独的 C# 方法中,因为 Linq-to-Entities 会抱怨它无法将其转换为 sql,因此我也需要在 select 语句中复制整个公式。这是非常丑陋的。我尝试修复它。

我尝试过的

我编辑了实体,并添加了一个特殊的标量属性“DistanceFromOrigin”。然后,我创建了一个存储过程,它带回所有实体数据,以及新字段“DistanceFromOrigin”的硬编码值(用于测试目的)。

然后我意识到我无法告诉实体框架使用我的存储过程作为其在 EventListings 实体上的 select 语句... Phil 建议使用空间,所以这就是我所采用的。

Question

如何使用 Spatials 搜索邮政编码半径范围内的事件?


因此,根据 Phil 的建议,我使用空间重写了很多内容。效果很好,您只需要 .NET4.5、EF5+ 和 sql server(我相信是 2008 年及以上版本)。我正在使用 EF6 + Sql Server 2012。

Set-Up

第一步是添加一个Geography列到我的数据库EventListings表(右键单击它 - >设计)。我将我的位置命名为:

接下来,由于我使用数据库优先的 EDM,因此我必须更新模型以使用我创建的新字段。然后我收到一个关于无法将 Geography 转换为 double 的错误,因此我修复它的方法是选择实体中的 Location 属性,转到其属性并将其类型从 double 更改为Geography:

在半径范围内查询并添加带有位置的事件

然后你所要做的就是像这样查询你的实体集合:

 var events = EventRepository.EventListings
                             .Where(x => x.Location.Distance(originCoordinates) * 0.00062 <= radiusParam); 

Distance 扩展方法获取从当前对象到您传入的“其他”对象的距离。该其他对象的类型为DbGeography。您只需调用一个静态方法,它就会创建其中一只小狗,然后将您的经度和纬度作为一个点放入其中:

DBGeography originCoordinates = DBGeography.fromText("Point(" + originLongitude + " " + originLatitude + ")");

这不是我创建 originCoords 的方式。我下载了一个单独的数据库,其中包含所有邮政编码及其纬度和经度的列表。我添加了一列类型Geography对此也是如此。我将在本答案的最后展示如何操作。然后,我查询邮政编码上下文,以从 ZipCode 表中的 Location 字段获取 DbGeography 对象。

如果用户想要一个比邮政编码更具体的来源,我会调用 Google Maps API(更具体的是 GeoCode)并通过 Web 服务获取用户特定地址的纬度和经度,并从创建一个 DBGeography 对象响应中的纬度和经度值。

我在创建活动时也使用 google API。在将我的实体添加到 EF 之前,我只是像这样设置了位置变量:

someEventEntity.Location = DBGeography.fromText("Point(" + longitudeFromGoogle+ " " + latitudeFromGoogle + ")");

其他提示和技巧以及故障排除

我如何获得距离延伸法?

获取扩展方法Distance您必须添加对您的项目的引用:System.Data.Entity执行此操作后,您必须添加使用:using System.Data.Entity.Spatial;到你的班级。

The Distance扩展方法返回距离米的计量单位(我认为你可以更改它,但这是默认的)。在这里,我的半径参数以英里为单位,因此我做了一些数学转换。

Note: 有一个DBGeography班级在System.Data.Spatial。这是错误的这对我不起作用。我在网上找到的很多例子都使用了这个。

如何将纬度/经度转换为地理列

所以,如果你像我一样下载了一个包含所有信息的邮政编码数据库Latitude & Longitude列,然后意识到它没有地理列......这可能会有所帮助:

1) 在表中添加位置列。将类型设置为地理。

2)执行以下sql

UPDATE [ZipCodes]
SET Location = geography::STPointFromText('POINT(' + CAST([Longitude] AS VARCHAR(20)) + ' ' + CAST([Latitude] AS VARCHAR(20)) + ')', 4326)

如何查看地理项目的详细信息

因此,当您插入一些 DbGeography 项目后在 Sql Server Management Studio 中查询 EventListings 表时,您将看到Location列包含一个十六进制值,例如:0x1234513462346。当您想确保插入正确的值时,这不是很有帮助。

要实际查看该字段的纬度和经度,您必须像这样查询它:

SELECT Location.Lat Latitude, Location.Long Longitude
FROM [EventListings]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用空间来搜索邮政编码的半径? 的相关文章

随机推荐

  • 使用 API 3.0 实现 Mailchimp 双选择加入

    我正在寻找一个舒适的方式意识到通过 mailchimp API 3 0 双重选择加入 看起来 2 0 版本中有一个选项 它告诉 mailchimp 在通过 API 调用添加新成员后自动发送选择加入确认电子邮件 好像这个参数在API 3 0中
  • 查询多个具有复杂关系的表

    我想要的查询超出了我的 SQL 知识 所以我希望在这里得到一些帮助 我想在 postgreSQL 9 2 中将多个表的关系合并为一个表 我知道程序 但不知道SQL 此查询将包含 4 个表 愿望清单 与一个或多个列表相关联并且具有首选商店 愿
  • 作为应用程序池回收的一部分,MVC3 DLL 被“遗忘”

    我们正在努力获得Glimpse http getglimpse com 在我们的环境中启动并运行 但遇到一个奇怪的问题 我们已经安装了 Glimpse Core Glimpse AspNet 和 Glimpse Mvc3 dll 当我们配置
  • magrittr 中 %>% 和 %,% 有什么区别?

    magrittr 的 Github 开发版本包含一些很酷的新管道功能 但我并没有完全理解两者之间的区别 gt and 这只是正式的吗 gt 为了价值和 对于功能 或者有一些特定的特性 正常的管道操作员是 gt 您可以使用 创建一个可重复使用
  • 如何创建带有彩色分支的树状图?

    I would like to create a dendrogram in R which has colored branches like the one shown below 到目前为止 我使用以下命令来创建标准树状图 d lt
  • VS2012和性能分析器有什么问题?

    我正在尝试做一些性能 对一段代码的分析太慢了 我以管理员身份启动 VS2012 Premium 加载我的解决方案 然后转到 分析 启动性能向导 立即显示一个对话框 其中显示 Could not load file or assembly V
  • 更改 kotlin 中重写函数参数的可为空性

    我正在实现第三方库 java 的接口 我正在使用以下签名重写函数 override fun onCallback name String 我可以更改为以下内容 而编译器不会抱怨 override fun onCallback name St
  • 如何在 scala 中模拟静态函数(对象函数,而不是类函数)

    Object A def a something I ve import A but still have error message not found type A val x mock A 你不知道 不仅A不是类型或类 它是一个实例
  • 在 tidyr 中取消一列列表到多列的嵌套

    例如 我有一个像这样的整洁的数据框 df lt tibble id 1 2 ctn list list a x b 1 list a y b 2 A tibble 2 x 2 id ctn
  • 输出到 Excel 文件而不覆盖工作表

    我正在运行一个 python 脚本 该脚本当前执行三个单独的操作并将每个结果输出到不同的 Excel 文件 是否可以将我的所有输出放在不同工作表上的一个 Excel 文件中 似乎最新的结果总是覆盖整个Excel文件 以下是我的想法 df f
  • 如何设置CKEditor 5(经典编辑器)的高度

    在 CKEditor 4 中 有一个配置选项可以更改编辑器高度 配置高度 http docs ckeditor com api CKEDITOR config cfg height 如何更改 CKEditor 5 的高度 经典编辑器 回答我
  • Boost asio架构文档

    有谁知道 boost asio 的良好架构文档吗 我在 boost documentation 中找到的只是有关 api 以及如何使用它们的内容 我想更深入地了解它们背 后的概念 如果我忽略了 boost 文档 请让我知道正确的资源 以下是
  • 有Windows Azure本地开发环境吗?

    我记得我偶然发现过一个页面 上面说 Mi crosoft 发布了一个应用程序 允许您在本地测试 Windows Azure 的客户端应用程序 该应用程序将充当模拟 Windows Azure 环境 您可以使用本地端点来连接到它 有谁知道它是
  • 反序列化只读变量

    我有这样的课程 public class Pussy public readonly int Meows JsonConstructor private Pussy public Pussy int meows this Meows meo
  • Bash 的 `set -e` 的 Powershell 类似物

    如何让 Powershell 表现得像带有标志的 Bashset e set o errexit创建一个 Bash 脚本 如果简单命令以非零状态退出 则立即退出 我想我可以通过设置来做到这一点 ErrorActionPreference S
  • 如何解释 MIDI 文件分析的参数值,尤其是“midi.NoteOnEvent”的“数据”字段?

    我正在尝试使用工具包分析 MIDI 文件python midi for python 链接到存储库 https github com vishnubob python midi 基本上 我的问题是关于数据的解释我刚提取出来 这是数据 mid
  • 如何用mongoose获取MongoDB中findAndModify函数的返回值?

    我使用 Node js mongoose MongoDB 如下所示 SomeModelSchema statics findAndModify function query sort doc options callback return
  • 使用 OpenGL 从矩阵绘制热图的最有效方法?

    假设一个矩阵m整数值 m lt matrix sample 1 10 100 replace TRUE nrow 10 给定一个将这些值从 1 到 10 映射到某些颜色的调色板 如何显示矩阵m作为带有 OpenGL 图形的 R 热图 例如使
  • 定义自定义指标来计算“tensorflow.keras”的“几何平均分数”的问题

    我正在研究tensorflow keras 中的不平衡分类问题 我决定按照建议计算 几何平均分数 这个答案经过交叉验证 https stats stackexchange com a 289132 233268 我找到了一个其实施 http
  • 如何使用空间来搜索邮政编码的半径?

    背景 我正在编写一个应用程序 用于查找邮政编码特定半径内的事件 您可以将其想象为 Ticketmaster 您输入邮政编码 x 半径内的所有音乐会都会显示出来 我有一个数据库表 其中包含邮政编码以及每个邮政编码的纬度和经度 我还有一个 Ev