百度地图定位API+和风天气城市搜索API构成的天气定位模块

定位项目示例:

项目介绍:

    该项目结合了百度地图的定位API和和风天气的城市搜索API,目的在于为天气预报提供一个定位接口。利用该接口可以直接向和风天气的天气API直接申请定位地的天气情况。

    思路:利用百度地图API的网络定位+GPS定位功能产生两个参数:经度,纬度。然后把经纬度传递给和风天气的城市搜索API,API会根据经纬度返回该位置的一个城市代号(cityid),该id可以直接向和风天气的天气API申请获取天气信息。

    其实这个可以作为《第一行代码》课本后面的酷欧天气项目的定位功能拓展,它们都是使用了和风天气的API。

项目流程:

一、首先我们需要了解这3个API:

        1.百度地图定位API:http://lbsyun.baidu.com/index.php?title=android-locsdk

        2.和风天气城市搜索API:https://dev.heweather.com/docs/search/find

        3.和风天气天气数据API:https://dev.heweather.com/docs/api/weather

注册百度开发者,申请一个API Key,并且下载所需的SDK(地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download),配置好项目。《第一行代码第2版》P379~386 有详细介绍,实在不懂的可以给我留言。

二、代码实现部分:

先修改AndroidManifest.xml,申请必要的权限

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

       
    <service android:name="com.baidu.location.f" android:enabled="true"
            android:process=":remote">
        </service>

        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="这里是放百度API Key的"/>

然后利用百度地图的定位API获取经纬度:

//    定位函数
    private void requestLocation()
    {
        initLocation();//定位初始化
        mLocationClient.start();//开始定位
    }
//    定位初始化
    private void initLocation()
    {
        LocationClientOption option=new LocationClientOption();
        option.setScanSpan(5000);//每隔5s刷新一下
        option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//开启GPS定位
        mLocationClient.setLocOption(option);
    }
 //    定位结果信息赋值
    public class MyLocationListener implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location)
        {
            LongitudeId=location.getLongitude();//经度获取
            LatitudeId=location.getLatitude();//纬度获取
            System.out.println("经度0:"+LongitudeId);
            System.out.println("纬度0:"+LatitudeId);
            requestCityInfo(LongitudeId,LatitudeId);//获取定位城市的ID
        }

    }
//    用经纬度向服务器请求获取城市json
    public void requestCityInfo(double longitude,double latitude)
    {
        String cityUrl="https://search.heweather.net/find?location="+longitude+","+latitude+"&key=8e669fb35db1436496ad76e9aec7ba60";
        System.out.println("请求链接:"+cityUrl);

        HttpUtil.sendOkHttpRequest(cityUrl, new Callback() {

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String responseCityInfoText=response.body().string();
                System.out.println("返回的信息:"+responseCityInfoText);
//                把返回的数据交到Utility进行Gson解析
                cityId CITYID=new cityId();
                CITYID=Utility.handleCityIdResponse(responseCityInfoText);
                for (cityInfo_basic basic:CITYID.basicsList)
                {
                    CityID=basic.cityID;
                    LocationName=basic.LocationName;
                    Parent_cityName=basic.Parent_cityName;
                    Admin_areaName=basic.Admin_areaName;
                }
                locationName=Admin_areaName+"-"+Parent_cityName+"-"+LocationName;
                System.out.println("最后的定位:"+locationName);
                System.out.println("最后的一步,ID:"+CityID);
            }

            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(WeatherActivity.this,"经纬度请求城市信息失败",Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

    }

最后记得关闭定位,不然会在后台一直定位,会耗电: 

//软件生命周期结束之后关闭定位
    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        mLocationClient.stop();
    }

 

其中的CityID就是我们所需的城市代号,利用它就可以直接向和风天气申请定位地的城市信息了。

这里只是简单的函数介绍,具体代码可以去Github参考我的demo,有全部源码。

(喜欢的话Github去Follow一下我也是不错的,哈哈哈)

源码地址:https://github.com/LalmonDev/LBStest

 

Create By Lalmon

4/28/2019

转载请注明出处,谢谢!

首先,你需要准备好以下材料: - ESP8266开发板 - 飞线和面包板 - DHT11温湿度传感器(可选) - USB转串口模块 - 计算机或笔记本电脑 然后,按照以下步骤进行操作: 1. 注册和天气开发者账号,获取自己的API Key。 2. 在Arduino IDE中安装ESP8266的开发环境,并将开发板设置为ESP8266。 3. 下载并安装ESP8266WiFi库和ArduinoJson库,用于连接WiFi和解析JSON数据。 4. 连接ESP8266开发板和DHT11传感器,根据需要使用面包板和飞线。 5. 在Arduino IDE中编写代码,实现以下功能: - 连接WiFi网络; - 读取DHT11传感器数据(可选); - 调用和天气API获取天气预报数据; - 解析JSON数据,获取需要的天气信息; - 将天气信息显示在串口监视器中或者OLED显示屏上(可选)。 下面是一个简单的示例代码,你可以根据自己的需求进行修改: ```c++ #include <ESP8266WiFi.h> #include <ArduinoJson.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* host = "free-api.heweather.net"; const char* apiKey = "your_API_KEY"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } void loop() { float temperature = readTemperature(); float humidity = readHumidity(); String url = "/s6/weather/now?location=your_LOCATION&key=" + String(apiKey); Serial.print("Connecting to "); Serial.println(host); WiFiClient client; if (!client.connect(host, 80)) { Serial.println("Connection failed"); return; } Serial.print("Requesting URL: "); Serial.println(url); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); while (!client.available()) { delay(100); } String response = client.readString(); Serial.println(response); StaticJsonDocument<512> doc; deserializeJson(doc, response); JsonObject root = doc.as<JsonObject>(); JsonObject now = root["HeWeather6"][0]["now"]; String weather = now["cond_txt"].as<String>(); int temperature = now["tmp"].as<int>(); int humidity = now["hum"].as<int>(); Serial.print("Weather: "); Serial.println(weather); Serial.print("Temperature: "); Serial.print(temperature); Serial.println("°C"); Serial.print("Humidity: "); Serial.print(humidity); Serial.println("%"); delay(60000); } float readTemperature() { // code for reading temperature from DHT11 sensor } float readHumidity() { // code for reading humidity from DHT11 sensor } ``` 在代码中,你需要将`your_SSID`和`your_PASSWORD`替换为连接WiFi网络的SSID和密码,将`your_API_KEY`替换为你的和天气API Key,将`your_LOCATION`替换为你要查询的城市名称或城市ID。同时,你还需要添加读取DHT11传感器数据的代码,或者使用其他类型的传感器替换它。 最后,上传代码到ESP8266开发板,打开串口监视器,就可以看到ESP8266调用和天气API获取天气预报数据,并将天气信息显示在串口监视器中。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值