
作为几乎所有在线产品的一部分,您可以完成一项任务,该任务需要使用与地图,地理编码,地理位置相关的特定服务。 就个人而言,我从事在线房地产目录工作已有近10年的时间,作为许多其他项目的一部分,我拥有使用各种在线地理服务的特定功能的经验。
在本文中,我将研究程序员最常遇到的地理任务,对提供解决这些问题的解决方案的服务进行简短回顾,并分享我使用这些服务的经验。
我还指望评论员的参与-如果您在评论中发现描述不正确,缺乏良好的服务或者只是在您已经写的内容中添加了一些内容-请在评论中写,我将收集所有内容,以便将来能长期获得大量可用的工具清单在所有场合。
目录
在网站上显示地图
一个非常流行的任务是在站点上显示在线地图。 例如,要确切显示办公室在地图上的位置。 或者,您可以在这里领取广告作者出售的东西。
为了显示地图,使用了两种主要类型的API:
- Javascript API(交互式)
- 静态API(静态)
Javascript API
我开发的所有服务都主要在俄罗斯使用,因此,我将介绍我自己使用的并且在我们中很流行的API。 我知道bing和其他地图提供程序都具有API,但是我没有使用它们。
Javascript API允许您在站点上显示交互式地图,并具有缩放,显示标记,与地图交互(拖动标记,显示工具提示等)的功能。
Javascript API Yandex.Maps
Javascript API Google Maps
2GIS API
Azure地图
地图框
静态API
静态API可以用于您只需要显示地图图片而无需交互的地方。 例如,您想将地图附加到电子邮件,或允许用户向您打印路线。 好吧,或者您的设计师绘制了一个使用地图而非背景的布局-为此类任务加载完整的JS卡似乎是多余的。 同样,静态图像可以用作预览,以加快用户页面的加载-并使页面具有交互性。
静态API Yandex.Maps
静态API Google地图
2GIS静态API
地图框
地理编码
地理编码是一个过程,可让您查找对象地址处的坐标。 好吧,还是反向地理编码-通过坐标找出在那里放置了哪种地理对象。 实际上,所有地理编码服务都可以使用以任意格式输入的地址,同时使它们达到标准。 目前,我在市场上还没有找到任何完全免费的地理编码服务。
地理编码的典型应用是在地图上显示用户输入的地址,反之亦然(反向)-用户在地图上标记后,必须将其转换为地址。
Geocoder Yandex.Map
- 每天有不超过25,000个请求的免费费用。
- 除请求数量外,它还受到许可协议的限制-编码结果无法在没有卡的情况下保存和使用(但可以缓存),它们应仅在Yandex地图上显示,并且只能在公共服务框架内显示(所有人均可访问或进行免费开放注册)。
- 在俄罗斯可直接或反向使用。
- tech.yandex.ru/maps/geocoder
来自DaData的提示
- DaData具有“提示”服务,可让您实现用户输入地址的自动完成。
- 它包括地理编码器的功能(它可以按地址提供坐标,并按坐标提供地址)。
- 它仅在俄罗斯有效,涂层是la脚的-在百万富翁中水平为75-95%,在俄罗斯平均约为50%
- 每天有10,000个请求是免费的,但该报价不允许将其完全以自动模式使用-对于自动地理编码,您需要使用标准化服务。
- dadata.ru/api/建议/地址
Google Maps Geocoding API
Graphhopper
地图框
OpenStreetMaps命题
2地理信息系统
- Javascript API的文档声明了地址解析功能的存在,但实际上我没有在文档中找到如何使用它们。 也许正在开发中。

解析和自动完成地址
有时,有必要让用户以随机格式输入地址,然后将该地址转换为结构化数据-分别指定国家/地区,城市,街道和门牌号码的名称。 这对于使用房地产的所有服务都是必需的,必须确定重复的地址,填写邮件收据等。
原则上,以上列表中的所有地理编码服务都可以毫无问题地完成此任务。 使用直接地理编码,除了坐标外,它们还返回有关找到的地理对象的结构化信息。
另外,值得注意的是DaData的“标准化”服务-从俄罗斯返回的地址返回了许多不同的有用信息,每个地址10戈比:
dadata.ru/api/clean/地址另外,我还将参考本节中有关地址的其他信息的任务。 特别是,如果我们按地址搜索广告,那么确定指定地址属于城市的哪个区域以及搜索最近的地铁站是重要的任务。
城市内区域的定义
目前,我找到了两种确定城市区域的解决方案。 两者都只对俄罗斯有效。
第一个也是最明显的是DaData。 关于此服务的文章很多,它对于使用俄语地址确实是一项很好的服务(这不是广告)。 自己尝试,确定。
如果您不想依赖第三方服务,那么我已经应用了另一种解决方案,并且至今仍在继续应用。 这是
OKATO地址所定义的区域。 俄罗斯境内的每个地址都有其自己的OKATO代码-11位数字。 其中,前5-8位(视城市而定)清楚地指示了该区域。
对于我需要的那些城市,我只是编译了各地区的OKATO代码数据库,就得到了这样的数组:
下一个问题是如何找出OKATO地址代码? DaData将其作为“提示和标准化”服务的一部分返回。 有一个站点
okato-oktmo.rf ,该站点的地址使用相同的数据显示OKATO代码。 我们的任务是独立于地址查找OKATO代码,而不考虑任何服务。
为此,我们需要下载最新的
FIAS数据库并在其上进行搜索。 该中心上已有一篇文章,提供了有关
如何在MSSQL中导入FIAS数据库的示例。 通常,您可以通过FIASU配置搜索,在此处找到所需的地址,然后通过您知道该地区的地区列表中的OKATO代码找到其OKATO代码-就是这样,问题已解决。
如果您不希望花60兆字节的XML文件下载到数据库中,那不如使用dadata服务便宜,但功能少,可以使用FIAS数据库进行操作:
kladr-api.ru/docs搜索附近的地铁站
当您需要在该地址查找最近的地铁站时,此功能非常必要,尤其是对于莫斯科居民而言。 目前,对于此任务,我知道两种解决方案:
Yandex地理编码器
首先,您需要找出地址坐标。 然后,与反向地理编码一样,我们将这些坐标作为请求参数以及返回的地名的类型kind = Metro传递。
一个单独的参数设置需要搜索最近的电台的区域的大小。 根据经验,我根据城市选择从0.02到0.05度的值(在莫斯科,离地铁2公里的半径仍被视为步行距离,而在喀山,车站之间的距离为1.5公里)。
这种方法还有一个问题,有时坐标上最近的地铁实际上并不总是最接近的(例如,它在河的另一侧,或类似的东西)。 您只能使用建筑路线和距离矩阵服务来通过可访问性确定最近的地铁,这将在下面的文章中进行讨论。 粗略确定最近的电台-Yandex地理编码器非常适合,您每天最多可以免费执行25,000个请求。
大数据
是的,DaData可以帮助您完成此任务-作为“及时”或“标准化”服务的有偿资费的一部分,最近的3个地铁站及其附近的距离也会返回到每个地址。
搜索组织
如果您想向客户展示他所在城市的某种组织,这是一项常见的任务。 例如,您出售带有交货的货物,并且想要向某人显示某城市中某项服务的所有交货点。 或者,您可以制作要打印的布局,然后在地图上向用户显示所有印刷厂的用户,他可以去打印您的布局。
Yandex按组织搜索
Google Places API
2地理信息系统
有传言说他们有一个付费的私有API用于搜索组织。 我尚未设法访问它,并且从Yandex搜寻组织的人员已经足够我们的任务。
IP用户位置
网络上的一项常见任务是了解访问者来自哪个城市的站点。 对于那些不希望依赖第三方服务的人,可以使用联机服务或独立解决方案的形式来完成此任务。
通过IP确定城市的在线服务-在这里我可以再次建议(对于俄罗斯)DaData:
dadata.ru/api/detect_address_by_ip每天限制为10,000个请求。 如果每天的出勤人数超过10,000个唯一条目,则考虑服务器上安装的解决方案是有意义的。 您可以在
DaData评论中了解有关它们如何选择使用内容的更多信息。
我将简要复制这些信息:
IpGeoBase-曾经是一个不错的网站,每天进行更新,并以易于理解的机器可读格式提供ip地址及其所属城市的数据库,该数据库可轻松导入任何数据库中。 不幸的是,它于2017年停止更新。
ipgeobase.ruSypexGeo-仍在更新中,它以其自身格式的php脚本和数据库的形式出现。 运作迅速,运作良好
sypexgeo.net/zh/下载MaxMind提供以较低的准确性下载免费的数据库,并以各种编程语言为它们提供单独的API。 作为付费产品的一部分,可以使用更准确的数据库。
dev.maxmind.com/geoip/geoip2/geolite2通过坐标确定用户的位置
该任务与反向地理编码的任务相似,但有细微差别。
有时,当我们确切地知道用户的坐标时,我们需要确定用户的位置(例如,使用设备的GPS传感器或浏览器中的Geolocation API获取用户的坐标)。 有两个选项-反向地理编码可返回用户所在位置的名称。 但是,如果用户位于城市之间的高速公路上,郊区或仅在干净的地方,并希望看到该领域出售土地的广告,会发生什么? 反向地址解析器并不一定会对此进行处理。
在这种情况下,我本人就是这样做的-我在数据库中拥有我们有广告以及通常与之合作的俄罗斯城市的所有坐标。 根据用户的坐标,我只需通过一个简单的请求即可从我们的数据库中确定距离他最近的城市:
ORDER BY (|lng - :lng| + |lat - :lat|) ASC LIMIT 1
路线建设
有时您需要构建从一个点到另一个点的路线。 例如,创建一个从用户位置到您办公室的位置图。 Yandex和Google提供了付费解决方案-它们的主要区别是Yandex出售按年付款的订阅服务,Google每月按件收费,并每月从卡中扣除款项。
Google还具有高级订阅,该订阅提供了一些附加功能(例如,增加Static API图像的最大大小)和限额存款。 2GIS还提供了一种解决方案-就建造1条路线而言,这是最昂贵的。
构建路线的任务分为几个子任务:
- 建立点到点的路线是可以理解的
- 距离矩阵-一种服务,可让您建立一组出发点和到达点之间的距离和运输时间矩阵。 例如,如果您需要为几个快递员计算最佳路线,这些快递员需要将货物从不同的仓库运送到不同的客户。 还是您提供清洁服务,您需要找出哪种清洁剂将更方便地从家中获取今天的每个订单,并为移动清洁剂制定最佳方案。
- Isochrone API-围绕一个点区域构建,可以在同一时间到达。 例如,“在距离用户位置15分钟的步行路程内找到所有咖啡馆”。
不同的提供者为所有这些任务提供不同的解决方案。
感谢
3aiats ,找到了免费的开源解决方案-
Graphhopper
Yandex
Yandex所有航线服务的一个共同特点是,它们在俄罗斯,阿布哈兹,阿塞拜疆,亚美尼亚,白俄罗斯,格鲁吉亚,哈萨克斯坦,吉尔吉斯斯坦,摩尔多瓦,塔吉克斯坦,土耳其,乌兹别克斯坦和乌克兰运营。
有一个
app.swizz.ru服务,该服务使用Yandex API构建路线。 该服务没有自己的API,并且遇到了Yandex的限制问题,但从本质上讲,您可以看到Yandex路由构建器在那里的工作方式。 谢谢你的链接
3aiats谷歌
与Yandex的主要区别在于即用即付定价,即针对每个请求。 对于小批量交易,与Google相比,大幅度增加关税-与Yandex相比,将更有利可图。
此外,Google对其建立路线的国家没有限制。
Google Directions API
Google Distance Matrix API
Google Roads API
一项独特的Google服务,可让您处理车辆行驶的道路。
自动将路线的各个点链接到道路,显示最佳的交通方式以及关于您在途中遇到的路段的所有信息。
它知道如何将最近的路段绑定到这些点(例如,在GPS轨道上来回跳动以显示路线实际越过了哪些道路)。
能够显示路线上道路的速度限制。
WikiRoutes
Azure地图
2Gis物流
物流优化服务
作为构建路线的单独服务类别,值得重点介绍现成的用于优化物流的解决方案,这些解决方案基于生产线上的快递员/车辆的数量来收费。 实际上,它们结合了路线构建工具和其他服务来尽可能优化您的物流。 这些是非常复杂且细分的解决方案,因此我将它们合并为一个列表。
感谢您
添加到列表
3aiats结论
在当今世界,您几乎可以找到需要解决的任何任务的现成服务,也可以使用以上列表中的服务组合来解决它。 唯一的问题是该解决方案的成本,它将为您带来多少收益。
随着服务的普及,越来越多的服务开始转向更加严格的货币化系统-正如Google曾经免费的Google地图已完全支付费用一样,Yandex也正逐步朝着这一方向发展。
有开放的OpenStreetMaps,似乎可以使您解决列表中的所有问题,但是为此您需要自己部署它们,除了您的项目之外,还要单独维护整个地图基础设施-必要时,每个人都可以自己决定。
可能在该评论中,我没有指出您使用的某些优质服务,或者您使用了该评论中的服务,并且您可以在已编写的内容中添加一些内容-在评论中添加内容,我将在文字中添加内容。