关于 Android中googleMaps的Geocoder, “the service is not available”解决办法

                                             Android中用Json解析googleMaps经纬度

         大家在用googleMaps中的Geocoder进行地理位置反转经纬度时, 会出现这个错误Geocoder, “the service is not available” && Geocoder返回List为null,得不到街道信息。其实googleMaps中的Getcoder反转经纬度一直存在BUG,在前一段时间google终止了这项服务,在google官网http://code.google.com/intl/zh-CN/apis/maps/documentation/geocoding/已经说明了,google让我们只能通过Json解析地址才能获取地理位置的经纬度了,现在总结了一下内容:

         Json解析包到android3.1才集成到android里面,现在还不能直接使用。我们现在用Json解析数据,首先下载Json包导入到你的项目中,Json解析包网址是http://code.google.com/p/google-gson/downloads/detail?name=google-gson-1.7.1-release.zip。然后你在浏览器中输入http://maps.google.com/maps/api/geocode/json?address=平顶山学院ka&sensor=false,可以看到一个Json数据,可以看到我们平顶山学院的一些数据,其中可以看到我们学校的经纬度"location" : { "lat" : 33.766190, "lng" : 113.1928140 },,这样我们不需要Getcoder类也可以解析出来地理位置的经纬度了,接下来我们看一下实现代码:

public static JSONObject getLocationInfo(String address) 
{//address是我所反转平顶山学院名字
HttpGet httpGet=new HttpGet("http://maps.google.com/maps/api/geocode/json?address=" + address    
                + "ka&sensor=false");
HttpClient client=new DefaultHttpClient();
HttpResponse httpResponse;
StringBuffer stringBuffer=new StringBuffer();
try {
httpResponse=client.execute(httpGet);
HttpEntity httpEntity=httpResponse.getEntity();
InputStream inputStream=httpEntity.getContent();
int b;
while ((b=inputStream.read())!=-1)
{
stringBuffer.append((char)b);
}

catch (ClientProtocolException e)
{
}
catch (Exception e)
{
}
JSONObject jsonObject=new JSONObject();
try {
jsonObject=new JSONObject(stringBuffer.toString());
Log.d(tab,"stringbuffer的值"+stringBuffer.toString());

catch (Exception e) {
}
return jsonObject;
}
public  static GeoPoint getGeoPoint(JSONObject jsonObject)
{
Double lon=new Double(0);//地点的纬度
Double lat=new Double(0);//地点的经度
try {
 lon=((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
 lat=((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");//上面这些参数你可以在http://maps.google.com/maps/api/geocode/json?address=平顶山学院ka&sensor=false中看到


catch (JSONException  e)
{
Log.d(tab,"geoPoint方法捕获的异常"+e.getMessage());
}
catch (Exception e) 
{
}
return new GeoPoint((int) (lat* 1E6), (int) (lon* 1E6));
}

我们在响应事件里写上这句话 controller.animateTo(getGeoPoint(getLocationInfo("平顶山学院"))); googleMaps就会显示我的学校,哈哈哈,用Json解析地理位置经纬度就这样实现了,再也不用Geocoder类了,岂不是很好。当然,这些代码不是我想出来的,我是在google的英文网站上看到一个外国人是这样写的,我自己试试测试一下,没想到成功了,建议大家好好看看这个网站http://code.google.com/intl/zh-CN/apis/maps/documentation/geocoding/,相信大家会有所收获的,搞了一天到现在终于搞出来了,累死了,我睡觉 了,谢谢大家

<think>好的,我现在要解决用户遇到的TMap.service.Geocoder中'TMap is not defined'的错误。首先,我需要理解这个错误的背景。用户在使用Vue时,初始化某个文件后出现这个错误,同时还有mounted钩子中的TypeError,说明问题可能出现在组件的生命周期阶段加载地图相关库的时候。 首先,用户提到的是TMap未定义,这可能是因为TMap的JavaScript库没有被正确引入。通常,使用第三方库如腾讯地图,需要在项目中正确加载其SDK。常见的问题可能包括: 1. **未正确引入TMap SDK**:用户可能忘记在HTML文件中通过script标签引入腾讯地图的API,或者在Vue组件中没有正确加载该库。例如,是否在index.html中添加了类似`<script src="https://map.qq.com/api/gljs?v=1.exp&key=你的密钥"></script>`的代码?如果没有,TMap对象自然不会存在。 2. **异步加载问题**:如果SDK是通过异步方式加载的,可能在组件mounted时,TMap还未加载完成,导致调用时TMap未定义。这时候需要考虑在确保TMap加载完成后再执行相关代码,比如使用回调函数或Promise。 3. **作用域问题**:在Vue的单文件组件中,直接使用TMap可能因为作用域的问题找不到全局变量。尤其是在使用模块化开发时,可能需要通过window对象来访问,例如window.TMap,或者显式地将其引入组件。 接下来,结合用户提到的另一个错误“Error in mounted hook: TypeError: handler.call is not a function”,这可能是因为在mounted钩子中调用了一个未正确定义的函数。例如,可能在methods中定义的方法没有正确绑定,或者在调用时拼写错误,导致handler实际上不是一个函数。 不过用户的问题更集中在TMap未定义,所以先处理这个部分。可能的解决步骤: - **检查TMap SDK的引入**:确保在入口文件(如index.html)中正确引入了腾讯地图的JS文件,并且密钥有效。 - **使用window.TMap**:在Vue组件中,可能需要通过window对象访问全局变量,特别是在模块化环境中,直接使用TMap可能不可见,因此改为window.TMap.service.Geocoder。 - **确保加载顺序**:确保TMap的脚本在Vue组件初始化之前加载完成。可以在mounted生命周期钩子中使用动态加载脚本的方式,并在加载完成后初始化Geocoder。 例如,在Vue组件的mounted钩子中动态加载TMap: ```javascript mounted() { const script = document.createElement('script'); script.src = 'https://map.qq.com/api/gljs?v=1.exp&key=你的密钥'; script.onload = () => { // 确保TMap已加载 this.initMap(); }; document.head.appendChild(script); }, methods: { initMap() { const geocoder = new window.TMap.service.Geocoder(); // 其他操作 } } ``` 这样处理可以确保脚本加载完成后才执行初始化代码,避免TMap未定义的问题。 此外,还要检查是否有拼写错误,比如TMap的大小写是否正确,或者调用的方法名是否正确。例如,service是否正确的命名空间,Geocoder是否存在。 如果用户已经正确引入了脚本,但仍然出现错误,可能需要检查浏览器的控制台是否有网络错误,比如脚本加载失败,或者密钥无效导致SDK无法正确加载。 总结可能的解决方案步骤: 1. 确认正确引入腾讯地图SDK,检查script标签的src是否正确,密钥是否有效。 2. 在组件中使用window.TMap来访问,确保作用域正确。 3. 使用动态加载脚本并在onload回调中初始化相关功能,避免异步问题。 4. 检查控制台是否有其他错误,如网络请求失败或密钥错误。 如果用户按照这些步骤操作,应该能解决TMap未定义的错误。同时,处理mounted钩子中的错误需要检查相关的事件处理函数是否正确定义和绑定,确保handler是一个有效的函数。</think>### TMap.service.Geocoder中“TMap未定义”错误解决方案 #### 1. 检查TMap SDK的引入 确保在项目中正确加载腾讯地图JavaScript SDK。若未引入或路径错误,会导致`TMap`对象未定义。 **解决方法**: - 在`public/index.html`中添加以下代码(需替换为实际密钥): ```html <script src="https://map.qq.com/api/gljs?v=1.exp&key=你的密钥"></script> ``` - 确认密钥有效且未超出调用限制[^1]。 #### 2. 使用`window.TMap`访问全局变量 在模块化开发环境中(如Vue),直接使用`TMap`可能因作用域问题无法识别。 **解决方法**: - 在代码中通过`window.TMap`调用: ```javascript const geocoder = new window.TMap.service.Geocoder(); ``` #### 3. 动态加载SDK并异步初始化 若SDK加载速度慢于组件初始化,需确保代码在SDK加载完成后执行。 **示例**(Vue组件): ```javascript export default { mounted() { // 动态加载SDK if (!window.TMap) { const script = document.createElement('script'); script.src = 'https://map.qq.com/api/gljs?v=1.exp&key=你的密钥'; script.onload = () => { this.initGeocoder(); // SDK加载完成后初始化 }; document.head.appendChild(script); } else { this.initGeocoder(); } }, methods: { initGeocoder() { const geocoder = new window.TMap.service.Geocoder(); // 后续操作 } } } ``` #### 4. 检查控制台错误 打开浏览器开发者工具(F12),查看是否有以下问题: - SDK加载失败(如404错误) - 密钥无效(控制台提示`KEY错误`) - 网络请求被拦截(如HTTPS/HTTP混合内容限制) --- ### 其他注意事项 1. **避免拼写错误**:检查`TMap.service.Geocoder`的命名空间是否正确。 2. **依赖加载顺序**:确保SDK在Vue组件实例化前加载。 3. **使用官方文档**:参考[腾讯地图API文档](https://lbs.qq.com/webApi/javascriptGL/glGuide/glBasic)确认接口用法。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值