import math
import random
def rad(dg):
return (dg * math.pi / 180)
def deg(rd):
return (rd * 180 / math.pi)
def normalizeLongitude(lon):
n = math.pi
if (lon > n):
lon = lon - 2 * n
elif (lon < -n):
lon = lon + 2 * n
return lon
def isNumeric(s, mn, mx, allowNull):
result = True
if (s == "" and not allowNull):
return False
else:
if ((float(s) != s) or (s < mn) or (s > mx)):
return False
return result
def calc_circle(startlat, startlon, points_num, maxdist, distunits='KM'):
assert isinstance(startlat, float), 'startlat must be float type'
assert isinstance(startlon, float), 'startlon must be float type'
circum_miles = 12440.883
circum_km = 20020.732
p = points_num
# startlat = latLonToDecimal(startlat_value, 1, "latitude")
if startlat == -999:
return
# gStartlat = startlat
brg = [0, 180, 0]
j = 0
if (startlat == 90):
startlat = 89.99999999
j = 1
if (startlat == -90):
startlat = -89.99999999
j = 2
startlat = rad(startlat)
if (startlon == -999):
return
startlon = rad(startlon)
radius_earth = 0
if (distunits == 'km'):
mx = circum_km
radius_earth = 6372.796924
else:
mx = circum_miles
radius_earth = 3960.056052
if (isNumeric(maxdist, 0, mx, False) is False):
raise Exception("The max distance must be a valid number between 0 and " + mx)
maxdist = maxdist / radius_earth
cosdif = math.cos(maxdist) - 1
sinstartlat = math.sin(startlat)
cosstartlat = math.cos(startlat)
dist = 0
rad360 = 2 * math.pi
output_arr = []
for i in range(p):
dist = math.acos((random.random() * cosdif + 1))
brg[0] = rad360 * random.random()
lat = math.asin(sinstartlat * math.cos(dist) + cosstartlat * math.sin(dist) * math.cos(brg[0]))
lon = deg(normalizeLongitude(startlon * 1 + math.atan2(math.sin(brg[0]) * math.sin(dist) * cosstartlat, math.cos(dist) - sinstartlat * math.sin(lat))))
lat = deg(lat)
dist = round(dist * radius_earth * 10000) / 10000
brg[0] = round(deg(brg[0]) * 1000) / 1000
# print('lat', lat, 'lng', lon, dist, brg[j])
output_arr.append((lat, lon, dist, brg[j]))
return output_arr
_locations = [
("北京市", 116.405289, 39.904987),
("天津市", 117.190186, 39.125595),
("石家庄市", 114.502464, 38.045475),
("唐山市", 118.175392, 39.635113),
("秦皇岛市", 119.586578, 39.942532),
("邯郸市", 114.490685, 36.612274),
("邢台市", 114.50885, 37.068199),
("保定市", 115.48233, 38.867657),
("张家口市", 114.884094, 40.811901),
("承德市", 117.939156, 40.976204),
("沧州市", 116.85746, 38.310581),
("廊坊市", 116.704437, 39.523926),
("衡水市", 115.665993, 37.735096),
("太原市", 112.549248, 37.857014),
("大同市", 113.295258, 40.090309),
("阳泉市", 113.583282, 37.861187),
("长治市", 113.113556, 36.191113),
("晋城市", 112.851273, 35.497555),
("朔州市", 112.433388, 39.331261),
("晋中市", 112.736465, 37.696495),
("运城市", 111.00396, 35.022778),
("忻州市", 112.733536, 38.41769),
("临汾市", 111.517975, 36.084148),
("吕梁市", 111.134338, 37.524364),
("呼和浩特市", 111.670799, 40.81831),
("包头市", 109.840408, 40.658169),
("乌海市", 106.825562, 39.673733),
("赤峰市", 118.956802, 42.275318),
("通辽市", 122.263123, 43.617428),
("鄂尔多斯市", 109.990288, 39.817181),
("呼伦贝尔市", 119.758171, 49.215332),
("巴彦淖尔市", 107.416962, 40.757401),
("乌兰察布市", 113.11454, 41.034126),
("兴安盟", 122.07032, 46.076267),
("锡林郭勒盟", 116.090996, 43.944019),
("阿拉善盟", 105.706421, 38.844814),
("沈阳市", 123.429092, 41.796768),
("大连市", 121.618622, 38.914589),
("鞍山市", 122.995628, 41.110626),
("抚顺市", 123.921112, 41.875957),
("本溪市", 123.770515, 41.297909),
("丹东市", 124.383041, 40.124294),
("锦州市", 121.135742, 41.11927),
("营口市", 122.235153, 40.667431),
("阜新市", 121.648964, 42.011795),
("辽阳市", 123.181519, 41.269402),
("盘锦市", 122.069572, 41.124485),
("铁岭市", 123.844276, 42.290585),
("朝阳市", 120.45118, 41.576759),
("葫芦岛市", 120.856392, 40.755573),
("长春市", 125.324501, 43.886841),
("吉林市", 126.553017, 43.843578),
("四平市", 124.370789, 43.170345),
("辽源市", 125.145348, 42.902691),
("通化市", 125.936501, 41.721176),
("白山市", 126.427841, 41.942505),
("松原市", 124.823608, 45.118244),
("白城市", 122.84111, 45.619026),
("延边朝鲜族自治州", 129.513229, 42.904823),
("哈尔滨市", 126.642464, 45.756966),
("齐齐哈尔市", 123.957916, 47.342079),
("鸡西市", 130.975967, 45.300045),
("鹤岗市", 130.277481, 47.332085),
("双鸭山市", 131.157303, 46.64344),
("大庆市", 125.112717, 46.590733),
("伊春市", 128.899399, 47.724773),
("佳木斯市", 130.361633, 46.809605),
("七台河市", 131.015579, 45.771267),
("牡丹江市", 129.618607, 44.582962),
("黑河市", 127.499023, 50.249584),
("绥化市", 126.992928, 46.637394),
("大兴安岭地区", 124.711525, 52.335262),
("上海市", 121.472641, 31.231707),
("南京市", 118.76741, 32.041546),
("无锡市", 120.301666, 31.57473),
("徐州市", 117.184814, 34.261791),
("常州市", 119.946976, 31.772753),
("苏州市", 120.619583, 31.299379),
("南通市", 120.864609, 32.016212),
("连云港市", 119.178818, 34.600018),
("淮安市", 119.021263, 33.597507),
("盐城市", 120.139999, 33.377632),
("扬州市", 119.421005, 32.393158),
("镇江市", 119.452751, 32.204403),
("泰州市", 119.915176, 32.484882),
("宿迁市", 118.275162, 33.963009),
("杭州市", 120.15358, 30.287458),
("宁波市", 121.549789, 29.868387),
("温州市", 120.672112, 28.000574),
("嘉兴市", 120.750862, 30.762653),
("湖州市", 120.102402, 30.867199),
("绍兴市", 120.582115, 29.997116),
("金华市", 119.649506, 29.089523),
("衢州市", 118.872627, 28.941708),
("舟山市", 122.106865, 30.016027),
("台州市", 121.428596, 28.661379),
("丽水市", 119.921783, 28.451994),
("合肥市", 117.283043, 31.861191),
("芜湖市", 118.37645, 31.326319),
("蚌埠市", 117.363228, 32.939667),
("淮南市", 117.018326, 32.647575),
("马鞍山市", 118.507904, 31.689362),
("淮北市", 116.794662, 33.971706),
("铜陵市", 117.816574, 30.929935),
("安庆市", 117.043549, 30.508829),
("黄山市", 118.317322, 29.709238),
("滁州市", 118.316261, 32.303627),
("阜阳市", 115.819733, 32.896969),
("宿州市", 116.984085, 33.633892),
("六安市", 116.507675, 31.75289),
("亳州市", 115.782936, 33.869339),
("池州市", 117.489159, 30.656036),
("宣城市", 118.757996, 30.945667),
("福州市", 119.306236, 26.075302),
("厦门市", 118.110222, 24.490475),
("莆田市", 119.007561, 25.431011),
("三明市", 117.635002, 26.265444),
("泉州市", 118.589424, 24.908854),
("漳州市", 117.661804, 24.510897),
("南平市", 118.178459, 26.635628),
("龙岩市", 117.029778, 25.091602),
("宁德市", 119.527084, 26.659241),
("南昌市", 115.892151, 28.676493),
("景德镇市", 117.214661, 29.292561),
("萍乡市", 113.852188, 27.622946),
("九江市", 115.992813, 29.712034),
("新余市", 114.930832, 27.810835),
("鹰潭市", 117.033836, 28.238638),
("赣州市", 114.940277, 25.850969),
("吉安市", 114.986374, 27.111698),
("宜春市", 114.391136, 27.8043),
("抚州市", 116.358353, 27.98385),
("上饶市", 117.971184, 28.44442),
("济南市", 117.000923, 36.675808),
("青岛市", 120.355171, 36.082981),
("淄博市", 118.047646, 36.814938),
("枣庄市", 117.557961, 34.856422),
("东营市", 118.664711, 37.434563),
("烟台市", 121.39138, 37.539295),
("潍坊市", 119.107079, 36.709251),
("济宁市", 116.587242, 35.415394),
("泰安市", 117.129066, 36.194969),
("威海市", 122.116394, 37.509689),
("日照市", 119.461205, 35.428589),
("莱芜市", 117.677734, 36.214397),
("临沂市", 118.326447, 35.065281),
("德州市", 116.307426, 37.453968),
("聊城市", 115.98037, 36.456013),
("滨州市", 118.016975, 37.383541),
("菏泽市", 115.469383, 35.246532),
("郑州市", 113.665413, 34.757977),
("开封市", 114.341446, 34.79705),
("洛阳市", 112.434471, 34.66304),
("平顶山市", 113.307716, 33.735241),
("安阳市", 114.352486, 36.103443),
("鹤壁市", 114.295441, 35.748238),
("新乡市", 113.883987, 35.302616),
("焦作市", 113.238266, 35.23904),
("济源市", 112.59005, 35.090378),
("濮阳市", 115.041298, 35.768234),
("许昌市", 113.826065, 34.022957),
("漯河市", 114.026405, 33.575855),
("三门峡市", 111.194099, 34.777336),
("南阳市", 112.540916, 32.999081),
("商丘市", 115.650497, 34.437054),
("信阳市", 114.075027, 32.123276),
("周口市", 114.649651, 33.620358),
("驻马店市", 114.024734, 32.980167),
("武汉市", 114.298569, 30.584354),
("黄石市", 115.077049, 30.220074),
("十堰市", 110.787918, 32.646908),
("宜昌市", 111.29084, 30.702637),
("襄阳市", 112.14415, 32.042427),
("鄂州市", 114.890594, 30.396536),
("荆门市", 112.204254, 31.035419),
("孝感市", 113.926659, 30.926422),
("荆州市", 112.238129, 30.326857),
("黄冈市", 114.879364, 30.447712),
("咸宁市", 114.328964, 29.832798),
("随州市", 113.373772, 31.717497),
("恩施土家族苗族自治州", 109.486992, 30.283113),
("仙桃市", 113.453972, 30.364952),
("潜江市", 112.896866, 30.421215),
("天门市", 113.165863, 30.653061),
("神农架林区", 114.298569, 30.584354),
("长沙市", 112.982277, 28.19409),
("株洲市", 113.151733, 27.835806),
("湘潭市", 112.944054, 27.829729),
("衡阳市", 112.607697, 26.900358),
("邵阳市", 111.469231, 27.237843),
("岳阳市", 113.132858, 29.370291),
("常德市", 111.691345, 29.040224),
("张家界市", 110.479919, 29.127401),
("益阳市", 112.355042, 28.570066),
("郴州市", 113.032066, 25.793589),
("永州市", 111.608017, 26.434517),
("怀化市", 109.978241, 27.550081),
("娄底市", 112.008499, 27.728136),
("湘西土家族苗族自治州", 109.739738, 28.314297),
("广州市", 113.28064, 23.125177),
("韶关市", 113.591545, 24.801323),
("深圳市", 114.085945, 22.547001),
("珠海市", 113.553986, 22.224979),
("汕头市", 116.708466, 23.371019),
("佛山市", 113.122719, 23.028763),
("江门市", 113.09494, 22.590431),
("湛江市", 110.364975, 21.274899),
("茂名市", 110.919228, 21.659752),
("肇庆市", 112.472527, 23.051546),
("惠州市", 114.412598, 23.079405),
("梅州市", 116.117584, 24.299112),
("汕尾市", 115.364235, 22.774485),
("河源市", 114.6978, 23.746265),
("阳江市", 111.975105, 21.859222),
("清远市", 113.051224, 23.685022),
("东莞市", 113.746262, 23.046238),
("中山市", 113.382393, 22.521112),
("东沙群岛", 112.552948, 21.810463),
("潮州市", 116.632301, 23.661701),
("揭阳市", 116.355736, 23.543777),
("云浮市", 112.044441, 22.929802),
("南宁市", 108.320007, 22.82402),
("柳州市", 109.411705, 24.314617),
("桂林市", 110.299118, 25.274216),
("梧州市", 111.297607, 23.474804),
("北海市", 109.119255, 21.473343),
("防城港市", 108.345474, 21.614632),
("钦州市", 108.624176, 21.967127),
("贵港市", 109.602142, 23.093599),
("玉林市", 110.154396, 22.631359),
("百色市", 106.616287, 23.897741),
("贺州市", 111.552055, 24.414141),
("河池市", 108.062103, 24.695898),
("来宾市", 109.229774, 23.733767),
("崇左市", 107.353928, 22.404108),
("海口市", 110.331192, 20.031971),
("三亚市", 109.50827, 18.247871),
("三沙市", 112.348824, 16.831039),
("五指山市", 109.516663, 18.77692),
("琼海市", 110.466782, 19.246012),
("儋州市", 109.576782, 19.517487),
("文昌市", 110.753975, 19.612986),
("万宁市", 110.388794, 18.796215),
("东方市", 108.653786, 19.10198),
("定安县", 110.349236, 19.684965),
("屯昌县", 110.102776, 19.362917),
("澄迈县", 110.007149, 19.737095),
("临高县", 109.687698, 19.908293),
("白沙黎族自治县", 109.452606, 19.224585),
("昌江黎族自治县", 109.053352, 19.260967),
("乐东黎族自治县", 109.175446, 18.74758),
("陵水黎族自治县", 110.037216, 18.505007),
("保亭黎族苗族自治县", 109.702454, 18.636372),
("琼中黎族苗族自治县", 109.839996, 19.03557),
("重庆市", 106.504959, 29.533155),
("成都市", 104.065735, 30.659462),
("自贡市", 104.773445, 29.352764),
("攀枝花市", 101.716003, 26.580446),
("泸州市", 105.443352, 28.889137),
("德阳市", 104.398651, 31.127991),
("绵阳市", 104.741722, 31.46402),
("广元市", 105.829758, 32.433666),
("遂宁市", 105.571327, 30.513311),
("内江市", 105.066139, 29.58708),
("乐山市", 103.761261, 29.582024),
("南充市", 106.082977, 30.79528),
("眉山市", 103.831787, 30.048319),
("宜宾市", 104.630821, 28.760189),
("广安市", 106.633369, 30.456398),
("达州市", 107.502258, 31.209484),
("雅安市", 103.00103, 29.987722),
("巴中市", 106.75367, 31.858809),
("资阳市", 104.641914, 30.122211),
("阿坝藏族羌族自治州", 102.221375, 31.899792),
("甘孜藏族自治州", 101.963814, 30.050663),
("凉山彝族自治州", 102.258743, 27.886763),
("贵阳市", 106.713478, 26.578342),
("六盘水市", 104.846741, 26.584642),
("遵义市", 106.937263, 27.706627),
("安顺市", 105.93219, 26.245544),
("铜仁市", 109.191551, 27.718346),
("黔西南布依族苗族自治州", 104.897972, 25.08812),
("毕节市", 105.285011, 27.301693),
("黔东南苗族侗族自治州", 107.977486, 26.583351),
("黔南布依族苗族自治州", 107.517159, 26.258219),
("昆明市", 102.71225, 25.040609),
("曲靖市", 103.797852, 25.501556),
("玉溪市", 102.543907, 24.35046),
("保山市", 99.16713, 25.111801),
("昭通市", 103.717216, 27.337),
("丽江市", 100.233025, 26.872108),
("普洱市", 100.972343, 22.777321),
("临沧市", 100.086967, 23.886566),
("楚雄彝族自治州", 101.546043, 25.041988),
("红河哈尼族彝族自治州", 103.384186, 23.366776),
("文山壮族苗族自治州", 104.244011, 23.369511),
("西双版纳傣族自治州", 100.797943, 22.001724),
("大理白族自治州", 100.22567, 25.589449),
("德宏傣族景颇族自治州", 98.578362, 24.436693),
("怒江傈僳族自治州", 98.854301, 25.850948),
("迪庆藏族自治州", 99.706467, 27.826853),
("拉萨市", 91.13221, 29.66036),
("昌都地区", 97.178452, 31.136875),
("山南地区", 91.766525, 29.236023),
("日喀则地区", 88.885147, 29.267519),
("那曲地区", 92.060211, 31.476004),
("阿里地区", 80.105499, 32.503185),
("林芝地区", 94.36235, 29.654694),
("西安市", 108.948021, 34.263161),
("铜川市", 108.979607, 34.91658),
("宝鸡市", 107.144867, 34.369316),
("咸阳市", 108.705116, 34.333439),
("渭南市", 109.502884, 34.499382),
("延安市", 109.490807, 36.596539),
("汉中市", 107.028618, 33.077667),
("榆林市", 109.741196, 38.290161),
("安康市", 109.029274, 32.6903),
("商洛市", 109.939774, 33.86832),
("兰州市", 103.823555, 36.058041),
("嘉峪关市", 98.277306, 39.78653),
("金昌市", 102.187889, 38.514236),
("白银市", 104.173607, 36.545681),
("天水市", 105.724998, 34.578529),
("武威市", 102.634697, 37.929996),
("张掖市", 100.455475, 38.932896),
("平凉市", 106.684692, 35.542789),
("酒泉市", 98.510796, 39.744022),
("庆阳市", 107.638374, 35.734219),
("定西市", 104.626297, 35.579578),
("陇南市", 104.929382, 33.388599),
("临夏回族自治州", 103.212006, 35.599445),
("甘南藏族自治州", 102.911011, 34.986355),
("西宁市", 101.778915, 36.623177),
("海东市", 102.103271, 36.502914),
("海北藏族自治州", 100.901062, 36.959435),
("黄南藏族自治州", 102.019989, 35.517742),
("海南藏族自治州", 100.619545, 36.280354),
("果洛藏族自治州", 100.242142, 34.473598),
("玉树藏族自治州", 97.008522, 33.004047),
("海西蒙古族藏族自治州", 97.370789, 37.374664),
("银川市", 106.278175, 38.46637),
("石嘴山市", 106.376175, 39.013329),
("吴忠市", 106.199409, 37.986164),
("固原市", 106.28524, 36.004562),
("中卫市", 105.189568, 37.51495),
("乌鲁木齐市", 87.617729, 43.792816),
("克拉玛依市", 84.873947, 45.595886),
("吐鲁番地区", 89.184074, 42.947613),
("哈密地区", 93.513161, 42.833248),
("昌吉回族自治州", 87.304008, 44.014576),
("博尔塔拉蒙古自治州", 82.074776, 44.903259),
("巴音郭楞蒙古自治州", 86.15097, 41.768551),
("阿克苏地区", 80.265068, 41.170712),
("克孜勒苏柯尔克孜自治州", 76.172829, 39.713432),
("喀什地区", 75.989136, 39.467663),
("和田地区", 79.925331, 37.110687),
("伊犁哈萨克自治州", 81.317947, 43.92186),
("塔城地区", 82.985733, 46.7463),
("阿勒泰地区", 88.139633, 47.848392),
("石河子市", 86.041077, 44.305885),
("阿拉尔市", 81.285881, 40.541916),
("图木舒克市", 79.07798, 39.867317),
("五家渠市", 87.526886, 44.1674),
("台北市", 121.509064, 25.044333),
("高雄市", 121.509064, 25.044333),
("台南市", 121.509064, 25.044333),
("台中市", 121.509064, 25.044333),
("金门县", 121.509064, 25.044333),
("南投县", 121.509064, 25.044333),
("基隆市", 121.509064, 25.044333),
("新竹市", 121.509064, 25.044333),
("嘉义市", 121.509064, 25.044333),
("新北市", 121.509064, 25.044333),
("宜兰县", 121.509064, 25.044333),
("新竹县", 121.509064, 25.044333),
("桃园县", 121.509064, 25.044333),
("苗栗县", 121.509064, 25.044333),
("彰化县", 121.509064, 25.044333),
("嘉义县", 121.509064, 25.044333),
("云林县", 121.509064, 25.044333),
("屏东县", 121.509064, 25.044333),
("台东县", 121.509064, 25.044333),
("花莲县", 121.509064, 25.044333),
("澎湖县", 121.509064, 25.044333),
("连江县", 121.509064, 25.044333),
("香港岛", 114.173355, 22.320047),
("九龙", 114.173355, 22.320047),
("新界", 114.173355, 22.320047),
("澳门半岛", 113.549133, 22.198751),
("离岛", 113.549088, 22.198952)
]
def get_random_loc(maxdist=5, areaname=''):
location = None
if areaname:
results = [_ for _ in _locations if _[0].find(areaname) > -1]
if not results:
return
location = results[0]
else:
location = random.choice(_locations)
center_point = (location[2], location[1])
points = calc_circle(center_point[0], center_point[1], points_num=1, maxdist=maxdist)
rand_point = (points[0][0], points[0][1])
return rand_point
def main():
#
# center_point = (23.153452, 113.262816)
location = random.choice(_locations)
print('choice', location)
center_point = (location[2], location[1])
points = calc_circle(center_point[0], center_point[1], points_num=10, maxdist=5)
def view_map(center_point, points):
url = 'http://www.geomidpoint.com/random/viewmap.html'
a1 = [str(center_point[0])]
a2 = [str(center_point[1])]
for point in points:
a1.append(str(point[0]))
a2.append(str(point[1]))
return url + '?' + '|'.join(a1) + '&' + '|'.join(a2) + '&1'
for point in points:
print('point', point)
print('map view:', view_map(center_point, points))
print('random point', get_random_loc(areaname=location[0]))
if __name__ == '__main__':
main()