网络编程:百度api实现地理编码与逆地理编码

1.使用geopy库实现百度地理位置编码功能:

2.使用requests库实现百度地理位置编码功能:

3.使用geocoder库实现百度地理位置编码功能:

4.使用http.client库实现百度地理位置编码功能:

5.使用socket库实现百度地理位置编码功能:

6.使用学习的四个库实现百度地理位置逆编码功能:

1.使用geopy库实现百度地理位置编码功能:按照示例代码将baidu改为baiduv3之后,填入申请的key就完成了。

2.使用requests库实现百度地理位置编码功能:对示例代码实现时,示例中使用的时谷歌地图,因此在代码中将谷歌地图的地址改为百度地图的,并且两者get请求时的params参数不同,做出对应修改。

3.使用geocoder库实现百度地理位置编码功能:先在terminal中用pip安装第三方库。

按照示例代码运行,发现结果为app被禁用,搜索后得知,百度v2服务已经暂停,要使用v3的服务。之后找到geocoder库中.baudu方法的实现函数get的实现函数中返回了一个option的可迭代对象,在其中找到实现方法BaiduQuary,将其中url修改为v3的地址。

出现的错误:第一次爆出key_value错误,一开始以为是他内置代码对v2和v3的支持格式不一样,结果是url写成了逆向解析的地址。

发现baidu.py下有main入口的测试函数,改好url之后错误变成了查找无结果,排除之后发现被这个测试函数误导了,这个库的查找不能直接查到某某路,直接运行‘甘肃政法大学’就可以找到。

4.使用http.client库实现百度地理位置编码功能:先按示例修改为百度的api接口查询。第一次运行时出现报错,查询得知是json.load的接收类型不对把代码的返回从xml变成json之后解决

5.使用socket库实现百度地理位置编码功能:按示例代码对应修改为百度的api接口,主要是在http请求头中和socket.connect的地址。

第一次运行报错,ascii编码不行,因为查询的地址是汉字,因此改用utf-8编码之后成功。

6.使用学习的四个库实现百度地理位置逆编码功能:

1.直接将原来调用的geocode变为reverse即可实现逆地理编码

2.利用request查询时,先是要访问逆地理编码的对应地址,由于v3的地理编码时和逆地理编码时的url中的参数不一样,因此要调整代码中访问的params,从address,ak,output变成ak,output,location的形式否则会出现报错,下面三个库的实现也是同理。

3.在gocoder.baidu方法的参数中加入method = reverse,查看官方文档,并将输入的经纬度用list的形式传入,即可实现。

4.正如前面所说利用httpclient实现时,需要改地址且改变参数

5.socket库实现也是同理,但此处的修改地方变成了http报文中

总结:

在本次实验中,我们使用了5个Python库来实现百度地理编码和逆地理编码功能,包括geopy、requests、geocoder、http.client和socket。每个库的实现方式和注意事项如下:

1. geopy

- 只需将代码中的'baidu'改为'baiduv3',并填入申请的密钥即可实现地理编码功能

- 将原来的geocode()方法改为reverse_geocode()即可实现逆地理编码

2. requests库 

- 将谷歌地图API地址改为百度地图API地址

- 注意地理编码和逆地理编码的参数(params)不同,需要相应调整

3. geocoder

- 安装geocoder库

- 修改geocoder.baidu中的url为v3版本地址

- 地理编码直接传入地址字符串

- 逆地理编码需要设置method='reverse',并将经纬度以列表形式传入

4. http.client

- 将请求地址改为百度地图API

- 注意将返回类型改为json格式

5. socket

- 修改请求地址为百度地图API

- 注意编码问题,使用utf-8编码

- 修改HTTP请求头和请求参数

总的来说,主要注意事项包括:使用正确的API接口地址、参数设置、编码问题等。对于逆地理编码,需要将地理编码方法相应改为逆地理编码方法,并调整输入参数形式(如geocoder库中的列表形式)。

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android应用程序中实现Google反向地理编码,你可以使用Google Maps Geocoding API。下面是一个简单的示例代码,演示如何查找当前位置的地址信息: 首先,确保你的Android应用程序已经添加了Google Play服务库依赖。在项目的build.gradle文件中,添加以下依赖项: ```groovy implementation 'com.google.android.gms:play-services-maps:17.0.1' ``` 然后,在你的Activity或Fragment中,你可以使用以下代码来执行反向地理编码: ```java import android.Manifest; import android.content.pm.PackageManager; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.os.Bundle; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationServices; import java.io.IOException; import java.util.List; import java.util.Locale; public class MainActivity extends AppCompatActivity { private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1; private FusedLocationProviderClient fusedLocationClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { getCurrentLocation(); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); } } private void getCurrentLocation() { fusedLocationClient.getLastLocation() .addOnSuccessListener(this, new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { if (location != null) { Geocoder geocoder = new Geocoder(MainActivity.this, Locale.getDefault()); try { List<Address> addresses = geocoder.getFromLocation( location.getLatitude(), location.getLongitude(), 1 ); if (addresses.size() > 0) { Address address = addresses.get(0); String addressText = address.getAddressLine(0); Toast.makeText(MainActivity.this, addressText, Toast.LENGTH_SHORT).show(); } } catch (IOException e) { e.printStackTrace(); } } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getCurrentLocation(); } else { Toast.makeText(this, "Location permission denied", Toast.LENGTH_SHORT).show(); } } } } ``` 上述代码中,我们首先检查是否已经授予了定位权限。如果没有,我们请求用户授权。如果已经授予了权限,我们使用FusedLocationProviderClient获取当前位置的经纬度坐标。然后,我们使用Geocoder进行反向地理编码,获取当前位置的地址信息。最后,我们将地址信息显示在Toast中,你可以根据需要进行更改。 记得在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 请注意,这只是一个简单的示例,你可能需要根据自己的应用程序需求进行适当的修改和错误处理。另外,确保在使用Google Maps Geocoding API时遵守相关的服务条款和政策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值