Yandex地图用于出租车应用

对于大多数使用地理位置,地图和方向的应用程序,我更喜欢Google地图。 因为Google Maps具有广泛的功能集,完善的文档以及用于实现任何视觉和编程思想的出色Mapkit。 不幸的是,谷歌地图并不是解决所有可能任务的灵丹妙药。 问题是公司无法完全理解某些地区,城市等,因此,可能无法提供房屋编号,甚至整条街道。

在图。 1您可以考虑在Google Maps和图2中一个市区的样子。 2您可以看到同一区域仅在Yandex地图上的外观。

图片
无花果 1个

图片
无花果 2

以我的观点,这种差异可以通过肉眼看到,可以立即看出,由于某些原因,Google的地图没有/可能/想要绘制出城市的这一部分,而且如您所见,它缺少门牌号和街道名称。

由于对于出租车应用程序而言,拥有有关城市及其街道(公司,机构等)的最可靠信息非常重要,因此决定使用Yandex卡。 不管我使用Yandex卡有多长时间,这种感觉都像是第一次,不幸的是,其中许多都不会引起积极的情绪。 也许有人可以修复我,但是mapkit的文档非常稀少,我不得不从它的外观中雕刻出许多必要的功能。

卡片样式


为了赋予卡片独特性或将卡片嵌入设计中,您需要为其赋予必要的样式。 我发现的唯一方法并没有真正吸引我,因为如何使用它来定制卡片非常不方便,而且据我所知,我只了解色相,饱和度和亮度这些参数。

String style = "[" + " {" + " \"featureType\" : \"all\"," + " \"stylers\" : {" + " \"hue\" : \"1\"," + " \"saturation\" : \"-1\"," + " \"lightness\" : \"0.78\"" + " }" + " }" + "]"; mapView.getMap().setMapStyle(style); 

征求建议


在达到提示请求的最终版本之前,已重新检查了几种方法,这是通过AskedSession接收提示的最后也是最有效的方法。

首先,创建SearchManager对象的实例和RecommendationSession对象的实例:

 private SearchManager searchManager; private SuggestSession suggestSession = null; 

在onCreate()方法中初始化searchManager

 searchManager = SearchFactory.getInstance() .createSearchManager(SearchManagerType.COMBINED); 

此外,在requestSuggest(字符串查询)方法中,我们初始化了describeSession对象,并且我们不会忘记我们不需要每次都创建一个新会话。

 if (suggestSession == null) suggestSession = searchManager.createSuggestSession(); 

为了获得有关公司的提示,我们使用SuggestType.BIZ参数,并且为了获得有关用户区域的数据,您需要使用BoundigBox,其初始化如下:

 private final BoundingBox BOUNDING_BOX = new BoundingBox( new Point(66.066191, 76.468435), new Point(66.149326, 76.824836)); 

其中第一个点是矩形扇形的左下角和第二个右上角。

 suggestSession.suggest(query, BOUNDING_BOX, new SuggestOptions() .setSuggestTypes(SuggestType.BIZ.value) .setUserPosition(CENTER), new SuggestSession.SuggestListener() { @Override public void onResponse(@NonNull List<SuggestItem> list) { } @Override public void onError(@NonNull Error error) { } }); 

如果需要街道,房屋等,则可以使用SuggestType.BIZ参数:

 suggestSession.suggest(query, BOUNDING_BOX, new SuggestOptions() .setSuggestTypes(SuggestType.GEO.value) .setUserPosition(CENTER), new SuggestSession.SuggestListener() { @Override public void onResponse(@NonNull List<SuggestItem> list) { } @Override public void onError(@NonNull Error error) { } }); 

另外,注意到的问题之一是,对于相同的名称,会出现几个相同的值,因此,我建议您立即对它进行排序。

我今天想分享的最后一件事是在列表中显示您的uggestItem。 最初,一切似乎都很清楚,因为对象具有几个属性:

 getSearchText(); getDisplayText(); 

我认为,这意味着有一条完整的搜索行和一条显示行,但是在99%的情况下,这些行重合以便获得简单的街道名称而不使用正则表达式(这可能会损害显示,因为可以整理理解所需的数据:街道名称,门牌号,公寓等),使用了以下功能:

 suggestItem.getTitle().getText(); 

奇怪的是,尽管起初这个选项似乎并不那么明显,但是此功能可以提供必要的结果。

实际上,这只是此应用程序中必须遇到的一些小事情。 为了不拉伸文章,我将其留给第二部分,因为构建路线,显示标记和! 在出租车等应用中,汽车在地图上的旋转及其移动同样重要。

马特维年科·亚历山大(Matvienko Alexander),侯赛因·法赫(Hossein Fakhr)。

Source: https://habr.com/ru/post/zh-CN472798/


All Articles