简单仿制腾讯大数据星云图

写在前面

带伙们可以先看下腾讯的图,非常漂亮:


腾讯位置大数据星云图


再看看本文代码绘制的图,逼格降低99%:


在这里插入图片描述


但是轮廓还是有的!!!对吧?

用到的包

import re
import requests
import json
from fake_useragent import UserAgent
import pandas as pd
import numpy as np
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType
import pyecharts
import random
import time

此外,需要下载中国地图,以下包含省市、县区地图,但本文中未使用:

pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
pip install echarts-china-counties-pypkg
pip install echarts-china-misc-pypkg

静态文件

Github地址:


https://github.com/apache/echarts


需要dist目录下的echarts.min.js文件和test->data->map目录下的js文件夹(本文需要的是china.js)


修改静态文件目录,提高访问效率:

pyecharts.globals.CurrentConfig.ONLINE_HOST = "./js/"

文件夹结构为:在脚本存放目录下新建js文件夹,放入echarts.min.js,js文件夹中新建maps文件夹,放入china.js

代码部分

采集数据

腾讯的接口如下:


https://xingyun.map.qq.com/api/getXingyunPoints


参数为:

{
    'count':4,#固定值
    'rank':0,#范围为0-3
}

代码:

def get_data():
	#获取随机请求头
    headers = {
        'User-Agent':UserAgent().random
        }
	#接口
    url = 'https://xingyun.map.qq.com/api/getXingyunPoints'
	#空列表,保存清洗后的数据
    all_data = []
	#改变rank值进行抓取
    for i in range(0,4):
		#构造参数
        payload = {'count':4,'rank':i}
		#抓取数据,得到的是一个json字典,所以使用json解析
        response = requests.post(url = url,headers = headers,data=json.dumps(payload))
        datas = response.json()['locs']
		#用逗号分隔数据,主要有三项,分别是纬度,经度(数值是一百倍),以及该坐标的人数
        datas = datas.split(",")
		#将所有数据取整
        datas = [int(i) for i in datas[:-1]]
		#空列表,用于保存一个坐标点的信息
        a = []
		#遍历数据,每三条组成一个坐标点,并添加到all_data中
        for n,data in enumerate(datas):
            a.append(data)
            if (n + 1) % 3 == 0:
                all_data.append(a)
                a = []
	#将纬度和经度的数值除以100,得到新的列表并返回
    all_data = [[i[0] / 100,i[1] / 100,i[2]] for i in all_data]
    return all_data

数据去重

def clear_list(data):
	#获取纬度、经度、人数,转换为三个列表
    lat,lng,weight = [i[0] for i in data],[i[1] for i in data],[i[2] for i in data]
	#使用pandas去重
    dataframe = pd.DataFrame({'纬度':lat,'经度':lng,'人数':weight})
    dataframe.drop_duplicates(keep = 'first',inplace = True)
	#去重后的数据转换为列表,返回
    return dataframe[['纬度','经度','人数']].values.tolist()

获取国家边界

本篇文章不计算国外坐标,需要对数据进行过滤(如果想绘制世界地图,对本文代码稍作修改即可,主要是将maptype修改为world,然后将world.js保存到maps目录中),过滤的方法是point in polygon,在数学上叫射线法,python的shapely模块集成了该方法,比较方便。文本数据会放在文末。

def load_fence():
	#读取边界信息
    f = open('china_axis.txt','r')
    data = f.read()
    f.close()
	#使用正则表达式匹配坐标点
    pattern = re.compile('Point\((.*?)\)')
    polyline = re.findall(pattern,data)
	#空列表用于保存清洗后的坐标点
    buffer = []
	#以[经度,纬度]的列表对象保存到buffer中
    for line in polyline:
        if line:
            lng, lat = line.split(',')
            buffer.append([float(lng), float(lat)])
	#转换为数组并返回
    buffer = np.array(buffer)
    return buffer

装饰器

这部分可以不要,如果你想看看程序执行花了多长时间可以加上:

def count_time(func):
    def wrapper(*args,**kwargs):
        startTime = time.time()
        res = func(*args,**kwargs)
        endTime = time.time()
        msecs = (endTime - startTime)
        print("{:.2f}s".format(msecs))
        return res
    return wrapper

绘图

def plot_geo(all_data):
	#地图样式
    city = 'china'
	#初始化
    figure = Geo()
	#设定地图样式,is_roam禁止鼠标拖放和滑轮缩放,如果不想禁用则去掉该参数
    figure.add_schema(maptype=city,is_roam=False)
	#纬度、经度、人数列表
    lat,lng,weight = [i[0] for i in all_data],[i[1] for i in all_data],[i[2] for i in all_data]
	#保存数据对
    data_pair = []
    for i in range(len(lat)):
        # 定义坐标对应的名称,添加到坐标库中 add_coordinate(name, lng, lat)
        figure.add_coordinate('坐标{},{}'.format(lng[i],lat[i]), lng[i], lat[i])
        #添加数据对
        data_pair.append(('坐标{},{}'.format(lng[i],lat[i]),weight[i]))
    #数据对,绘图方式(散点图),点的大小
    figure.add('', data_pair, type_='scatter', symbol_size=1)
    #上面方式绘制的点无法跟随地图缩放,所以在最前面禁用掉了
    #以下方式绘制的点可以跟随缩放,数据点过多时不建议使用
    #figure.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=1)
    #设置样式
    figure.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    #自定义分段 color 可以用取色器取色
    pieces = [
        {'max': 1, 'label': '1', 'color': '#B0C4DE'},
        {'min': 2, 'max': 10, 'label': '2-10', 'color': '#1E90FF'},
        {'min': 11, 'max': 20, 'label': '11-20', 'color': '#00BFFF'},
        {'min': 21, 'max': 30, 'label': '21-30', 'color': '#87CEEB'},
        {'min': 31, 'max': 50, 'label': '31-50', 'color': '#87CEFA'},
        {'min': 51, 'max': 100, 'label': '51-100', 'color': '#1E90FF'},
        {'min': 101, 'max': 200, 'label': '101-200', 'color': '#00FFFF'},
        {'min': 201, 'label': '200以上', 'color': '#191970'}
    ]
    #is_piecewise 是否自定义分段,变为true才能生效
    figure.set_global_opts(
        visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),
        title_opts=opts.TitleOpts(title="坐标散点图"),
    )
    return figure

主函数

#启用装饰器
@count_time
def main():
	#获取数据
    datas = run()
	#去重
    datas = clear_list(datas)
	#打乱列表,以实现简单的随机取样
    random.shuffle(datas)
	#保存要绘制的坐标点
    all_data = []
	#获取边界范围
    fence = load_fence()
	#计数坐标点
    i = 0
	#抽样100000个坐标点
    while len(all_data) < 100000:
        data = datas[i]
		#坐标渲染成Point对象
        point = Point(data[1],data[0])
		#如果坐标在边界范围内,则添加到绘图列表中
        if Polygon(fence).contains(point) == True:
            all_data.append(data)
		#判断下一个点
        i += 1
	#绘图
    figure = plot_geo(all_data)
    # 渲染成html, 可用浏览器直接打开
    figure.render('render.html')

边界文本

function CreateChinaMapLine() {
    var pts = [];
    pt1 = new BMap.Point(124.326919, 39.841287);
    pts.push(pt1);
    pt2 = new BMap.Point(124.630475, 40.230192);
    pts.push(pt2);
    pt3 = new BMap.Point(124.980023, 40.420289);
    pts.push(pt3);
    pt4 = new BMap.Point(125.053612, 40.458947);
    pts.push(pt4);
    pt5 = new BMap.Point(125.028316, 40.520401);
    pts.push(pt5);
    pt6 = new BMap.Point(125.331871, 40.63438);
    pts.push(pt6);
    pt7 = new BMap.Point(125.456053, 40.61861);
    pts.push(pt7);
    pt8 = new BMap.Point(126.042467, 40.901897);
    pts.push(pt8);
    pt9 = new BMap.Point(126.888743, 41.73411);
    pts.push(pt9);
    pt10 = new BMap.Point(127.367072, 41.437131);

    pts.push(pt10);
    pt11 = new BMap.Point(128.148958, 41.347076);
    pts.push(pt11);
    pt12 = new BMap.Point(128.323732, 41.568524);
    pts.push(pt12);
    pt13 = new BMap.Point(128.112163, 41.961089);
    pts.push(pt13);
    pt14 = new BMap.Point(128.995233, 41.99541);
    pts.push(pt14);
    pt15 = new BMap.Point(129.418371, 42.378521);
    pts.push(pt15);
    pt16 = new BMap.Point(129.841509, 42.41943);
    pts.push(pt16);
    pt17 = new BMap.Point(130.080674, 42.90824);
    pts.push(pt17);
    pt18 = new BMap.Point(130.65099, 42.364879);
    pts.push(pt18);
    pt19 = new BMap.Point(130.503812, 42.637157);
    pts.push(pt19);
    pt20 = new BMap.Point(131.147717, 42.867653);
    pts.push(pt20);

    pt21 = new BMap.Point(131.313293, 43.366337);
    pts.push(pt21);
    pt22 = new BMap.Point(131.386882, 43.967324);
    pts.push(pt22);
    pt23 = new BMap.Point(131.202909, 44.798523);
    pts.push(pt23);
    pt24 = new BMap.Point(131.938801, 45.190155);
    pts.push(pt24);
    pt25 = new BMap.Point(133.024241, 44.916296);
    pts.push(pt25);
    pt26 = new BMap.Point(134.385641, 47.183241);
    pts.push(pt26);
    pt27 = new BMap.Point(134.845574, 47.670159);
    pts.push(pt27);
    pt28 = new BMap.Point(134.73519, 48.066299);
    pts.push(pt28);
    pt29 = new BMap.Point(135.250314, 48.434915);
    pts.push(pt29);
    pt30 = new BMap.Point(133.079433, 48.115602);
    pts.push(pt30);

    pt31 = new BMap.Point(132.453925, 47.76948);
    pts.push(pt31);
    pt32 = new BMap.Point(131.221306, 47.707427);
    pts.push(pt32);
    pt33 = new BMap.Point(130.85336, 48.078629);
    pts.push(pt33);
    pt34 = new BMap.Point(130.908552, 48.825163);
    pts.push(pt34);
    pt35 = new BMap.Point(128.093766, 49.632427);
    pts.push(pt35);
    pt36 = new BMap.Point(125.830898, 53.063643);
    pts.push(pt36);
    pt37 = new BMap.Point(123.420852, 53.60326);
    pts.push(pt37);
    pt38 = new BMap.Point(120.661258, 53.240599);
    pts.push(pt38);
    pt39 = new BMap.Point(119.906969, 52.584436);
    pts.push(pt39);
    pt40 = new BMap.Point(120.698052, 52.494695);
    pts.push(pt40);

    pt41 = new BMap.Point(120.734847, 52.05456);
    pts.push(pt41);
    pt42 = new BMap.Point(119.023898, 50.296998);
    pts.push(pt42);
    pt43 = new BMap.Point(119.263063, 50.143545);
    pts.push(pt43);
    pt44 = new BMap.Point(117.956855, 49.560675);
    pts.push(pt44);
    pt45 = new BMap.Point(116.889812, 49.858941);
    pts.push(pt45);
    pt46 = new BMap.Point(115.47322, 48.078629);
    pts.push(pt46);
    pt47 = new BMap.Point(115.988344, 47.607987);
    pts.push(pt47);
    pt48 = new BMap.Point(116.797825, 47.76948);
    pts.push(pt48);
    pt49 = new BMap.Point(117.349744, 47.520821);
    pts.push(pt49);
    pt50 = new BMap.Point(117.901663, 47.905734);
    pts.push(pt50);

    pt51 = new BMap.Point(118.508774, 47.893363);
    pts.push(pt51);
    pt52 = new BMap.Point(118.545569, 47.86861);
    pts.push(pt52);
    pt53 = new BMap.Point(119.888571, 46.843488);
    pts.push(pt53);
    pt54 = new BMap.Point(119.796585, 46.590415);
    pts.push(pt54);
    pt55 = new BMap.Point(119.005501, 46.717101);
    pts.push(pt55);
    pt56 = new BMap.Point(117.791279, 46.526961);
    pts.push(pt56);
    pt57 = new BMap.Point(117.404936, 46.310656);
    pts.push(pt57);
    pt58 = new BMap.Point(116.797825, 46.323404);
    pts.push(pt58);
    pt59 = new BMap.Point(116.282701, 45.798295);
    pts.push(pt59);
    pt60 = new BMap.Point(114.700534, 45.384961);
    pts.push(pt60);

    pt61 = new BMap.Point(113.670285, 44.759212);
    pts.push(pt61);
    pt62 = new BMap.Point(112.161707, 45.04687);
    pts.push(pt62);
    pt63 = new BMap.Point(111.444212, 44.298587);
    pts.push(pt63);
    pt64 = new BMap.Point(111.959336, 43.767669);
    pts.push(pt64);
    pt65 = new BMap.Point(110.082812, 42.569199);
    pts.push(pt65);
    pt66 = new BMap.Point(107.543985, 42.39216);
    pts.push(pt66);
    pt67 = new BMap.Point(105.115542, 41.609961);
    pts.push(pt67);
    pt68 = new BMap.Point(100.405834, 42.596391);
    pts.push(pt68);
    pt69 = new BMap.Point(96.560799, 42.772848);
    pts.push(pt69);
    pt70 = new BMap.Point(91.188788, 45.203163);
    pts.push(pt70);

    pt71 = new BMap.Point(89.992964, 47.893363);
    pts.push(pt71);
    pt72 = new BMap.Point(87.969261, 49.115857);
    pts.push(pt72);
    pt73 = new BMap.Point(86.847026, 49.055436);
    pts.push(pt73);
    pt74 = new BMap.Point(85.724791, 48.201769);
    pts.push(pt74);
    pt75 = new BMap.Point(85.301653, 47.05766);
    pts.push(pt75);
    pt76 = new BMap.Point(83.167567, 47.23339);
    pts.push(pt76);
    pt77 = new BMap.Point(82.284497, 45.52739);
    pts.push(pt77);
    pt78 = new BMap.Point(82.652442, 45.177144);
    pts.push(pt78);
    pt79 = new BMap.Point(81.769372, 45.346053);
    pts.push(pt79);
    pt80 = new BMap.Point(79.911245, 44.890145);
    pts.push(pt80);

    pt81 = new BMap.Point(80.702329, 43.20505);
    pts.push(pt81);
    pt82 = new BMap.Point(80.003232, 42.077702);
    pts.push(pt82);
    pt83 = new BMap.Point(77.096459, 41.05527);
    pts.push(pt83);
    pt84 = new BMap.Point(76.158197, 40.369298);
    pts.push(pt84);
    pt85 = new BMap.Point(75.753456, 40.594072);
    pts.push(pt85);
    pt86 = new BMap.Point(74.925578, 40.48178);
    pts.push(pt86);
    pt87 = new BMap.Point(73.803343, 39.605094);
    pts.push(pt87);
    pt88 = new BMap.Point(73.637767, 39.291284);
    pts.push(pt88);
    pt89 = new BMap.Point(73.913726, 38.457149);
    pts.push(pt89);
    pt90 = new BMap.Point(74.612824, 38.500536);
    pts.push(pt90);

    pt91 = new BMap.Point(74.999167, 37.31988);
    pts.push(pt91);
    pt92 = new BMap.Point(77.924337, 35.325072);
    pts.push(pt92);
    pt93 = new BMap.Point(78.273886, 34.598061);
    pts.push(pt93);
    pt94 = new BMap.Point(79.101764, 34.293224);
    pts.push(pt94);
    pt95 = new BMap.Point(78.770613, 33.987267);
    pts.push(pt95);
    pt96 = new BMap.Point(79.230545, 32.472038);
    pts.push(pt96);
    pt97 = new BMap.Point(78.880997, 32.59672);
    pts.push(pt97);
    pt98 = new BMap.Point(78.421064, 32.425237);
    pts.push(pt98);
    pt99 = new BMap.Point(78.844202, 31.18404);
    pts.push(pt99);
    pt100 = new BMap.Point(81.180659, 29.990271);
    pts.push(pt100);

    pt101 = new BMap.Point(81.71418, 30.34198);
    pts.push(pt101);
    pt102 = new BMap.Point(86.092737, 27.935542);
    pts.push(pt102);
    pt103 = new BMap.Point(88.760345, 27.951881);
    pts.push(pt103);
    pt104 = new BMap.Point(88.99951, 27.197728);
    pts.push(pt104);
    pt105 = new BMap.Point(89.845786, 28.098817);
    pts.push(pt105);
    pt106 = new BMap.Point(91.538337, 27.772017);
    pts.push(pt106);
    pt107 = new BMap.Point(92.108653, 26.769165);
    pts.push(pt107);
    pt108 = new BMap.Point(93.893191, 26.851709);
    pts.push(pt108);
    pt109 = new BMap.Point(95.916893, 28.115131);
    pts.push(pt109);
    pt110 = new BMap.Point(97.223102, 27.690161);
    pts.push(pt110);

    pt111 = new BMap.Point(97.609445, 28.375809);
    pts.push(pt111);
    pt112 = new BMap.Point(98.363734, 27.427807);
    pts.push(pt112);
    pt113 = new BMap.Point(98.73168, 26.653501);
    pts.push(pt113);
    pt114 = new BMap.Point(97.646239, 24.702995);
    pts.push(pt114);
    pt115 = new BMap.Point(97.627842, 23.842845);
    pts.push(pt115);
    pt116 = new BMap.Point(98.658091, 23.944344);
    pts.push(pt116);
    pt117 = new BMap.Point(98.970845, 23.045009);
    pts.push(pt117);
    pt118 = new BMap.Point(99.449174, 22.89168);
    pts.push(pt118);
    pt119 = new BMap.Point(99.21001, 21.96805);
    pts.push(pt119);
    pt120 = new BMap.Point(99.982696, 21.933723);
    pts.push(pt120);

    pt121 = new BMap.Point(100.166669, 21.366121);
    pts.push(pt121);
    pt122 = new BMap.Point(101.086534, 21.589991);
    pts.push(pt122);
    pt123 = new BMap.Point(101.730439, 21.055576);
    pts.push(pt123);
    pt124 = new BMap.Point(101.969604, 21.31441);
    pts.push(pt124);
    pt125 = new BMap.Point(101.804028, 22.190972);
    pts.push(pt125);
    pt126 = new BMap.Point(102.53992, 22.53323);
    pts.push(pt126);
    pt127 = new BMap.Point(103.956512, 22.447745);
    pts.push(pt127);
    pt128 = new BMap.Point(105.465091, 23.130116);
    pts.push(pt128);
    pt129 = new BMap.Point(107.819945, 21.435041);
    pts.push(pt129);
    pt130 = new BMap.Point(108.408658, 20.588528);
    pts.push(pt130);

    pt131 = new BMap.Point(108.243082, 17.791978);
    pts.push(pt131);
    pt132 = new BMap.Point(110.101209, 14.556493);
    pts.push(pt132);
    pt133 = new BMap.Point(109.82525, 10.162358);
    pts.push(pt133);
    pt134 = new BMap.Point(108.151096, 6.074665);
    pts.push(pt134);
    pt135 = new BMap.Point(109.604482, 3.416913);
    pts.push(pt135);
    pt136 = new BMap.Point(113.136763, 3.712694);
    pts.push(pt136);
    pt137 = new BMap.Point(115.362836, 6.737258);
    pts.push(pt137);
    pt138 = new BMap.Point(117.404936, 9.505473);
    pts.push(pt138);
    pt139 = new BMap.Point(119.318255, 14.574413);
    pts.push(pt139);
    pt140 = new BMap.Point(120.164531, 19.12633);
    pts.push(pt140);

    pt141 = new BMap.Point(122.059452, 21.693198);
    pts.push(pt141);
    pt142 = new BMap.Point(122.813741, 24.686186);
    pts.push(pt142);
    pt143 = new BMap.Point(124.230333, 28.457139);
    pts.push(pt143);
    pt144 = new BMap.Point(124.855841, 32.721228);
    pts.push(pt144);
    pt145 = new BMap.Point(124.230333, 36.56674);
    pts.push(pt145);
    pt146 = new BMap.Point(124.487895, 39.59086);
    pts.push(pt146);

    return pts;
}

完整代码

import re
import requests
import json
from fake_useragent import UserAgent
import pandas as pd
import folium
import numpy as np
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
from folium.plugins import HeatMap
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType
import pyecharts
import random
import time

pyecharts.globals.CurrentConfig.ONLINE_HOST = "./js/"

def get_data():
    headers = {
        'User-Agent':UserAgent().random
        }
    url = 'https://xingyun.map.qq.com/api/getXingyunPoints'
    all_data = []
    for i in range(0,4):
        payload = {'count':4,'rank':i}
        response = requests.post(url = url,headers = headers,data=json.dumps(payload))
        datas = response.json()['locs']
        datas = datas.split(",")
        datas = [int(i) for i in datas[:-1]]
        a = []
        for n,data in enumerate(datas):
            a.append(data)
            if (n + 1) % 3 == 0:
                all_data.append(a)
                a = []
    all_data = [[i[0] / 100,i[1] / 100,i[2]] for i in all_data]
    return all_data

def count_time(func):
    def wrapper(*args,**kwargs):
        startTime = time.time()
        res = func(*args,**kwargs)
        endTime = time.time()
        msecs = (endTime - startTime)
        print("{:.2f}s".format(msecs))
        return res
    return wrapper

def clear_list(data):
    lat,lng,weight = [i[0] for i in data],[i[1] for i in data],[i[2] for i in data]
    dataframe = pd.DataFrame({'纬度':lat,'经度':lng,'人数':weight})
    dataframe.drop_duplicates(keep = 'first',inplace = True)
    return dataframe[['纬度','经度','人数']].values.tolist()

def load_fence():
    f = open('china_axis.txt','r')
    data = f.read()
    f.close()
    pattern = re.compile('Point\((.*?)\)')
    polyline = re.findall(pattern,data)
    buffer = []
    for line in polyline:
        if line:
            lng, lat = line.split(',')
            buffer.append([float(lng), float(lat)])
    buffer = np.array(buffer)
    return buffer

def plot_geo(all_data):
    city = 'china'
    figure = Geo()
    figure.add_schema(maptype=city,is_roam=False)
    lat,lng,weight = [i[0] for i in all_data],[i[1] for i in all_data],[i[2] for i in all_data]
    data_pair = []
    for i in range(len(lat)):
        figure.add_coordinate('坐标{},{}'.format(lng[i],lat[i]), lng[i], lat[i])
        data_pair.append(('坐标{},{}'.format(lng[i],lat[i]),weight[i]))

    figure.add('', data_pair, type_='scatter', symbol_size=1)
    #figure.add('', data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=1)
    figure.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    pieces = [
        {'max': 1, 'label': '1', 'color': '#B0C4DE'},
        {'min': 2, 'max': 10, 'label': '2-10', 'color': '#1E90FF'},
        {'min': 11, 'max': 20, 'label': '11-20', 'color': '#00BFFF'},
        {'min': 21, 'max': 30, 'label': '21-30', 'color': '#87CEEB'},
        {'min': 31, 'max': 50, 'label': '31-50', 'color': '#87CEFA'},
        {'min': 51, 'max': 100, 'label': '51-100', 'color': '#1E90FF'},
        {'min': 101, 'max': 200, 'label': '101-200', 'color': '#00FFFF'},
        {'min': 201, 'label': '200以上', 'color': '#191970'}
    ]
    figure.set_global_opts(
        visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),
        title_opts=opts.TitleOpts(title="坐标散点图"),
    )
    return figure

@count_time
def main():
    datas = get_data()
    datas = clear_list(datas)
    random.shuffle(datas)
    all_data = []
    fence = load_fence()
    i = 0
    while len(all_data) < 100000:
        data = datas[i]
        point = Point(data[1],data[0])
        if Polygon(fence).contains(point) == True:
            all_data.append(data)
        i += 1

    figure = plot_geo(all_data)
    figure.render('星云.html')

if __name__ == '__main__':
    main()

参考文献

判断一个地图坐标是否在中国境内


Pyecharts 根据经纬度和量值的大小,画出散点图


给出经纬度,判断是否在指定区域

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值