`
holoblog
  • 浏览: 1265023 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:19562
文章分类
社区版块
存档分类
最新评论

Bing Maps中使用Google全球本地化搜索服务详解

 
阅读更多

  微软Bing Maps推出了四大在线地图服务,以满足地理位置、路由、影像以及搜索等常用GIS开发需求,去年我写的《Bing Maps开发系列博文》中介绍了这四种公关服务的特点和基本使用方法。但是很多朋友以及本人在使用这四种服务的时候发现了,使用微软提供的服务实现本地化搜索对于亚洲地区的支持不够友好,这一点比起Google还存在很大的距离。不过不用灰心,虽然Google没有像微软那样直接提供公共服务接口供开发者调用,我们还是可以通过某些手段调用Google的全球本地化搜索服务,实现功能完善的本地搜索。

  我们可以通过Google Maps的在线示例查看我们将要实现的功能,只不过是将Google Maps API开发的地图端给移植到了Silverlight版本的Bing Maps中。    

        

  首先,我们通过HttpWatch来分析此示例所发起的http请求,可获取到全球本地化搜索服务的请求路径和相关的参数,下图为HttpWatch请求跟踪截图:

    

  由此,我们可以得到Google全球本地化搜索服务的地址,通过分析并可得到所请求的URL地址中的q即为所查询的地点名,详细如下URL:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http://www.google.com/uds/GlocalSearch?callback=google.search.LocalSearch.RawCompletion&context=7&rsz=small&hl=zh-CN&gss=.com&sig=3268c2f995b8fbd3048de51c45033694&q=%E5%8C%97%E4%BA%AC&near=(39.904214%2C%20116.40741300000002)&key=ABQIAAAAjU0EJWnWPMv7oQ-jjS7dYxQ82LsCgTSsdpNEnBsExtoeJv4cdBSUkiLH6ntmAr_5O4EfjDwOa0oZBQ&v=1.0&nocache=1298294307822

 

  实际上很多的很多的参数我们都是可以省略的,只要保持关键的请求参数同样不影响请求且能够正确的返回我们需要的结果,因此,可以对上面长段的URL地址进行瘦身,得到如下的简化版全球本地化请求地址:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http://www.google.com/uds/GlocalSearch?q=%E5%8C%97%E4%BA%AC&key=ABQIAAAAjU0EJWnWPMv7oQ-jjS7dYxQ82LsCgTSsdpNEnBsExtoeJv4cdBSUkiLH6ntmAr_5O4EfjDwOa0oZBQ&v=1.0&nocache=1298223400032

  在实际使用中指需要将q参数替换为我们要搜索的地点名就可以了,因此可以将上面的URL地址改写为如下字符串格式,方便程序中灵活的设值并调用该服务。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->http://www.google.com/uds/GlocalSearch?q={0}&key=ABQIAAAAjU0EJWnWPMv7oQ-jjS7dYxQ82LsCgTSsdpNEnBsExtoeJv4cdBSUkiLH6ntmAr_5O4EfjDwOa0oZBQ&v=1.0&nocache=1298223400032

  做过Silverlight开发的朋友都知道,在Silverlight中发起HTTP请求会受到跨域安全性的限制,如果所请求的服务器没有配置Silverlight的安全访问策略,Silverlight所发起的HTTP请求将会产生“System.Security.SecurityException--->System.Security.SecurityException:安全性错误。”的异常。因此要想在Silverlight中直接向此地址发起HTTP请求是行不通的了,我们需要通过别的间接方式去实现访问该地址来达到我们的目的,实际上要做的工作就是避开HTTP访问安全性限制。

  通常情况下我们有两种方式可以避免HTTP请求安全访问的限制,既采用AJAX技术异步请求和在服务器端实现HTTP的同步或异步请求。接下来将要介绍的就是通过服务器端实现HTTP请求,然后将结果中转到Silverlight客户端。这里我们需要开发一个HTTP接口供Silverlight调用。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->///<summary>
///接口实现向Google全球本地化搜索服务发起HTTP请求,然后将结果处理后返回到客户端。
///</summary>
publicclassGoogleHandler:IHttpHandler
{
privatestringurl=@"http://www.google.com/uds/GlocalSearch?q={0}&key=ABQIAAAAjU0EJWnWPMv7oQ-jjS7dYxQ82LsCgTSsdpNEnBsExtoeJv4cdBSUkiLH6ntmAr_5O4EfjDwOa0oZBQ&v=1.0&nocache=1298223400032";

publicvoidProcessRequest(HttpContextcontext)
{
context.Response.ContentType
="text/plain";

if(context.Request.QueryString["q"]==null)return;

stringq=HttpUtility.UrlEncode(context.Request.QueryString["q"]).ToUpper();
url
=string.Format(url,q);

WebClientclient
=newWebClient();

stringresult=client.DownloadString(newUri(url));
result
=result.Substring(result.IndexOf("GsearchResultClass")-2);
result
=result.Substring(0,result.IndexOf("cursor")-3);

context.Response.Write(result);
}

publicboolIsReusable
{
get
{
returnfalse;
}
}
}

  编译以上请求Google全球本地化搜索服务接口的HTTP接口后可以得到这样的地址:“http://localhost:28768/GoogleHandler.ashx?q={0}”,在Silverlight中就通过向自己编写的这个接口发起HTTP请求,然后此接口负责请求Google接口,实现本地上搜索功能。通过上面接口的代码可知,我特意将请求的结果进行了相应的处理,以便客户端能够更加方面的使用接口所返回的数据,其接口返回的数据为JSON格式字符串,通过上面的处理将一些不必要的数据字段给干掉了,剩下的数据我们可以定义如下实体对象。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassQueryResult
{
publicstringGsearchResultClass{get;set;}
publicstringlistingType{get;set;}
publicstringlat{get;set;}
publicstringlng{get;set;}
publicstringaccuracy{get;set;}
publicstringtitle{get;set;}
publicstringtitleNoFormatting{get;set;}
publicstringddUrl{get;set;}
publicstringddUrlToHere{get;set;}
publicstringddUrlFromHere{get;set;}
publicstringstreetAddress{get;set;}
publicstringcity{get;set;}
publicstringregion{get;set;}
publicstringcountry{get;set;}
publicstringstaticMapUrl{get;set;}
publicstringurl{get;set;}
publicstringpostalCode{get;set;}
publicstringmaxAge{get;set;}
publicstringaddressLines{get;set;}
}

  有了上面的实体对象,当得到请求所返回的JSON字符串后就可以通过JSON序列化既可实现JSON字符串到对象的转换,因此我们还需要定义一个JSON序列号方法以便开发中使用。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicsealedclassJsonHelper<T>
{
///<summary>
///解析JSON格式字符串为指定的对象数据结构
///</summary>
///<paramname="jsonString">JSON字符串</param>
///<returns>T</returns>
publicstaticTResolveObject(stringjsonString)
{
DataContractJsonSerializerds
=newDataContractJsonSerializer(typeof(T));
MemoryStreamms
=newMemoryStream(Encoding.Unicode.GetBytes(jsonString));
Tt
=(T)ds.ReadObject(ms);

returnt;
}
}

  到处,就只剩下最后一步了,在Bing Maps(Silverlight)中将要搜索的地名通过自己开发的接口传递给Google全球本地化搜索服务接口。下图为示例程序解决方案截图:

        

  在示例程序中提供一个文本输入空间实现地名录入,通过按钮发起请求,然后将部分结果呈现在地图指定的UI面板上,返回的数据中由于带有地理坐标(经度,纬度),还可以使用此地理坐标进行地图定位,每当成功搜索到某地名后就将地图定位带该地名所在的位置。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><StackPanelMargin="2"Width="160"Height="140"VerticalAlignment="Top"HorizontalAlignment="Right">
<TextBoxName="tbAddress"Margin="5"Height="23"></TextBox>
<ButtonContent="搜索"x:Name="btnQuery"Width="70"Height="30"Click="btnQuery_Click"></Button>
<BorderCornerRadius="8"BorderThickness="1"Height="70"Margin="3"x:Name="queryResult">
<StackPanel>
<StackPanel.Background>
<LinearGradientBrushEndPoint="0.5,1"StartPoint="0.5,0">
<GradientStopColor="#FF305867"Offset="0"/>
<GradientStopColor="#FFABE2F7"Offset="1"/>
</LinearGradientBrush>
</StackPanel.Background>
<TextBlockText="{Bindingcity}"Height="23"Margin="0,8,0,0"></TextBlock>
<StackPanelOrientation="Horizontal">
<TextBlockText="{Bindinglng}"Height="30"Width="Auto"></TextBlock>
<TextBlockText=","Height="30"Width="Auto"></TextBlock>
<TextBlockText="{Bindinglat}"Height="30"Width="Auto"></TextBlock>
</StackPanel>
</StackPanel>
</Border>
<StackPanel.Background>
<LinearGradientBrushEndPoint="0.5,1"StartPoint="0.5,0">
<GradientStopColor="#cccccc"Offset="0"/>
<GradientStopColor="White"Offset="1"/>
</LinearGradientBrush>
</StackPanel.Background>
</StackPanel>

  在Silverlight中可以通过WebClient发起简单的HTTP请求,如下代码块所示:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->///<summary>
///请求Google全球本地化搜索服务的接口地址
///</summary>
privatestringservice="http://localhost:28768/GoogleHandler.ashx?q={0}";

privatevoidbtnQuery_Click(objectsender,RoutedEventArgse)
{
varaddress
=this.tbAddress.Text.Trim();
varclient
=newWebClient();
client.DownloadStringCompleted
+=client_DownloadStringCompleted;
client.DownloadStringAsync(
newUri(string.Format(service,address),UriKind.Absolute));
}

privatevoidclient_DownloadStringCompleted(objectsender,DownloadStringCompletedEventArgse)
{
if(e.Error==null)
{
try
{
QueryResultresult
=JsonHelper<QueryResult>.ResolveObject(e.Result);

this.queryResult.DataContext=result;

this.map.Center=newLocation(double.Parse(result.lat),double.Parse(result.lng));
}
catch(Exception)
{
}
}
}

        

  通过这种方式请求所得到的结果是英文的,如果要返回中文数据,只需要将Google全球本地化搜索服务的请求路径稍加修改,在请求参数中加上hl=zh-CN就行了。

分享到:
评论

相关推荐

    Ldh.Maps开源代码

    Mapabc是中国本土的地图服务提供商,其地图数据覆盖全面,对于国内用户来说,使用Mapabc地图服务可以提供更准确的本地化信息。而Google Maps则是全球知名的地图服务,其道路图和卫星图质量高,数据更新频繁,适合...

    flash地图开发api

    2. **Bing Maps**:微软的在线地图服务,提供了多种开发工具,包括Bing Maps AJAX Control和Bing Maps Flex Control。Flex版本的API允许开发者利用Flash平台创建交互式地图应用。 3. **EarthPlayerLib**:可能是指...

    FlexViewer配置管理器[整理].pdf

    - **Bing Maps Key**:用于接入Bing Maps服务,需要在Bing Maps网站申请。 - **HTTP Proxy URL**:如果数据请求需要通过代理服务器,这里填写相应的URL。 - **Geometry Service URL**:定义用于执行几何操作的...

    ArcGIS地图缓存制作简介.pdf

    1. **灵活的瓦片方案选择**:ArcGIS Server 支持从多个来源加载瓦片方案,包括但不限于ArcGIS Online、Google Maps或Bing Maps。此外,还可以根据实际需求自定义缓存策略。 2. **丰富的缓存策略**:ArcGIS Server ...

    Geocoder:一个帮助我们建立地理感知应用程序的php类库.zip

    **Geocoder PHP 类库详解** ...无论你是构建本地化应用、实现位置追踪还是优化路线规划,Geocoder 都能成为你的得力助手。通过结合不同的 HttpAdapter 和供应商,你可以构建出高效、可靠的地理感知应用程序。

    Gmap.rar_CSharp GMap_GMAP_GMAP.NET_gmap c_gmap c#

    《C#中使用GMap.NET实现离线地图应用详解》 在C#开发中,有时候我们需要在应用程序中集成地图功能,特别是在离线环境下。GMap.NET是一个强大的开源库,它为开发者提供了在Windows Forms、WPF、ASP.NET等多个平台下...

    在线地图插件forArcMapV2.7.1.rar

    1. **在线地图服务集成**:该插件允许用户直接在ArcMap中加载和使用来自互联网的各种在线地图服务,如Google Maps、Bing Maps、OpenStreetMap等,极大地拓宽了地图数据来源,减少了对本地地图数据的依赖。...

    LBS应用开发(Location-Aware Applications)

    - **Android**: 使用Google Play服务中的Location API。 - **其他平台**: 如Windows Phone等,各有特点。 - **跨平台开发**: 如React Native、Flutter等工具,简化开发流程。 **2.3 连接性问题与解决方案** - **...

    GMap.NET 控件实例C#源代码

    GMap.NET是一个基于Google Maps、Bing Maps、OpenStreetMap等在线地图服务的.NET控件。它支持多种地图类型,如卫星图像、地形图、交通图等,并允许自定义地图层和标记。 2. **C#源代码解析** 这个实例中的源代码...

    rupam.zip_iPhone/iOS_C/C++_

    描述中的"Windows Mango Phone Using BingMaps & Isolated Storage Code"揭示了项目的核心内容。Windows Mango Phone指的是2011年发布的Windows Phone 7.5操作系统,开发者在这个平台上利用Bing Maps SDK来实现地图...

    Real World SharePoint 2010

    2. **Bing Maps集成**:在SharePoint 2010中,可以集成Bing Maps服务,为地理位置相关的数据展示提供了新的可能性。 3. **社交功能**:包括MySite个人网站、社区论坛和新闻源等功能,增强了团队协作和知识共享。 4...

    将所有WordPressSEO优化打包在一起的插件

    7. **本地SEO支持**:对地理位置相关的SEO进行优化,如Google Maps集成和本地搜索优化。 8. **自动生成关键词**:插件可以根据内容自动生成关键词列表,为用户提供参考。 9. **RSS优化**:优化RSS feed,增加订阅...

    LBS^2 milw0rm模板

    4. **地图集成**:地图是LBS应用的核心,LBS^2 milw0rm模板可能已经集成了流行的在线地图服务,如Google Maps、Bing Maps或OpenStreetMap等。这些地图服务通常提供API供开发者调用,以显示地图、获取位置信息、绘制...

    C#全国各地的天气预报

    8. **地图集成**:为了让用户更直观地了解天气分布,可以集成地图服务,如Google Maps或Bing Maps API,标记出各个城市的天气状况。 9. **实时更新**:为了保证天气信息的准确性,可以设置定时任务,定期从API获取...

    osgearth-3.1.0_Install.rar

    1. 地图渲染:支持多种地图源,如谷歌地图、OpenStreetMap、 Bing Maps等,通过瓦片服务或本地数据进行渲染。 2. 3D地形和影像:能够加载数字高程模型(DEM)和卫星图像,创建逼真的3D地形和地球表面。 3. 数据支持...

    地点

    2. **地图集成**:使用`&lt;iframe&gt;`标签嵌入地图服务提供商的代码,如Google Maps、Bing Maps等,用户可以在网页上直接查看地点。 3. **HTML5 Geolocation API**:通过JavaScript调用这个API,可以请求用户授权获取...

    UCMap for Android

    UCMap支持多种地图的加载方式,包括矢量地图、Google Maps或Bing Maps、WMTS或WMS地图以及矢量叠加瓦片。 1. **矢量地图** - 使用UCMap可以加载矢量地图数据,这种类型的数据体积较小,便于离线使用。 2. **...

    VC++利用WEB Broswer控件制作地图及公交查询系统

    在地图及公交查询系统中,Web Browser控件被用来加载地图服务提供商(如Google Maps、Bing Maps等)的网页,使得用户可以直接在应用程序内部查看和操作地图。 系统实现的关键步骤包括: 1. **集成Web Browser控件*...

    vb和mo的旅游查询系统

    1. **地图数据获取**:系统需要获取地图数据,这可能通过在线服务(如Google Maps API或Bing Maps API)或者本地地图数据文件实现。开发者需要理解如何调用API获取地图信息,以及如何解析和展示这些信息。 2. **...

    WeatherForecast

    1. 利用Bing Maps API集成地图功能,用户可以查看当前位置的天气信息。 2. 使用Windows Phone的Geolocation API获取设备的地理位置,自动填充城市名。 七、错误处理与用户体验 1. 对网络请求和数据解析过程进行...

Global site tag (gtag.js) - Google Analytics