根据地址获取经度纬度

package com.tmg.zhuomuniao;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by Administrator on 2016/2/16.
 */
public class GetLatAndLngByBaidu {
    /**
     * @param addr
     * 查询的地址
     * @return
     * @throws IOException
     */
    public static Object[] getCoordinate(String addr) throws IOException {
        String lng = null;//经度
        String lat = null;//纬度
        String address = null;
        try {
            address = java.net.URLEncoder.encode(addr, "UTF-8");
        }catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        //String key = "f247cdb592eb43ebac6ccd27f796e2d2";
        String key = "8eGiayBVO5YZN601bt4werDN";
        String url = String .format("http://api.map.baidu.com/geocoder?address=%s&output=json&key=%s", address, key);
        URL myURL = null;
        URLConnection httpsConn = null;
        try {
            myURL = new URL(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        InputStreamReader insr = null;
        BufferedReader br = null;
        try {
            httpsConn = (URLConnection) myURL.openConnection();// 不使用代理
            if (httpsConn != null) {
                insr = new InputStreamReader( httpsConn.getInputStream(), "UTF-8");
                br = new BufferedReader(insr);
                String data = null;
                int count = 1;
                while((data= br.readLine())!=null){
                    if(count==5){
                        lng = (String)data.subSequence(data.indexOf(":")+1, data.indexOf(","));//经度
                        count++;
                    }else if(count==6){
                        lat = data.substring(data.indexOf(":")+1);//纬度
                        count++;
                    }else{
                        count++;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(insr!=null){
                insr.close();
            }
            if(br!=null){
                br.close();
            }
        }
        return new Object[]{lng,lat};
    }


    public static void main(String[] args) throws IOException {
        GetLatAndLngByBaidu getLatAndLngByBaidu = new GetLatAndLngByBaidu();
        Object[] o = getLatAndLngByBaidu.getCoordinate("北京北京市gsdga");
        System.out.println(o[0]);//经度
        System.out.println(o[1]);//纬度
    }

}
<think>好的,用户想用C语言编写获取GPS模块经纬度的代码。首先,我需要考虑GPS模块通常如何与微控制器或单片机通信。常见的通信方式是串口,比如UART。所以第一步应该是初始化串口,设置正确的波特率,通常是9600或38400,具体得看模块的规格。 接下来,GPS模块输出的数据格式通常是NMEA 0183标准,最常见的语句是GPRMC或GPGGA。比如GPRMC语句包含了经度纬度、时间、速度等信息。所以代码需要解析这些语句。 用户可能不太清楚如何解析这些数据,所以得一步步来。首先,需要从串口读取数据,然后逐个字符检查,找到正确的句子头,比如“$GPRMC,”。然后分割各个字段,通常用逗号分隔。例如,纬度在GPRMC的第3和第4字段,经度在第5和第6字段。但要注意,这些数据可能需要转换,比如从度分格式转换为十进制度数。 另外,需要考虑数据的有效性。GPRMC中的第二个字段是状态,A表示有效,V表示无效。所以代码中需要检查这个状态位,确保获取的是有效定位数据。 还有,处理字符串时要注意缓冲区溢出,需要合理设置缓冲区大小,并正确终止字符串。可能还需要处理部分读取的情况,或者数据中的校验和,但为了简化,可能在示例中先忽略校验和,但实际应用中最好加上校验以提高可靠性。 用户可能使用的硬件平台比如是STM32或者Arduino,但示例代码需要保持通用性,所以用标准C语言的串口读写函数,实际移植时可能需要根据平台调整。比如,使用`printf`和`scanf`可能不太适合嵌入式环境,可能需要替换为具体的串口读取函数。 最后,测试时可能需要连接真实的GPS模块,或者使用模拟器生成NMEA数据,帮助调试代码。确保代码能够正确解析并提取经纬度信息。</think>以下是一个基于C语言的GPS数据解析示例代码框架。实际开发需要根据硬件平台和通信协议进行调整: ```c #include <stdio.h> #include <string.h> #include <stdlib.h> // 模拟串口数据接收(实际应使用硬件串口) char mock_uart[] = "$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A"; // GPS数据结构体 struct GPSData { double latitude; // 纬度 char lat_dir; // 纬度方向(N/S) double longitude; // 经度 char lon_dir; // 经度方向(E/W) int is_valid; // 数据有效性 }; // 将度分格式转换为十进制 double dm_to_decimal(double dm, char direction) { int degree = (int)(dm / 100); double minutes = dm - degree * 100; double decimal = degree + minutes / 60; return (direction == 'S' || direction == 'W') ? -decimal : decimal; } // 解析GPRMC语句 int parse_gprmc(char *data, struct GPSData *gps) { char *token; int field_count = 0; token = strtok(data, ","); while(token != NULL) { switch(field_count) { case 2: // 有效性检查 gps->is_valid = (strcmp(token, "A") == 0); break; case 3: // 纬度 gps->latitude = atof(token); break; case 4: // 纬度方向 gps->lat_dir = *token; break; case 5: // 经度 gps->longitude = atof(token); break; case 6: // 经度方向 gps->lon_dir = *token; break; } token = strtok(NULL, ","); field_count++; } return (field_count >= 7) ? 1 : 0; } int main() { struct GPSData current_gps; memset(&current_gps, 0, sizeof(current_gps)); // 模拟接收数据(实际应循环读取串口) if(strstr(mock_uart, "$GPRMC") != NULL) { if(parse_gprmc(mock_uart, &current_gps)) { if(current_gps.is_valid) { // 坐标转换 double final_lat = dm_to_decimal(current_gps.latitude, current_gps.lat_dir); double final_lon = dm_to_decimal(current_gps.longitude, current_gps.lon_dir); printf("纬度: %.6f°%c\n", final_lat, current_gps.lat_dir); printf("经度: %.6f°%c\n", final_lon, current_gps.lon_dir); } else { printf("警告:GPS定位无效\n"); } } } return 0; } ``` 关键点说明: 1. 硬件连接:GPS模块通常通过UART与MCU通信,需正确配置波特率(常用9600/38400bps) 2. 数据格式解析: - NMEA-0183标准协议 - 常用语句:$GPRMC(推荐最小定位信息) - 数据示例:$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A 3. 实际开发需注意: - 添加串口驱动代码(具体平台相关) - 实现数据缓存机制(防止数据截断) - 添加校验和验证(*号后的十六进制值) - 处理多语句解析($GPGGA等) - 增加超时判断和错误处理 4. 测试建议: - 使用USB-TTL转换器连接电脑进行调试 - 使用GNSS模拟器生成测试数据 - 注意冷启动/热启动时间差异 实际硬件操作需要包含对应平台的UART驱动代码,例如STM32的HAL库或Arduino的Serial库。建议先通过串口调试工具验证GPS模块输出数据的正确性,再进行代码开发。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值