专栏名称: 城长数据
ArcGIS for Urabn planning.主要面向城市规划专业,通过全方位的ArcGIS技术与方法讲解,达到高效运用ArcGIS ,以辅助城市规划设计及研究的目的。
目录
相关文章推荐
植物星球  ·  天呐,棣棠花、栀子花开了 ·  3 天前  
武汉发布  ·  武大樱花突然开了!好多人拍照 ·  6 天前  
武汉发布  ·  武大樱花突然开了!好多人拍照 ·  6 天前  
会计雅苑  ·  取数查账抽凭工具永久免费 ·  1 周前  
51好读  ›  专栏  ›  城长数据

百度POI代码修正

城长数据  · 公众号  ·  · 2016-12-01 14:04

正文

前段时间公布的百度POI代码划分小网格算法有BUG,现已修正。

具体编写逻辑见:http://www.workloadup.com/baidupoi.html

填入坐标时请保留2位小数。


# -*- coding:utf-8 -*-

import json

import os

import urllib2

import sys

import time

reload(sys)

sys.setdefaultencoding('utf8')


## http://api.map.baidu.com/place/v2/search?query=银行&bounds=39.615,116.404,39.975,116.414&page_size=20&page_num=0&output=json&ak=

##  116.110,39.713   116.699,40.154


class BaiDuPOI(object):

    def __init__(self,itemy,loc):

        self.itemy = itemy

        self.loc = loc


    def urls(self):

        api_key = baidu_api

        urls = []

        for pages in range(0,20):

            url = 'http://api.map.baidu.com/place/v2/search?query=' + self.itemy + '&bounds=' + self.loc +'&page_size=20&page_num=' + str(pages) + '&output=json&ak=' + api_key

            urls.append(url)

        return urls


    def baidu_search(self):

        json_sel = []

        for url in self.urls():

            json_obj = urllib2.urlopen(url)

            data = json.load(json_obj)       

            for item in data['results']:

                jname = item["name"]

                jlat = item["location"]["lat"]

                jlng = item["location"]["lng"]

                js_sel = jname +',' + str(jlat) + ',' + str(jlng)

                json_sel.append(js_sel)

        return json_sel


class LocaDiv(object):    

    def __init__(self,loc_all,divd):

        self.loc_all = loc_all

        self.divd = divd

     

    

    def lat_all(self):    

        lat_sw = float(self.loc_all.split(',')[0])

        lat_ne = float(self.loc_all.split(',')[2])

        lat_list = [str(lat_ne)]

        while lat_ne-lat_sw >= 0:

            m = lat_ne - self.divd

            lat_ne = lat_ne - self.divd

            lat_list.append('%.2f' % m)

        return sorted(lat_list)

    

    def lng_all(self):

        lng_sw = float(self.loc_all.split(',')[1])

        lng_ne = float(self.loc_all.split(',')[3])

        lng_list = [str(lng_ne)]

        while lng_ne-lng_sw >= 0:

            m = lng_ne - self.divd

            lng_ne = lng_ne - self.divd

            lng_list.append('%.2f' % m)

        return sorted(lng_list)

    

    def ls_com(self):

        l1 = self.lat_all()

        l2 = self.lng_all()

        ab_list = []

        for i in range(0,len(l1)):

            a = str(l1[i])

            for i2 in range(0,len(l2)):

                b = str(l2[i2])

                ab = a+','+b

                ab_list.append(ab)

        return ab_list

    

    def ls_row(self):

        l1 = self.lat_all()

        l2 = self.lng_all()        

        ls_com_v = self.ls_com()

        ls = []

        for n in range(0,len(l1)-1):

            for i in range(len(l2)*n,len(l2)*(n+1)-1):

                a = ls_com_v[i]

                b = ls_com_v[i+len(l2)+1]

                ab = a+','+b

                ls.append(ab)

        return ls 

        

if __name__ == '__main__':  

    baidu_api = ''        #这里填入你的百度API

    print u"开始爬数据,请稍等..."

    start_time = time.time()                                                          

    loc = LocaDiv('31.26,120.55,31.38,120.76',0.05)      # 填入爬取区域坐标(这个坐标是苏州市城区区域坐标)、子区域长宽

    locs_to_use = loc.ls_row()

    for loc_to_use in locs_to_use:        

        par = BaiDuPOI(u'公交站',loc_to_use)                #请修改这里的类型参数

        a = par.baidu_search()

        doc = open('baidu_csv_szgj.csv','w')                   #请修改这里的保存文件名,爬取完毕后请用记事本打开并保存下CSV文件,否则会乱码

        for ax in a:

            doc.write(ax)

            doc.write('\n')

        doc.close

    end_time = time.time()

    print u"数据爬取完毕,用时%.2f秒" % (end_time - start_time)