城市微博签到数据分享地址解码与纠偏教程

news2024/11/25 16:35:09

收录于合集

#开源4个

#GIS34个

#社交媒体2个

#大数据4个

  哈喽大家好,我又来啦!最近一直有小伙伴私戳问我要 签到数据,本着 开源共享的精神,我这次给大家分享中国多个城市2022年9月的匿名签到数据,欢迎大家点击在看转发,您的支持是喵喵 原创写作最大的动力!也欢迎与我做朋友!

之前几期我们介绍过微博数据的获取,大概获取为下图所示的json数据。

我们以杭州市为例,对json进行简单的处理,转化为csv格式,对属性进行一个统计。数据主要的属性有这些:

'userid', 'lng', 'lat', 'username', 'repostscount', 'weibotext', 'weiboid', 'createtime', 'fansnum', 'location', 'imgurl', 'follow_num', 'gender', 'Address', 'Heat', 'Source', 'city'

分别是用户的ID,经纬度,转发数,终端设备,地址描述,性别等信息。

单条微博平均转发数约为1.5,平均关注约为1242。可以看到这里的lng与lat值为0,不要担心,只是我抓取的时候为了避免网络错误,避免因秘钥超出配额引发的各种各样的错误特意设置的。

我们先来看看如何根据名称请求地址。

这位男性微博用户签到地址为 杭州·神游,不知道是什么类型的地址。我们使用百度API对其进行解析,将 杭州·替换为 杭州市,将 city限制在杭州,大家自己申请地址解码API,每天大概有5000次的免费额度。s

 
  1. http://api.map.baidu.com/geocoder?address=" + address + "&city=" + str(city) + "&output=json&key=你申请的key

请求的结果长这样。

经纬度很容易看出来,这个奇怪的字符是啥?啥啥啥,写的都是啥?

我们将这个奇怪的Unicode编码转成中文试试,哦,原来这个神游有50%(confidence)的可能是个旅游景点...

我们知道,由于国家法律规定坐标需要加密,所以我们经常在谷歌地球上看到这种奇怪的位置偏移。

我们使用网上开源的纠偏算法对其进行处理,这一步骤的代码如下,当然您也可以点击文末的阅读原文访问Github代链接。

import requestsimport timeimport jsonimport reimport osfrom pyquery import PyQuery as pqimport mathimport os,jsonimport pandas as pd
key = ''  # 这里填写你的百度开放平台的keyx_pi = 0pi = 0 # πa =0 # 长半轴ee = 0  # 扁率#椭球参数关注微信公众号“协同感知与知识服务”(sensingcity)后台回复 椭球参数 免费获取
def transformlat(lng, lat):    ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \          0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))    ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *            math.sin(2.0 * lng * pi)) * 2.0 / 3.0    ret += (20.0 * math.sin(lat * pi) + 40.0 *            math.sin(lat / 3.0 * pi)) * 2.0 / 3.0    ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *            math.sin(lat * pi / 30.0)) * 2.0 / 3.0    return ret

def transformlng(lng, lat):    ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \          0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))    ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *            math.sin(2.0 * lng * pi)) * 2.0 / 3.0    ret += (20.0 * math.sin(lng * pi) + 40.0 *            math.sin(lng / 3.0 * pi)) * 2.0 / 3.0    ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *            math.sin(lng / 30.0 * pi)) * 2.0 / 3.0    return ret

def out_of_china(lng, lat):    """    判断是否在国内,不在国内不做偏移    :param lng:    :param lat:    :return:    """    if lng < 72.004 or lng > 137.8347:        return True    if lat < 0.8293 or lat > 55.8271:        return True    return False

def bd09togcj02(bd_lon, bd_lat):    """    百度坐标系(BD-09)转火星坐标系(GCJ-02)    百度——>谷歌、高德    :param bd_lat:百度坐标纬度    :param bd_lon:百度坐标经度    :return:转换后的坐标列表形式    """    x = bd_lon - 0.0065    y = bd_lat - 0.006    z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)    theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)    gg_lng = z * math.cos(theta)    gg_lat = z * math.sin(theta)    return [gg_lng, gg_lat]

def gcj02towgs84(lng, lat):    """    GCJ02(火星坐标系)转GPS84    :param lng:火星坐标系的经度    :param lat:火星坐标系纬度    :return:    """    if out_of_china(lng, lat):        return lng, lat    dlat = transformlat(lng - 105.0, lat - 35.0)    dlng = transformlng(lng - 105.0, lat - 35.0)    radlat = lat / 180.0 * pi    magic = math.sin(radlat)    magic = 1 - ee * magic * magic    sqrtmagic = math.sqrt(magic)    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)    dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)    mglat = lat + dlat    mglng = lng + dlng    return [lng * 2 - mglng, lat * 2 - mglat]

def bd09towgs84(lng, lat):  # 114.277591,30.580842    result2 = bd09togcj02(lng, lat)    result4 = gcj02towgs84(result2[0], result2[1])    return result4

# 日期转换def trans_format(time_string):    from_format = '%a %b %d %H:%M:%S +0800 %Y'    to_format = '%Y-%m-%d %H:%M:%S'    time_struct = time.strptime(time_string, from_format)    times = time.strftime(to_format, time_struct)    return times

def geocodeB(address, city):    loca = {}    try:        if address.find('·'):            address = address.replace('·', '市', 1)        base = "http://api.map.baidu.com/geocoder?address=" + address + "&city=" + str(city) + "&output=json&key="+key        response = requests.get(base,timeout=(3.05, 27))        answer = response.json()        tamped = bd09towgs84(answer['result']['location']['lng'], answer['result']['location']['lat'])        loca['lng'] = tamped[0]        loca['lat'] = tamped[1]        level=answer['result']['level']        loca['level']=level        print(address,loca['lng'], loca['lat'],level)
        if loca:            return loca    except:        print(address)        loca['lng'] = 0        loca['lat'] = 0        loca['level']='无'        return loca        # geocodeB(address, city)def get_latlng(location,address_dict,cityname):    if location in address_dict:        loca = address_dict[location]    else:        loca = geocodeB(location, cityname)        # print(location)        address_dict[location] = loca    return loca
#前面是坐标转换分割线######################def pdfFilesPath(path):    filePaths = [] # 存储目录下的所有文件名,含路径    for root,dirs,files in os.walk(path):        for file in files:            if file.split('.')[-1]=='json':                filePaths.append(os.path.join(root,file))    return filePaths
if __name__=='__main__':    # 原始Json文件所在文件夹    filepath = r'C:\全国微博数据'    files=pdfFilesPath(filepath)        #我们抓取的字段    columns=['user_id','lng','lat','user_name','reposts_count',        'weibo_text','weibo_id','create_time','fans_num','location','img_url','follow_num','gender','Address','Heat','Source','city']        for file in files:        #每个城市一个地址词典        address_dict = {}                with open(file,'rb+') as f:            tmp=f.readlines()        cityname=json.loads(tmp[0])['city']                print('正在处理...'+cityname)        if cityname in ['长沙','深圳','广州','上海','杭州','郑州','成都','天津','福州','南京']:            with open(cityname+'.csv','w+',encoding='utf-8') as f:                for col in columns:                    f.write(col)                    f.write(',')                f.write('\n')                for i in tmp:                    data=json.loads(i)                    for col in columns:                        f.write(str(data[col]).replace('\n',''))                        f.write(',')                    f.write('\n')                    df=pd.read_csv(cityname+'.csv',error_bad_lines=False)            rf=df.drop_duplicates(subset=['weibo_id'], keep='first', inplace=False)            rf=rf.drop(['Unnamed: 17'], axis=1)                    rf['latlng'] = rf.apply(lambda x: get_latlng(x['location'],address_dict,cityname), axis=1)                    rf['lat'] = rf.apply(lambda x: x['latlng']['lat'], axis=1)            rf['lng'] = rf.apply(lambda x: x['latlng']['lng'], axis=1)            rf['level'] = rf.apply(lambda x: x['latlng']['level'], axis=1)            rf=rf.drop(['latlng'], axis=1)            rf.to_csv('完整版'+cityname+'.csv',index=None)            rf[['user_id','lng','lat','reposts_count',            'weibo_text','weibo_id','create_time',            'fans_num','location','follow_num','gender',            'Address','Heat','Source','city']].head(20000).to_csv('共享版'+cityname+'.csv',index=None)

这样处理还有一点小的缺点,因为百度API的准确度并不能达到100%,如果遇见异常值,使用address而不是location字段应该会避免一些问题(使用天目山路518号东南方向160米而不是神游),当然如果地址过于模糊,如(杭州)这样就没办法啦。好啦,那么我们进行下一步。先看看各个值的分布。

玩微博的还是女性多一些,约为男性的2.5倍。

看看上个月Top10的签到位置。

不懂就问,西湖热度很高可以接受,这个下沙是个什么地方?

之前我们分享了上海的AOI数据,那么我们再来展点试试。

借助这种时间序列数据,完全可以做城市活力的研究了。它的分布格局也与街景均匀感知不同,属于高度的空间有偏感知。

点击阅读原文获取坐标纠偏代码,我们分享了8个城市的POI数据,公开版分享了部分数据并删除了个人敏感信息,回复:

南京POI 获取南京市签到数据

天津POI 获取天津市签到数据

深圳POI 获取深圳市签到数据

广州POI 获取广州市签到数据

上海POI 获取上海市签到数据

杭州POI 获取杭州市签到数据

成都POI 获取成都市签到数据

福州POI 获取福州市签到数据

好啦,我们下期见,分享我们录用在 Journal of Environmental Management 上的碳排放空间平等和空间正义的研究。

如果您觉得有帮助,请引用以下至少一篇文章。

1.Zhang Y, Chen Z, Zheng X, et al. Extracting the location of flooding events in urban systems and analyzing the semantic risk using social sensing data[J]. Journal of Hydrology, 2021, 603: 127053.

2.Chen N, Zhang Y, Du W, et al. KE-CNN: A new social sensing method for extracting geographical attributes from text semantic features and its application in Wuhan, China[J]. Computers, Environment and Urban Systems, 2021, 88: 101629.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Python做兼职,轻松赚取零花钱,分享Python兼职经验

文章目录 前言一、技术方案二、接单流程三、注意事项四、总结 前言 某家电商公司需要从竞争对手的网站上获取商品信息&#xff0c;以便更好地了解市场情况和竞争对手的策略。由于该公司没有专门的技术团队&#xff0c;因此他们需要找一家专业的爬虫服务公司来帮助他们完成这项…

冈萨雷斯DIP第4章知识点

文章目录 4.1 背景4.3 取样和取样函数的傅里叶变换4.5 二变量函数的傅里叶变换4.6 二维 DFT 和 IDFT 的一些性质4.6.6 二维离散卷积定理 4.7 频率域滤波基础4.7.3 频率域滤波步骤小结4.7.4 空间域和频率域滤波之间的对应关系 4.8 使用低通频率域滤波器平滑图像4.9 使用高通滤波…

Nacos作为服务注册中心简单示例

一、服务注册与发现场景 主要包含两个服务&#xff1a; zhshl-order服务: 作为服务消费者zhsl-stock服务: 作为服务提供者 当我们启用服务发现的时候,需要进行的操作主要有三步 0、前置条件,需要先搭建好一个nacas服务&#xff0c;可以是一个集群或者是单个nacos服务。可以…

MySQL 数据定义语言 DDL

文章目录 数据定义语言 DDL表的设计范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09; 创建表修改表删除表截断表 数据定义语言 DDL 前面我们学习的 DML 语言&#xff0c;主要实现对数据的增、删、改等基本操作…

零基础入门网络安全必看的5本书籍(附书单pdf)

作为一个Java转行网络安全的过来人&#xff0c;我深知自学时的种种不易&#xff0c;同时也经常有粉丝朋友问我&#xff1a;刚入门应该怎么学、有哪些书籍推荐等问题&#xff0c;今天我就把我自己的学习书单分享给大家&#xff0c;希望对大家有帮助&#xff01; 一、5本必读书籍…

JVM垃圾回收——对象进入老年代

目录 1、什么是大对象以及大对象对垃圾回收的影响 2、什么情况下对象会进入老年代 2.1 当创建对象的大小超过-XX:PretenureSizeThreshold的设定值 2.2 长期存活的对象将进入老年代 2.3 动态年龄判定 2.4 空间担保分配 什么是空间分配担保&#xff1f; 为什么要…

uploads靶场通关(1-11关)

Pass-01&#xff08;JS校验&#xff09; 看题目我们准备好我们的php脚本文件&#xff0c;命名为1.php 上传该php文件&#xff0c;发现上传失败 方法一&#xff1a;将浏览器的JavaScript禁用 然后就能上传了 方法二&#xff1a; 查看源码&#xff0c;发现只能上传以下形式的文…

【Docker】LXC所实现的隔离性、Linux Namespace等讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

域名解析异常有哪些办法?如何实现动态域名解析?

什么是域名解析&#xff1f; 域名解析就是把域名解析成一个ip地址&#xff0c;我们大多数人都喜欢记忆域名&#xff0c;但是机器只认识IP地址&#xff0c;只要这个IP地址对应相关域名&#xff0c;这就叫域名解析。 工作中常会遇到域名解析故障&#xff0c;比如访问站点对应的…

FPGA问答系列--Vivado Schematic中的实线和虚线有什么区别?

FPGA问答系列–Vivado Schematic中的实线和虚线有什么区别&#xff1f; 前言&#xff1a;本文章为FPGA问答系列&#xff0c;我们会定期整理FPGA交流群&#xff08;包括其他FPGA博主的群&#xff09;里面有价值的问题&#xff0c;并汇总成文章&#xff0c;如果问题多的话就每周…

ChatPPT一键制作PPT,效果拉满!

&#x1f4a7; C h a t P P T 一键制作 P P T &#xff0c;效果拉满&#xff01; \color{#FF1493}{ChatPPT一键制作PPT&#xff0c;效果拉满&#xff01;} ChatPPT一键制作PPT&#xff0c;效果拉满&#xff01;&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我…

阿里云nginx配置https踩坑(配置完后访问显示无法访问此网站)

本人小前端一枚&#xff0c;最近在玩服务器部署自己的东西时踩了个坑&#xff01;&#xff01;&#xff01; server {listen 443 ssl;server_name localhost;ssl_certificate 证书.com.pem;ssl_certificate_key 证书.com.key;#后台管理静态资源存放location / { #文件目…

2023-06-04 Unity ScriptableObject2——ScriptableObject 的应用

文章目录 一、配置数据二、复用数据三、多态特性的利用四、单例模式获取数据 一、配置数据 ​ ScriptableObject 数据文件非常适合用来做配置文件&#xff1a; 配置文件的数据在游戏发布之前定规则配置文件的数据在游戏运行时只会读出来使用&#xff0c;不会改变内容在 Unity…

MPS|如何学习电路设计?帮你快速上手

​电路设计是电子工程中的重要领域之一&#xff0c;涉及到电子元件的选择、电路的设计和分析、电路板的制作等多个方面。对于初学者来说&#xff0c;学习电路设计需要掌握一定的基础知识和技能&#xff0c;同时需要有耐心和实践经验。本文将从七个方面总结如何学习电路设计&…

Vue (9)

Vue (9) 文章目录 1. 消息订阅与发布1.1 总结1.2 修改 TodoList 案例 2. 为 TodoList 添加编辑功能3. $nextTick4. 过度与动画4.1 动画效果4.2 过度效果4.3 集成第三方动画4.4 总结4.5 修改 TodoList 案例 1. 消息订阅与发布 上文我们已经将全局事件总线学完了知道了全局事件总…

day6 -- 数据的分组和描述性统计

学习内容 描述性统计函数&#xff0c;包括平均值&#xff0c;最大/小值&#xff0c;行数&#xff0c;总和使用 GROUP BY子句和HAVING子句 对数据进行分组操作 描述性统计数函数 除了上面提到的聚合函数外&#xff0c;MySQL还提供了以下其他一些常用的聚合函数&#xff1a; – …

Python学习40:维吉尼亚密码——解密

凯撒密码的加密强度是很低的&#xff0c;只需简单地统计字频就可以破译。人们在单一凯撒密码的基础上扩展出多表密码&#xff0c;称为“维吉尼亚”密码。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪…

【环境搭建】一些奇奇怪怪的环境问题

【设备信息】我的设备是4070ti&#xff0c;支持cuda12.0,但是目前用的还是11.7 1&#xff09;fatal error: cusparse.h: No such file or directory 因为cuda版本和改名的原因&#xff0c;这个在cuda版本中比较有效的解决办法是&#xff1a; sudo apt search libcusparse得到…

基于SpringBoot+Vue的自习室预订系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

C/C++开发,opencv读写图像函数详解

目录 一、cv::imread函数读取图像 1.1 imread函数 1.2 imread函数的参数解析 1.3 imread函数实践案例 1.4 编译及测试 二、cv::imwrite函数存储图像 2.1 cv::imwrite函数 2.2 imwrite函数参数解析 2.3 imwrite函数实践案例 2.4 编译及测试 一、cv::imread函数读取图像 1.1 im…