diff --git a/locations.xml b/locations.xml new file mode 100644 index 0000000..510b3a3 --- /dev/null +++ b/locations.xml @@ -0,0 +1,14 @@ + + + 12 + CHURCH VIEW BP + 51.14 + 0.2617 + + + 14 + CLARENDON BP + 51.6581 + 0.2511 + + \ No newline at end of file diff --git a/randomized_locations.xml b/randomized_locations.xml new file mode 100644 index 0000000..0e1fbe4 --- /dev/null +++ b/randomized_locations.xml @@ -0,0 +1 @@ +0SCQDJ61.8894-36.15631KKPUWSBFB-63.8727-51.28822XMOMMNICNWX62.4102-51.48723TCMHGN-31.057318.47464TCJRIHVXQ-68.423040.30855HRLSDC74.5613-35.25046BMNABDISQ78.1670146.26347EKLXVJMFDTPS-44.8901-142.62008DFLXFMI81.2665-121.37239CQOMBFYU39.1032166.557610TWBQGUNHBCT-22.7520-58.023611WFMAYGF9.4846-78.734712MDMMSMUX79.6152-26.432613UIXHY31.6791-51.478414VBEYPOLTAS-20.4246-169.533015LVWUOVHXW8.2424-138.475416LYBUFARM74.5366170.413717VDQXWKQCJYFY-20.469037.025318BCGLFTT-6.572663.145319NLTJDDUOIHHHF-12.3050-97.707420MPRPXBDLHIGSV7.4775154.015121PNTRU-25.6136-134.030722AEVSCPXNDU-1.9771-149.317023NFVIIXMWHDO66.6236116.733224TKVYTCLHP88.75116.702425XWIDQXVYFX-74.011743.190326BKVFCN-22.7818-13.701627OFDGATRWK41.6186-15.052328TTVTDPTWJX-40.7307-27.004429BBJWSOUJ-34.8438178.148730PGCNTJ-45.2770-63.732831SRESORPPRNU-88.0500162.796832LXCMFIENSKXWMT35.2762-93.988833ETNWHWEC-79.4008-58.215634OBPCD5.704261.952435BJWXPWDJBTI-0.9041-27.300236XLOIK43.480071.735537GYNORUXLGU-44.7413119.038638CGSQN77.6308-147.193439HDBIJXL38.8254-140.780740YXUKVIQNV75.940233.015541TWXSJD-20.361246.411642FPAODDO-66.145811.220743OTBOPIB-72.7104173.152644SXGAONOIHGG46.621227.437645FJNDGKTLDT26.4246132.724346PAYNPMETLL-73.9142-139.058047VVKMNTILEALP77.5958-16.908848BHUFOAMLXEYKO-45.219697.237849WWUJKYJFCUTSP32.0746-98.948250HQAPWSCYBIE-32.8364-51.709151IWVWIGVDVC-71.4030-178.522852DQQRS88.79444.602253ECPVW58.1971-12.008054INUNMQD52.3984112.736255BAQRYBWQIMUNV59.7301127.495756CRPSRTANM69.931125.823357KHRELJVTR70.7587-104.581758PFAFW-85.7765141.893459NUDIFPJK78.719631.687760SJMIA-78.6602146.943761BTMUO32.8035-149.450162TTVGT-53.7846-127.439763LNOPCUL20.748062.429564LILXXJJUMKDE-30.2623-137.848865LKSTTXSIHQ-17.247075.363866VVHLLXOETU34.4685114.571167BGYSKXIXHTIBJI-10.6161-144.620968WHXDTJVCBX12.550279.100469OOLNQJSMVK61.7868-81.919870PJVLW53.2117-116.867071SSCKNSJV-41.7716-123.606172YUISD89.6685103.187173XYTGTIBBXHYYT1.2303-13.488774EQABJKMMUWYA-52.7577-25.490775OAHIHGDQUSVJJ-17.9596-83.877376BTNMGD-26.3776-35.713477XTCJLY-80.5737-145.426378TTRKJGBEEJRBO77.8209-166.533479DAGJLOVWGQX0.365578.805880RAJJBBGDM-49.7828176.680381LSISAAXCHTKQ-33.6866-132.976782AIQMRJGBFKWKCH-58.7342-162.638483HGASJMCGKQXRT-25.4347-58.096184CRPNAHIWVY-32.5921-70.606785AHDITLOKMWG-33.5559-107.578686VKITUEFGNTPJJT70.6798-111.426687TQRPDPP-8.033636.359288CBGOYXLWMICIS0.3155-24.754089KRSDEM-51.5767-168.779190ITBCBIHPAI63.5483102.312791SHBGHS24.0749-77.875592UPPRWPM-72.0894159.212293JMIBUWOFWRIAL13.8970169.119494YRHYGEWEFR37.6016-6.057695BQYKKCLLYS-2.2668-93.134196MCYFUXKRADGJ-7.2261-30.615797LNJYCB40.9726150.702398NBJBXAOXVFLU-7.9942-81.261899YHLXKCVK-53.0478-124.1014100ADXHC19.9157-57.1892101WMSDWJPFPYECCU-79.988710.6547102PCOEOPBLO2.6945-177.6227103RUKFF69.6939171.4203104IPJFVHNRL-58.3801-34.9522105AFGGNUFFY88.3523100.2769106XIKSIL50.8664-19.8739107BPFUFVKCP37.315367.0105108KWQJQ-75.447367.1944109WHVYDQYIGSOOS-62.0308-26.4029110PQEFQEFLJOYXL82.5362-175.1211111AIDEHFBY-75.8127-160.4363112YLBFAM75.5323-82.6821113ANHPDUKCFNDYET-37.1843-162.2584114EUONTJRKFAQCO25.2190147.6916115LVEJPN47.5559-62.1698116HGQYURCT41.6100106.6883117MPOLHVYGJOJC17.3641128.5586118TMYUWAATUGOCC-78.3038-10.0760119LGQPMRVAKYJVP15.929326.1232120EBESPRLQQOOVK54.1705-83.0565121KLHMJRPCIXBJN72.5414138.5629122BNEREPR49.0390-18.6547123MQRAJHWCRDRVT47.9150122.2772124ANOFYHAAMK5.8674-60.9809125NEWTI-47.0525-13.6483126KTVGGBEIVDUFN-67.413915.1071127VPILIOKWTKQUC-6.655990.9171128BUXRGDE73.5200-33.2103129KNPFPKAQI-66.1945-129.7011130JOICVPTKHLTAYL37.2913-97.5762131XUYGFSYFOXFI42.6185-59.0904132FBDMJNUMVKR51.8721168.7848133EJKQSVINOL9.370421.4927134JEQAMQLSV-66.3110149.6636135NULRQYSFPOP23.0885-138.9251136OAAFBIML-45.567219.6762137OUMXRN28.4591-35.6426138JKGMF80.3929-67.4247139WBKCRODGEMDR-44.951798.1938140JXIIGMN8.9868-178.4934141BNDAGVLNMMT-74.853698.8768142LJHGEQCELCWQAB19.2434-139.7704143PKJSVDWDHQLBK-80.090253.5623144AUPVJCQYHIOQYF-46.654039.7994145NOFMYJNJ56.5836-122.3237146XLFGSTGA10.117997.7121147UYGHNCWL-5.905095.8632148JRKPNHCJHV-27.5685-101.6895149PQGBMQGWAALFP-50.523690.5777150GIPARBKA35.4864132.8519151NJIJYAETII11.6579-86.3913152NFFHCCBELOE5.5367118.7703153XFEERFSPARNRVV13.0165165.9115154DRRIRUX0.9805146.1100155LUNNVOLOLMGGP-38.249156.6473156OGBFMUSGRG-30.2978152.7796157CGODE69.412296.2450158QXXNPCVTXSULWF-67.212198.2155159UNFQIDRU43.1409110.4665160EXAOFVECDPIGGA-23.1935-77.5976161JWUXG80.0498-89.7199162KMBCB-57.8811-11.7514163NUYIQMWTLYQWE-5.5764-1.2270164VDWHLC7.5933100.5977165BANSGQ-27.0792-45.6957166WGSRQDM-37.081055.9256167LPKJHPLEIVPDXA-38.671342.5904168IKGUEGF65.5978-50.8411169YKEMVQENVX-32.5095-31.3591170ANMSAATURRJ30.2651-23.3822171COYDAD31.8743-20.9267172MQCCXNKT33.467152.0448173WJKEINMEGQMA-39.950865.5476174WXAXM-7.7393-142.9199175OWKEARSHE17.1981114.9170176LUDUITLPI-29.0297-0.5052177KKSBEXCEAV-24.0115-153.5054178KPNKWU6.3162-116.8709179LKYKQIUSYLF5.6604-143.0866180CVJQTGQ33.58877.7805181QUPRTQPMPLE8.2861-125.0743182OTNOMOJER-60.1049166.0463183NKFXIXY19.4839-35.8107184BUUGGYTMBTIJ36.4520136.3568185UGACKUGEXHVWP-62.0101123.1605186NGYRQLW-54.733310.2892187BTPJH69.0934-39.4831188AGXWXHBTAUXQ76.8850177.7732189OIUSVSDBBEHXC-64.0283-69.6226190CQSTHJOPGWURGP27.7302150.3521191VDASAP-2.5511-109.4102192CNGVRXJ11.6659149.0360193GMGQGADEJ7.9256-85.7723194KELBDGLXQ76.0692-161.1366195VVTAE-75.911880.1832196CCYCVYLULNSM-78.205355.9361197SRCDGK49.5207-40.8554198TAGYOIK-58.787196.0408199ASASF58.3342102.5367200MLFEE-6.6753-71.0949201SABNDKSLCLTXXD10.443589.7401202SLMEIIQECUAKK-5.0273-64.4090203LPNBDXSUU-16.502132.4432204KIHYS13.435431.2598205WXHGLAPCUE-22.29320.3281206BKBSTBJEY28.449475.0496207FKYJVABUMYMUL-44.7679-90.5208208PNJOQH78.1133102.8941209QMJNEBHDWGO-72.018457.2038210UPLIOPLVYWTAW36.8314-178.9313211LLDCAVMP-7.9818-12.7979212CWGPIK-73.9327-160.1303213BGAFHTTKA-56.379486.9926214KFUIKNRU41.7942109.3673215KIDSY-42.0034-116.0057216SWGLAWAEI23.612277.3595217QYUEJGWSWH-47.3561-31.2534218QUEKITOQUXLMKV-20.3481-90.0313219OVJJNUIXBV52.275777.7163220ESVOUWUKJEVWR64.5603-104.0958221SNFAPXRMFXWLG-48.3264-60.9911222TFQNXFXOTDNU76.6798-80.9719223OAAFPWQYECFI62.7213-150.7076224VTTIGMBRAO71.776948.8935225OYOWSEAG-85.883795.8313226ASCNTB-5.2151143.8472227QYGXWCLNDRUBN-85.983121.7760228DLKEJWK-32.5025110.6392229DPSGUXBFF20.6593143.5322230EASVMVORVKFH-6.3158102.4563231RANWOQJHDB42.19982.4197232LBJNCDIET56.0104176.9445233MIOQOJROHNVSGY57.0375175.3968234FSESAMUUVWEYLU-39.5367-161.2213235VCHQHLHPDE35.3334160.7269236EJNLTDUFT-77.6038-123.3854237KBBHBF-76.9073163.0630238TPLCMYRJTUFIFX42.0947-29.9270239QWJUVXVIKGJTF55.9728-163.3360240FUFBUXJL-71.2767-75.2734241GALIJHLM45.756348.7143242KOHXIQNQHS84.912298.8106243AYEQEQDXGPC-62.186226.4273244FBSAMJDGX-47.232142.6494245IACYHKFUE-1.412416.2153246KJVGRPNPRHFDQD76.2855136.8325247BFKUYVLSEBX-40.8392-167.0837248DIDSINCIVELJXT-15.7613-81.0275249ONBQMLRKXQQEG1.821586.8258250SEEOWDGIPYFS-86.287428.0893251IBLVAHFUKEB38.1788-73.2272252CBAMTJJO70.171482.9577253VTHATJKCT-19.643798.7720254FMRFSQQH-47.6544-156.5926255EJKMMXOPKDSX89.4336-20.4265256HIQKVCKENHA-53.6655-36.4467257CSFIEMEPBGJOJP11.6493175.1754258YEJCCGUXTXV-88.9844-33.4529259HNSELBADL83.5275-91.6027260AIXCSJPOAYRJJ45.3781-177.6117261DIPTFXTFGFFPFO34.6763-93.1706262VRVTFLEYBFKC-24.0473-86.6073263UQGMLJTJHBF51.568079.9489264TQKXYFC-34.9454-89.7849265ALKDTXLFVMMTL-6.099525.8888266UIFQRRGFCAC47.391034.2794267LWBFGRMMQ-0.832998.1008268YRVTMHQL64.7911-126.7741269EHRNYIKGPKTO-1.9261-107.9271270UVVLLQGY-4.7620-95.8630271RGBWHUJMT23.7535127.1008272MKUPKCFVBKTC-81.1590-177.3869273OXKBSBGIIMSRCN46.4506136.8507274WEONKL-5.200969.3119275JYVTXN-72.277571.9729276QXDIGI21.2702-57.2844277JFGRBTMSRFOJJA-9.89265.9828278CMIJAWGV5.2789163.3933279OOTBXCLPM32.728712.0710280UMAQWUFPPLXLDO17.132961.1389281EDEKGDHGA86.9332-138.4354282VTVUQY-73.7080-87.1280283YXBYXYFNUJPG-39.7192179.2927284AWULCGTBI-83.9210-26.0260285JOYUBGLRJFQYEM-89.1088159.2591286FUMUOSPC-28.741438.2791287LQQGS47.6205150.6299288HQHTTUACU-3.225716.4191289SGNRYR45.2940101.5718290NWDJNRHQLXC-11.212190.5677291ISUHCHVE-61.1919-52.9970292PXSOFEQ60.1387-41.2316293CTJGCK38.463366.3406294TSQGB-20.2822-74.3722295JVOEDKUQQSKYC87.7921121.7806296APWRO-65.7851-49.8561297RCOCTNKTK32.6171-78.0694298NTGLHXFPYI-12.612358.8462299EUABICWCN53.8793-44.0953300BIKAOFWIGIPRRY-56.9177134.9195301FAIFORWFBLWQ-67.854389.1866302CAJLHYVXCDVPL-72.5691-75.0436303HVXPVDDTR-37.2723-123.7758304ECDLSRS44.9285147.0006305WKLWWCOTR56.4038-12.8657306KOFGVOFSSK83.4616157.1383307JFVPYIG-70.057418.3842308XJLJVFQ-70.351999.7057309DDSCLGJGIEEQR-75.4433178.5480310SESXYLCSCDUMU-12.456285.1419311RBMDFEXSGRPV-4.261550.7056312TUVXCMKEAKI63.685856.0058313NEEWKDACDBNBQ-78.366810.4908314XGHOP-30.1335127.3884315PCETQJ53.2428-149.5340316TMUQXMX-61.3700-101.7661317JFYMKWLCSCQP87.9867-79.2989318IVKYSXMOTYMSI13.0800-161.5258319EPWMFGRWKJ-85.2186139.9322320ORMKNGXR-43.8715112.5177321NKQSDONCBQ26.5471-162.0785322SNFJFSYBSY-13.6462-60.8333323QBVHWMPRMJ-74.5727-48.4340324YDGVJYTRAER-80.7270-74.4425325EKHKTABTB-76.129444.9196326DJHHYF-31.5227-78.3976327OCGNNYVM16.006213.3976328KQVMJIAFCYTFK-2.4891-36.6599329FHALAPTCOLEGG-77.5811-45.0183330RSCJLUCM20.220820.7473331LYNJPTLHWNTBQ-58.4382-2.2016332YLDEMIOJBHR-41.1446-6.2109333KENEY3.4287-84.2154334JPVHMBGOBQXTEC-21.892319.7191335MATKN23.8940146.4884336EAHSCYFDMVL70.6986114.6183337AFHWI55.442471.3277338BCUGWJF-15.2612169.4270339QGNSIWCONQWQBY-82.713885.4721340UJITEOIEYUBAQ79.6762-113.4263341YKKSKSYVLNGD-53.3036178.4465342ONEQUVXHFY-83.711950.7635343WIODGOHX25.524730.1627344FASMGXBILQSTV-58.3257173.3405345AFKBQ-51.3162-179.4980346DGUMQFE18.5527-29.1663347IJYMYERY47.540990.5710348DACKP72.951420.8340349CNMUCG48.666264.6178350IKRLNU-80.5270-81.3679351MMDFEJ51.4000-105.2593352SDPELY-17.917832.2564353IXYNOOLR61.893365.6016354CJMBHUONLLU-72.7930-77.1009355NEHFFSMNBFVR-57.3920-166.1125356RUEJLRDGKOMYR33.7487110.7956357DCOFS51.860324.5972358LRXIQKNF-3.4669-2.9196359WAAJEHLLDI-84.398281.0622360SOVYKUMWKAWMKG-12.391664.6261361IAVGJFXAXC48.1498-37.1813362WFAUMMUCFF-88.9181161.1803363MUQWL-23.4584110.8606364OUMLQLOTRNGW-13.1749-102.0312365RSXKQNSHESR-36.48336.5230366QTNRM22.589791.0826367AKCEFJVXOJSXYG67.135355.8912368WCQNEURPUMEJ-28.920653.5029369CQBDSPDITO-66.485958.6758370PTKTW-18.6242130.7526371WRHRP-19.4885-37.8137372AETOLXQMGVA8.7548-45.5033373DAHLUKP-9.329870.5474374UXHJIOBHRASHUJ57.8223-113.6975375QJKQG-16.638416.5462376ECXHNHQPNXC34.1782-55.5126377TORJLWE-54.7595112.7149378PUAPTML-5.98679.0573379BWIFC-51.6322151.0404380IDSNWRDKHD-2.303661.6415381BUTSBPVBLFNSH14.4774-143.8672382FNULDL84.7466-14.5609383MLMEWFPAXM87.8369168.9467384OCEVTCRB62.047442.1690385XRLKNUYY31.5056-56.7329386IWXCXYUBJBAR22.489585.8866387QQRAJY-47.1167-86.8506388XRGHWAOMMUC75.821556.8315389SGJNAYDDJPQIFS-39.1564102.7421390WCVQICJPHY-80.7341160.0165391FTTDKKEWV80.010981.4290392SDMMOMSDXGXBR59.8212-167.2848393EDSFUPVGR-79.686492.6625394TKTQYPWF-53.23463.8781395YMEQKUL-66.50295.8720396KJCSFCR36.3270-44.3662397TENHDTCSCWCCU-87.7347-51.8223398JXYXS32.8494-174.2921399VCLUKOWREBPIN58.388214.6698400UXIJCMDDVS-85.244122.0641401RESEFSK-38.6139106.9083402RWNEYFFOIO-55.3727-11.6692403CELBW-87.5676107.6455404SCPSEXILGUUA-63.0420-30.1458405IHOHVJQRK-15.411891.1742406VHBSGBRMUAOTI4.493715.5338407HEWFIWESXPEN-4.9537143.6250408FJOJBVKNGDE-6.7038-154.0806409VMDYXVYF-24.6614-35.6705410ONSKCBPLL75.5846-76.7828411LBQKVTHYNK-72.2721-89.6699412RRBIXGMUDRGEU-86.0071152.0138413VDVWAR87.6821-111.5589414OSPDWSNMYEFW14.4755-132.1650415GSNTIVU40.075315.0445416YXPODNKPBBQR-6.0488156.7661417XJOWNGVYPRVSIK-67.1006-88.4274418JWNFQRNWB87.4577-104.0308419WMCUFRFQSLRFSX40.7874102.0666420NDIYATVTFFFTXQ65.5463131.0896421SVCLNPVQS3.27369.5869422EHIXU-75.1466-136.1170423AXQSXGUPOJC35.701337.0150424HFDUOIYGYOLB67.4264-74.0467425CTQRTBPNHAMO0.3772-113.7506426IMHIISW20.6671155.0984427FYDBXTJO-60.073933.5391428GBYLCBCQ71.5886-103.8798429CSUGONMCHMP-59.8397-22.3520430YJJRODERJPIGE-49.3994175.7557431JEWMVCTJHT-4.3615174.4669432YBXQTO7.8816167.6075433PSRLTDXRPPOETS48.2106-124.7564434CXXFMEWIHXGH54.0964-70.7402435XWLQSTTDTDQX-61.4011-11.9924436AYMBNOL-86.6866-159.6491437KITCWM-52.9793136.6785438VSENJ39.4711155.1627439XDQKVUCNVRRB19.679459.4453440OEYOSVD80.1360-151.4991441WLRUY-18.0762103.7637442BJGTVVGF-25.901235.4586443YVOEQW-33.1997-81.7509444BGXYETDLMOSBVW63.0860155.1824445FAOSFCT29.578181.9491446EQNKTQY-2.3008-68.1977447VLVLORVTTMD-58.06810.5831448SOOMPAWR15.6217169.3939449YJUMISSEUB-45.795241.8698450KCVHCIWYFIMRTN-47.086017.4985451CLOMPFHIACYDY-11.7949137.3268452HSFURMBKR-53.6125159.4046453EYSJLHYEVHIKF10.8156-118.5711454FWLCSOI2.5596-66.0474455IEKQQ31.1774-28.0243456FGDNCOUOHNRE54.3111-24.6926457RSYBOH36.56801.5340458QFQKCICMSAYFDY28.105157.4597459ENUOORJJYX42.4122-12.1315460LQBGIUJRN-76.88827.2864461RJIRQKPYE22.4313-92.0495462PXQNBBPXXS21.667128.5242463AWHLHCERK70.4172104.3307464VQFIMMYNOYB49.5043-12.6252465TITGKS-32.303744.0982466JUIHLQYCGJY24.9940112.3472467QQPCVBHMORSAY43.1424136.3866468EEGCTRJ-82.1385152.6326469KYVIVRCCKF-36.4950126.2308470XHVUNU28.4340-98.0771471UMPMJOK-47.279887.9212472VRDOBCUSTOHODL-83.0500-179.5593473JCUBKOHTQQKTS-83.0838-79.7670474VVRTQFSPTSJA-18.9883-38.7446475MQSCTJ0.5506-1.4548476GGBTSIWMYLLS-79.5549170.3270477CVDJJ-56.0613-121.8786478EESIDY1.0297116.9323479BBUHSWD-64.553215.4282480FAXURD-67.8617-141.1167481FTYDAFDTCJ10.7872-12.6612482JSTSCPTNCT81.0912-73.9397483HKVVTP68.8465-74.3544484HINBFYWXR51.587276.3221485AXDYBGQYFWEASS8.010962.4078486FPDLYWKQJ53.262363.8180487XMBYMNHNDPT20.2235107.3679488AUEUV-58.2749-98.9297489LQWWNYHFFA-2.1906-128.9709490ANTWR-77.4052-130.9706491TOWGAMNW-44.0907145.3146492PMYOMME-16.7771137.3985493TIUNNCGIAFBGHR-84.393261.1719494JHLACIKLP-63.7881-140.5211495ENBOSLIE-78.5718-160.8058496XDIGBSEWJUQNH89.344057.8917497HXEHIAMFVCSOQX-55.801642.1969498IOQQOXOCV7.382060.1613499EGTFYW-61.1800-28.1527500IGTVNSDTKBM-47.956065.3626501TYECUQLLF76.1557156.8860502FADDF-29.7284-54.0727503GRTFHQQHUH-78.364098.7678504JWURDIIXYRCHCD-17.356525.8317505RJSSOCFQYSD70.1897-94.6633506UDIGS-80.508134.0356507RTYANM57.6014171.4674508OEBQRAM-38.3148140.0569509VWEDUIDNUYW-58.1930-76.6879510OTIOH-48.9467-7.8921511SRUJTSAOMJSJF53.3331176.0855512PATFLHUUUNUBCB34.9890-82.7337513GGKDIJD75.633234.8685514PNIKDPRIQGUXLG-39.2084137.9349515GYOAHTTSDQCRKS31.3253132.9440516NHSDUSWKOC3.8621-53.4729517NDHAOR-57.5490-120.7303518CHPYW27.5055178.0199519UVXWAHDQ63.3718-72.8974520GVVEOIHLAXPIT-11.1865157.8646521VDKTBTJBXWYMF-37.1563-150.9796522UXBEIILNDGUDKB67.9121-14.2738523WNLAXTP-20.549583.9578524XNWUTCEA-78.295250.8385525QLVOPTRE64.4385-142.3637526QQYTULJB87.286464.2547527GNASEYJYPFN-45.7599102.5587528EWUUEMLV-43.568941.9640529VPPUY29.9802-175.6416530GYFIV78.1760105.1655531UMDNWMT-22.1648-163.4442532EQBODFUTSG-34.948787.1167533AGRLEXFHB29.2725112.5155534AINFLNJW47.5829-55.0995535DVBQQGTYDPMRUB0.7567126.9131536TUVSQGJFN-63.6058136.0497537MDMYGYRJEUFA32.0784-152.0288538VALRCX-34.9195-174.9648539PXAEKRBWOLF72.1868-155.2051540DONBLEMUFR-14.798597.4920541LOLTWCCOHHQOLW26.121068.1492542TKCNAXJ-3.4240-31.3848543IDRYVEIOU59.2615111.1065544IJCWDGFIXLQ-66.49604.2047545XROQSWPTLVCSL-5.4513-7.4869546SFHBUNAGDO37.9519-107.4571547JEIAWIRAN57.6829142.2459548MFSLDERM72.3603-87.8868549UUUSLQPVR58.0284-168.9190550ORDHOMRSXKXXKT-6.4607-148.7791551YRCBWAPAE-55.9594169.9813552SYMHNWWOMD-69.620755.3501553ELNLG80.4329-11.2582554PWUBGOSLQPQWON-3.0457-27.6888555QJEKAEP-31.423921.9709556WXOBTNS72.6944171.1772557MSXXRL4.1681-41.4636558WAGXGKCNBCJGFI-17.0619-95.1222559LWJKDUDBIM58.0831-141.3868560EALYGQDLH-37.2390-62.8022561UIFTQKAXWPOIVW87.0673104.2044562AWJPF66.5816170.7539563FHOYHMLC-71.326358.7525564KPEFPKKTCIMVDA56.9248-39.6876565PNWCULUKKLQI-87.141684.5753566MLHTNCIWVHD60.941716.8507567TQRBXKESATCATL-8.4067-9.6978568LGSPFF-20.7320-100.4784569ACWOQ88.993298.9944570QRBQLIBXWGH71.2851-147.5151571TSTFVVF73.0473-153.7503572SLHIXOOJQ61.562996.7885573SGDDXSNMTRPGN74.6632167.7996574BJEENBTDJT-43.6729-32.2687575CFENFGYYNBCGE18.9099-143.0202576BUBPM-86.0839-172.0917577MQDAXA-59.8164-64.5377578RFCGC67.102420.8135579KTEBRPKLY76.3370-41.7528580SNUCOCE-19.090968.9253581FBVBSDYLFSMH-55.9605-22.5032582TYPVUMVDU-64.4096-26.5662583FQLEMVFB-5.5100-140.3656584FOVAJX81.042845.9348585THQHM52.5190146.2639586MRULQCFWGHPW-12.725915.2831587SOCFMJXAPH74.617198.2118588LNYOSUKKV-47.8779-151.1835589BOHAIRUY-48.95097.2040590NGHYP35.1207110.8000591STRYDWEWO-48.460015.9077592RTVKYVCCYR-70.1907-46.6661593GXNJGV18.3565111.1131594STGVIESEFY89.7467-155.1119595RRRQNANEISI-5.7090-12.1572596THWQMK67.7531-125.3283597DVPVRJOXI-17.9442126.1390598EOSBMK39.851641.0091599JCXYSISDYSVQFU-32.6454-42.4857600VWPAMWUXK50.590281.3889601VWTPFCUV81.3682-38.7186602UMKOF17.8318-54.9054603LTMAHUMCFD-55.001439.2893604TEVEJG22.3876-64.4917605CQGNOPWKPAKT51.7380-177.2476606UQOHHSYHYH43.4930-160.5057607JHXJISJDDSH28.671618.8405608NQHRCYLDESS48.3535-106.1797609KDKUKXWRGLO-44.2693-93.6456610FNVONYSOVICCQ72.3187-53.6573611CIKDDXUN-76.5498-167.9971612LPDHYHI65.16241.1757613HQFMAHSHB18.2209-46.9082614HDQCARYIUUAHK-86.0032140.3193615CUCIRNBVUC19.9165-4.2084616KKRMGYGVKQITHY12.8463154.0639617CAACIUHSHD-88.6382-157.8564618DHNPUKCDHWP67.176265.4426619MXNAD87.506841.6643620QPWLACPWKWGOKV54.4295-78.7067621GVLFINCYHBFSGB-50.4337-178.2173622QJYHMY-24.191861.0366623CWHFJJTVLPFF-55.3445113.5667624UBGOFOOLELSD-80.7512-19.2356625MGLHRNSVUUHGAY-46.0967179.2092626ANXGHYNDK-3.1440-122.7753627DAYJDRFNGCY-39.3937-153.6960628QIFQLPFQ-21.6637-77.7563629YLIULFHRNM-64.6968-94.5659630LXWDCJPPI20.6752-48.0955631GVHBNTDYJDJXHL-32.007159.4885632MHMMONJ-81.3468-138.7471633HMAFVNMAS5.724991.2372634KQVCH63.4089-147.2895635WJMCLQSPP36.512070.0967636BDSVQCSIQ56.748311.9657637INFEIRAFXEWEX19.4460-174.1144638BGPVOHE80.882956.9515639ANQSDBCHKEUWW70.287152.1638640JCBXHFVIEJ69.146339.9859641OACQSO-3.4721-106.1419642RXHMAXFCT53.379634.9109643OBUIIAGL-6.7955-159.2272644WHEBRWHU-78.8628-133.7630645KKLKPAKG-48.667927.2369646AQRNSB5.461872.0058647KHFVLHMKNRI-62.9404-47.6863648DBLHKHADXCU39.0575171.4852649RDJUXQG-0.0474-46.9307650DBKQC-10.2102-141.5845651RMXJJAL-56.1147-129.4649652HHEGDWTQ-8.7441-139.9457653ITIMMWLSNAGWFL4.767091.0860654JNFLH56.6254149.8393655QCABUMJCIQDU30.5280-71.5826656RYXXIDMS-44.256288.2793657WHLORGIKYTQAU-64.3820-80.8191658GMXGQV-69.364274.4769659YFVHUUOK39.1836-147.2212660KGLCDKMJ-17.3635114.4715661PQQLC75.7126119.9782662EJUGJGJNE72.4453-125.4908663EUEVEFXPPX-14.9651-80.5928664SYIWOMDEIF15.9642-103.8166665LJJXJXUUWIG11.8315-131.7086666UOBXOYGVGCYV27.9501-73.9858667JLSDPW40.4415-13.1869668RETJNL48.446440.8905669BTYAQXQSG-28.2459-109.7948670XXSNKPD-56.1365136.4657671EFMMEVQTNTTO59.5536-6.8838672TDDWWSBBL71.9613113.1312673IYHYOEENDVK8.5049-37.9428674GVTIDGTHGTSLW-71.7204-5.1558675EQUTUJD-11.4156178.5189676QAGSEGNIT-5.0781-9.7241677PJSNADTIYSOJR37.7699-46.9492678FNRTSQIKRTUU54.4690-154.3991679VVNSHQLM53.720465.9689680OMOEMMJQNRGNBU44.792180.1460681UCGTE-61.4759121.4337682QPYKRMFXM54.2464-147.9432683RPTTWVUO43.7332-99.5051684UDHQYQMP3.5408-117.5502685XSVOIVOERFMQTX-82.0375-165.1417686DCCIQNRMBBAGM63.4444-162.8221687SKKWQAEEVEM-35.17331.4770688CWEGYIS-10.5660-111.1957689LBNLQTHXFTCB-82.8923-12.3853690BUVGEEAYYBRHX16.153226.6928691LKQXIDDVX27.1274-102.4344692IXXQFNVISFLP52.9421-46.9575693ECGOHOOCHXDEW-59.683737.6105694KWXWCK24.4669-102.1525695SWNHPSABBIF-44.3370-105.4520696HVVHV-69.8465-98.0513697KRXMKM-72.6403-19.2949698NKGDSJT-3.8685140.3243699KLMJU-88.7203-130.1150700EWXNE-77.5908129.3139701QWEUYNJGDFHAA65.5015-32.3888702MTVVFSXJC-47.8666-53.6563703FALUJCMKEXY-34.9870117.0394704CBJMEL-72.3819-143.2851705SADJDXJN-52.440433.8938706UGDIAGGXEWW-85.0393-74.3179707CBNPYXBQEGOVGG-55.1933-157.8701708HARXTLYJJVPK-23.1289-11.7437709FVQNKEQ3.2531-94.3439710SBCLARD-24.781925.5163711UJBLMTWFOHX-78.7505-44.3229712TYUGILQMLAB-71.3321-8.9286713OKEUCWHKXKE4.0295176.8388714MLOPSCEJTXUD76.982967.6188715RJCFIHNTQMPA-37.0441-137.9081716YLKAQQKLJKU-28.7667132.0667717WNNUEPOTWTDPP-58.1867-29.2348718CUMVMFSFRGPP-89.4030-11.2802719ODISSFSVLIHWA-67.5127171.4113720STJOFPXUXPXSM-17.5668-162.6417721EHVKCDXH-15.7284-102.4594722OVVPLEV38.4106150.4999723KPIKIEHI-76.1472-75.7183724UPCPBOS33.2496-0.2049725KVOBYATKYSY-76.967582.2267726XMJTON44.0660148.9732727LPMNPCQKAEX69.881199.6248728LODPWFQBVX-7.851834.7150729WBJMWWRVQTW-64.0114-157.4365730FAQBFFDHXAOVWV-53.7780126.0038731NJKKPLPSTE-5.020979.6728732YEPHM-57.3099-124.5063733ESTHQXK54.3936-30.2752734TLHQCUQD2.7558-21.1230735MYETRE54.4777-32.3247736ONSOMJT-72.594230.5923737OLIWAIQB41.6005103.1813738MACKPBRKHQ-24.689515.5470739TWXEDJKXRU-88.2418131.6223740YVDCCNNCRC-19.0127-174.9251741KRLRYY60.8506-85.4672742HRQVSFNBDMDHAO-34.0863-47.8970743RFFNNDO-69.4145169.1123744UNYTROJQXXHS30.9315-66.6669745XBCKCMSYYGIDQ-13.2989-19.5820746ETTIYSFH-69.2815131.8441747APHTSGJUIL-56.090436.8144748DMQCMFCPS-81.3291124.5623749VJUIPJ22.8827-151.4312750QRBGYICFESHJVH-31.018479.2891751LFRKSIHYMVFI68.4496-54.2624752MKTXWPNMCNI42.2344-66.9778753OIITHABMYOX-66.570823.7047754CVFYDAPC-33.4270-155.6637755GARHVVVYHRDQY-29.2316100.1489756PJADTJPDUSCM-75.688290.9141757POJUALOXJPBK20.9343-165.5408758HSHVNQ-88.762065.9620759NUXTEFJDOPABNT11.6285-77.4350760OMPXLBPJUUHCOX-24.254139.1561761GDAJTGADOUTN72.6520-54.2123762QYTEFAIYUQHS0.2363-89.4431763CVSCDLDK-34.8732-102.2799764SVYSVUE5.507313.1259765SJDPKCCWYNPU-77.4219-129.7448766WSPPDTNDJAEV-17.7609-85.7964767AQYHMCKJWGT60.6031152.3393768ESXFKRNRPTMP27.5646-91.4675769JVVJXFVOXGD-4.678412.0778770YMRVRFTNC58.098413.1165771ORIAT-35.0516-117.6981772TITDSVEPMU82.4686-59.9248773SROFYHCDVY-3.712682.0084774ODJWKSH83.5794104.0751775VSRDRH-30.4166-91.8867776LDNWCFTJMMDW-51.6687150.9926777KBXVIJGIKW14.059946.1927778HALSKULHV32.9380-91.2720779IGYNQEGSWG-71.0103-1.2990780BBHWA-10.8037-92.4674781SNAJRHWTANMBQ-25.7370-20.7823782CIQNFDAHS-41.766669.0769783YGHOBEE-38.4546-148.6203784XAJUVQD-33.462279.4905785BKSOSKRVDUCM11.5397124.3548786XRYXVRMIXM-84.0101108.1204787FAFKYHEPK-8.2008114.8115788FPOILXQ67.340767.1902789BJECMM-1.1476-164.0794790DBYVLTYCYS-16.8710-105.8997791GTUCFEVAUE-77.3794-158.8671792TDBKEOR78.0197-49.1744793WXAOPMTW-80.8343145.7020794TUNBWAV57.737510.3893795QSXEPVMJPKOR-56.420186.1301796URDOBQVXI80.0333-45.8375797GFUSFIYXOAM-27.5543-155.6874798DTVOMRBVX13.8385120.5571799EBVXFNAOADG-42.0579113.5014800FAMRUWTSPM79.4914135.8514801UQMFF52.9760166.6951802OYJJOSJVHOQNYD37.1458-87.0566803WPCDOWEFH49.4661146.2487804GANHIMWGXDPMD76.5172158.4860805AQOCWOUIXWY21.5154-37.6848806UGFUNYMCVOQ6.089078.0232807MJSRUPNH-34.3214148.4663808SPHQBGKWHXGS-8.9573-42.2454809SAYAXQ53.1878174.7638810WPQTRF-44.1086-151.4714811QMBCSGDXVIWOE-43.7241-34.7511812XOUHANX-25.6035-68.1931813JCCNT34.889032.9062814KOELFFFLYBKCV-37.9985-31.8814815HVCKAE-61.0301-56.1414816MNOXKNWOWPUK-53.9006-171.1924817EUQSVTQRCOFMAJ60.9193-151.8223818YHMJXRIUHRAY-55.7081-29.4657819XXFILRPTBMUH37.3709151.1220820HEUNMP50.0937-83.4556821YRVHIO86.0268-35.5182822DBDHHKMIVFRQN18.179435.3215823SLFCFAHKQPGF-23.1479-17.9157824STJXDPWLA62.1259-49.1036825UDAUELTI-75.647924.1896826USETVUNQJON-66.3413-31.9608827LQNVMUCREHDYDI-25.4383-5.4165828MRDEBWJ17.2093-46.8740829XFINPSLOCEI65.3008-134.0170830LCFCVJUENXXGS-15.536021.5943831GLMSUPFXTVJNCJ-73.628437.7987832SMKEENLLSNS70.092958.4483833MNMJRDMBNTU28.0105144.0604834WVKEHJKXXNCA70.862492.1837835FRTYRJ-36.6833-121.2285836MOAPFSDNNWKD-43.1903160.4615837JITTUHL40.8384-67.4545838BSHGGXF16.8426166.0135839DGXANI-25.261668.8132840NMSUGPPYGMI61.2037-7.3811841JHHCPGXEHMXDI-35.0529-120.5766842WDVFFICGYKA72.0086102.9718843GXNIJMTJQYGVXC-17.061894.0816844CCYKLMR53.2349124.7563845GVJVBDDMU-73.2195-158.3742846CXEEDMPOCEUNYU-7.056010.9905847SSGSGH-9.1325-136.3791848EURHAICO-72.8593108.9427849VPBTG-5.7273-25.6325850BPKRXBVUM61.0426-98.7177851MONTEWE81.1271-36.1928852YRVNIDAQV2.7620158.6590853PEUKHGSPKN-37.4631-7.1022854LLRAPQDXOAUB-12.9643-151.5328855DQSGBXQFYTUX74.3141-170.4962856AVPQBR65.054985.2821857MDOLWXXVRFI-17.9378119.0146858KJKBVLY-1.0684-62.8379859CKRBLKTPCYSYD-66.6284165.5255860HGSUOPGA-2.070089.5995861YMHODS23.7228-133.2791862ODDYARNACVPIN-13.2615-121.0704863PTXVMA-30.9466-12.5315864ANTLGKEAJAA48.4550-15.8579865XJAVDL62.4186-74.4162866MWKKSKJCTOC-34.3066-34.1658867KPEWBYWDCADEP79.2002-136.9241868DRXTMSXXCPL73.560065.0827869AOQSJOHTQUGFE-54.042424.1360870NXCEKBVUO79.6916-118.7601871PMJQP-56.172374.2529872XNNRMDLJIPUI-45.4878159.3774873XOVRWTVNHW4.467119.3103874AMWIDUSATETBT-41.9874-64.3870875OVTGTWPDIFN-11.935876.3260876EPVRJOITC68.9233-133.1262877UUILOXYNJARJNA13.0819-128.6594878NOOVHDKAMM-71.1508175.4478879BTPVOHOYGAB42.6802-60.8420880XNGVN2.4018131.1341881KPFAJONXPIFMV3.7526-174.7321882QLXHA51.022699.5730883URAHFWQXFW14.8145116.7325884EULVQQYCRIB-67.6706-76.3197885SUSMDNTLS15.5225-111.3837886FHJNH-55.7282102.0444887CNKCHRMEWGOYLN-74.6914-86.8407888KVAOCGFS-4.2691100.1039889TDBSBRSSGMSCA64.6555-36.2959890QRBIGSSJKXA-6.5072160.5290891IWMTDS-8.763267.8062892UKLCLKHWQQMG46.0877-101.4326893MYVOQ16.702947.6854894QHDYLBUONC68.7454178.3464895SFVYM-8.6464-119.9061896NPYMBO-34.3825-8.9711897AWNNXYRTBTYLJQ71.592244.6659898QAIQHMP32.4191-140.8149899UKEXADFJJ-14.9589-7.8115900KHMYYREQVFN-51.6214165.1592901VTKJJMYJQ-47.7832151.6928902WSMWOWIILP-9.6967-48.2289903LRYTWWODF29.0615-159.1738904SNHQBMFEDJMDB49.85679.6980905MRJESYO64.678210.0673906UJOTNVLAEKAXDH-45.0887-168.5958907YKEKKHIKSF-12.5237-145.8756908OVKVFFLOYNLDO-87.5577141.7086909JTIVQFPNDNVO23.5289171.7267910MJNWUKEK-21.4447-31.0616911RKEYAEYXL-19.3466-39.6074912IGRTY42.0364-125.7958913JLKBQQNKOSU-89.303148.2087914AVDCNNTVDESYOM18.231099.1944915WCXHJWN1.717773.0849916LBTPYUFV49.801634.9700917MTQUSLMGYTC0.8179-175.3386918XNYKGTDYDX-3.1366-26.9899919AANSPKF-20.90916.1218920NWVHCOE46.7621-9.1849921BQHFAJEW-18.7147110.3993922PJORFLC69.8263-90.6589923BWLRWQVYKXHFDJ26.71438.4347924YWGOVXMLHK-25.642636.5868925XFUQXI-74.3288170.3014926QQNNHRU11.495028.2262927OHMLTXUYPF82.5899-108.1161928MTXUDDSIMDEI46.553696.8113929UMOUGNIAXJA-53.680011.7244930LWEEMGTHHF-48.6489-29.7590931MEKHMUJGWOTE21.2242173.5481932BSOVDCBDKQII-8.2726-171.2884933HKNGONTMBDYSN29.3862108.9713934QRDPHUDWU37.2506-169.5754935IQGGU74.5937-144.3574936REGEQIVNE29.183842.8948937ODBDOFUUET7.490523.8776938XWWCRKOXQURVFE-49.6384-74.6888939QBIPSNQTJJG53.944362.2917940NJSDPEADLTAAK-78.4522148.4199941AAEJJINGKR-43.6466-161.4131942PTMSP-79.6810153.6645943FJLHIG69.5638-169.2355944FBMGIIAI65.1499-8.8222945YSCJFESCXER44.6143161.1520946HNODCU24.357212.7462947OJUEBBIVUDC66.299026.0430948AUNMQKYCDGG-28.9098-77.3470949YWXGBHPUL-8.6689-75.2493950FRXSOLTTWW16.030147.8618951KDQMBFRQJDCJD-23.3809-69.3811952EMPJRQ77.2602-92.6592953HRXBKGQV-57.169718.6982954IBYUAQEYEQAD-34.603456.0804955HXTHRDSIMLD74.9899-70.4879956TMQFFWMI47.8453-145.8979957JDDTEL42.5595-152.7507958GBYLR9.9487-61.0134959NAIVLSU56.5347112.1917960KMMNETUMDMNDK24.6711-108.8302961HFGTKXON-47.0107-175.5127962WKYPUYDGIQ84.3177-61.1709963YJKFCWRQXIBAG58.2367-50.6137964BBIAVAUGFCBMTN83.351619.6532965JMBYGHXNNXQAHK3.6050-80.8553966ELPGFUHBTQW82.62330.1910967JYOGFANVKBLHE-70.5808-112.7423968CSDFQGIC43.7609-77.7562969PKMYOIFFHCH-21.1727133.7644970JTYRW-13.54426.1549971GYKDP13.424061.0464972LAYUGGAGCNUK80.9193-81.4079973CJXJSTUTAQRC-77.1291130.5711974FCVDNCRA-32.477265.5218975BHWAYQ-53.3463106.0179976RWEJPRI65.8079-81.0305977WWVYYHV-55.6223-53.6181978IEEERYAD-84.9570-38.8719979GLQRGVSJMMDAF-34.838372.8480980BJNQRSMQWPIF85.1381-62.3057981SFCYFVBIXED-68.636176.2737982NKGUSFHOFECHO-82.5044-67.2223983BRQQDIJAXFA-61.4222-145.3796984RJKOIJQ-24.9329-163.9631985DIMNJRGH-86.2414-74.5231986AYYUMXVFN8.266061.9132987UXSDYNCTIAHYC-40.3308127.5482988TWWBILSJUY-74.1009-2.7435989YJUGGGQXDWN34.2806-94.6805990KMKMKXSEN43.705025.0209991KBUSAWMV-38.8700135.5028992EPMHKYJPJ-4.803851.3309993PAQOVSARR75.5774-88.2771994DLEJYCXWCE69.265031.2601995YPNYTSVPQT-71.8772113.5673996KYRVMV-85.280040.5971997YEQINU-11.2789114.4934998BOKYKEFHV-86.4026-49.8642999ABBQHTKJRSGNE-15.100129.5604 \ No newline at end of file diff --git a/src/main/java/cluster_manager/Cluster.java b/src/main/java/cluster_manager/Cluster.java new file mode 100644 index 0000000..c5ec775 --- /dev/null +++ b/src/main/java/cluster_manager/Cluster.java @@ -0,0 +1,45 @@ +package cluster_manager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Cluster { + private LatLng center; + private List items; + + Cluster(List locations) { + items = new ArrayList<>(locations); + findCenter(); + } + + public LatLng getCenter() { + return center; + } + + private void findCenter() { + double latitude = 0; + double longitude = 0; + + for (Location item : items) { + latitude += item.getLatitude(); + longitude += item.getLongitude(); + } + center = new LatLng(latitude / items.size(), longitude / items.size()); + } + + public List getLocations() { + return Collections.unmodifiableList(items); + } + + public void addItem(Location item) { + items.add(item); + findCenter(); + } + + static List manageLocations(List locations, int gridSize) { + List clusters = new ArrayList<>(); + //... TO DO + return clusters; + } +} diff --git a/src/main/java/cluster_manager/ClusterManager.java b/src/main/java/cluster_manager/ClusterManager.java new file mode 100644 index 0000000..5774066 --- /dev/null +++ b/src/main/java/cluster_manager/ClusterManager.java @@ -0,0 +1,43 @@ +package cluster_manager; + +import cluster_manager.xml_logic.LocationGenerator; +import cluster_manager.xml_logic.LocationParser; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ClusterManager { + private List locations; + private List clusters; + private final int gridSize = 50; + + ClusterManager(File locationsxml) { + if (locationsxml != null) { + locations = LocationParser.parse(locationsxml); + clusters = Cluster.manageLocations(locations, gridSize); + } else { + System.out.println("File doesn't exist!"); + } + } + + ClusterManager(int count) { + this(LocationGenerator.generate(count)); + } + + List getLocations() { + return Collections.unmodifiableList(locations); + } + + public List getInBounds(double minLat, double minLng, double maxLat, double maxLng) { + List clustersInBounds = new ArrayList<>(); + + for (Cluster current : clusters) { + if (current.getCenter().inBounds(minLat, minLng, maxLat, maxLng)) { + clustersInBounds.add(current); + } + } + return clustersInBounds; + } +} diff --git a/src/main/java/cluster_manager/LatLng.java b/src/main/java/cluster_manager/LatLng.java new file mode 100644 index 0000000..d9be3f4 --- /dev/null +++ b/src/main/java/cluster_manager/LatLng.java @@ -0,0 +1,23 @@ +package cluster_manager; + +class LatLng { + private final double latitude; + private final double longitude; + + LatLng(double latitude, double longitude) { + this.latitude = latitude; + this.longitude = longitude; + } + + double getLatitude() { + return latitude; + } + + double getLongitude() { + return longitude; + } + + boolean inBounds(double minLat, double minLng, double maxLat, double maxLng) { + return (latitude >= minLat && latitude <= maxLat) && (longitude >= minLng && longitude <= maxLng); + } +} diff --git a/src/main/java/cluster_manager/Location.java b/src/main/java/cluster_manager/Location.java new file mode 100644 index 0000000..2925528 --- /dev/null +++ b/src/main/java/cluster_manager/Location.java @@ -0,0 +1,28 @@ +package cluster_manager; + +public class Location extends LatLng { + private final int id; + private final String name; + + public Location(int id, String name, double latitude, double longitude) { + super(latitude, longitude); + this.id = id; + this.name = name; + } + + int getId() { + return id; + } + + String getName() { + return name; + } + + LatLng getLocation() { + return this; + } + + public String toString() { + return String.format("Location ID: %d - %s (lat: %f, lng: %f)", id, name, getLatitude(), getLongitude()); + } +} diff --git a/src/main/java/cluster_manager/xml_logic/LocationGenerator.java b/src/main/java/cluster_manager/xml_logic/LocationGenerator.java new file mode 100644 index 0000000..9e77165 --- /dev/null +++ b/src/main/java/cluster_manager/xml_logic/LocationGenerator.java @@ -0,0 +1,66 @@ +package cluster_manager.xml_logic; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.File; + +public class LocationGenerator { + + public static File generate(int count) { + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + Document locations = builder.newDocument(); + + Element rootElement = locations.createElement("root"); + locations.appendChild(rootElement); + + for (int i = 0; i < count; i++) { + Element row = locations.createElement("row"); + rootElement.appendChild(row); + + Element uniqueId = locations.createElement("UniqueID"); + uniqueId.appendChild(locations.createTextNode(String.format("%d", i))); + row.appendChild(uniqueId); + + Element name = locations.createElement("Name"); + name.appendChild(locations.createTextNode(Randomizer.getRandomName())); + row.appendChild(name); + + Element latitude = locations.createElement("Latitude"); + latitude.appendChild(locations.createTextNode(Randomizer.getRandomLatitude())); + row.appendChild(latitude); + + Element longitude = locations.createElement("Longitude"); + longitude.appendChild(locations.createTextNode(Randomizer.getRandomLongitude())); + row.appendChild(longitude); + } + + File randomizedLocations = new File("randomized_locations.xml"); + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + DOMSource source = new DOMSource(locations); + StreamResult result = new StreamResult(randomizedLocations); + + transformer.transform(source, result); + + return randomizedLocations; + } catch (ParserConfigurationException | TransformerException ex) { + ex.printStackTrace(); + return null; + } + } + + +} diff --git a/src/main/java/cluster_manager/xml_logic/LocationParser.java b/src/main/java/cluster_manager/xml_logic/LocationParser.java new file mode 100644 index 0000000..e607ddc --- /dev/null +++ b/src/main/java/cluster_manager/xml_logic/LocationParser.java @@ -0,0 +1,66 @@ +package cluster_manager.xml_logic; + +import cluster_manager.Location; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +public class LocationParser { + + public static List parse(File locationsXML) { + List items = new ArrayList<>(); + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(locationsXML); + + NodeList locationList = document.getElementsByTagName("row"); + + for (int i = 0; i < locationList.getLength(); i++) { + Node location = locationList.item(i); + if (location.getNodeType() == Node.ELEMENT_NODE) { + NodeList parameters = location.getChildNodes(); + int id = 0; + String name = null; + double latitude = 0; + double longitude = 0; + + for (int j = 0; j < parameters.getLength(); j++) { + Node parameter = parameters.item(j); + if (parameter.getNodeType() == Node.ELEMENT_NODE) { + if (parameter.getNodeName().equals("UniqueID")) { + id = Integer.parseInt(parameter.getTextContent()); + continue; + } + if (parameter.getNodeName().equals("Name")) { + name = parameter.getTextContent(); + continue; + } + if (parameter.getNodeName().equals("Latitude")) { + latitude = Double.parseDouble(parameter.getTextContent()); + continue; + } + if (parameter.getNodeName().equals("Longitude")) { + longitude = Double.parseDouble(parameter.getTextContent()); + } + } + } + items.add(new Location(id, name, latitude, longitude)); + } + } + } catch (ParserConfigurationException | SAXException | IOException ex) { + ex.printStackTrace(); + } + return items; + } +} diff --git a/src/main/java/cluster_manager/xml_logic/Randomizer.java b/src/main/java/cluster_manager/xml_logic/Randomizer.java new file mode 100644 index 0000000..20b04f4 --- /dev/null +++ b/src/main/java/cluster_manager/xml_logic/Randomizer.java @@ -0,0 +1,34 @@ +package cluster_manager.xml_logic; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +class Randomizer { + + static String getRandomName(int minLength, int maxLength) { + Random random = new Random(); + int length = random.nextInt(maxLength - minLength) + minLength; + StringBuilder result = new StringBuilder(); + for (int i = 0; i < length; i++) { + //[65 - 90] - latin alphabet in unicode(uppercase) + int code = random.nextInt(90 - 65) + 65; + char current = (char) code; + result.append(current); + } + return result.toString(); + } + + static String getRandomName() { + return getRandomName(5, 15); + } + + static String getRandomLatitude() { + double random = ThreadLocalRandom.current().nextDouble(-90, 90); + return String.format("%.4f", random); + } + + static String getRandomLongitude() { + double random = ThreadLocalRandom.current().nextDouble(-180, 180); + return String.format("%.4f", random); + } +} diff --git a/src/main/java/products/Category.java b/src/main/java/products/Category.java new file mode 100644 index 0000000..459636b --- /dev/null +++ b/src/main/java/products/Category.java @@ -0,0 +1,27 @@ +package products; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Category { + private final CategoryType category; + private final List products = new ArrayList<>(); + + public CategoryType getCategoryType() { + return category; + } + + public List getProducts() { + return Collections.unmodifiableList(products); + } + + Category(CategoryType category) { + this.category = category; + } + + void addProductToCategory(Product product) { + products.add(product); + } +} + diff --git a/src/main/java/products/CategoryType.java b/src/main/java/products/CategoryType.java new file mode 100644 index 0000000..24193c6 --- /dev/null +++ b/src/main/java/products/CategoryType.java @@ -0,0 +1,5 @@ +package products; + +enum CategoryType { + Healthy, Sweet, Natural, Fruit, Meat, Children, Chocolate +} \ No newline at end of file diff --git a/src/main/java/products/Product.java b/src/main/java/products/Product.java new file mode 100644 index 0000000..8488d1c --- /dev/null +++ b/src/main/java/products/Product.java @@ -0,0 +1,38 @@ +package products; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Product { + + private final List categoryList; + + private final String name; + + private int count; + private int prise; + + public List getCategories() { + return Collections.unmodifiableList(categoryList); + } + + public String getName() { + return name; + } + + public int getCount() { + return count; + } + + public int getPrise() { + return prise; + } + + Product(List productCategories, String name, int count, int prise) { + this.categoryList = new ArrayList<>(productCategories); + this.name = name; + this.count = count; + this.prise = prise; + } +} diff --git a/src/main/java/products/Stock.java b/src/main/java/products/Stock.java new file mode 100644 index 0000000..2eee1f9 --- /dev/null +++ b/src/main/java/products/Stock.java @@ -0,0 +1,45 @@ +package products; + +import java.util.*; + +public class Stock { + + private final Map categories = new HashMap<>(); + private final List products = new ArrayList<>(); + + private List makeCategoryList(CategoryType... categoryTypes) { + List categoriesOfProduct = new ArrayList<>(); + for (CategoryType current : categoryTypes) { + Category category = categories.get(current); + if (category == null) { + category = new Category(current); + categories.put(current, category); + } + categoriesOfProduct.add(category); + } + return categoriesOfProduct; + } + + public void addProduct(String name, int count, int price, CategoryType... category) { + + List productCategories = makeCategoryList(category); + Product product = new Product(productCategories, name, count, price); + products.add(product); + + for (Category current : productCategories) { + current.addProductToCategory(product); + } + } + + public List findAllProducts() { + return Collections.unmodifiableList(products); + } + + public List findProductsByCategory(CategoryType category) { + Category current = categories.get(category); + if (current == null) { + return Collections.emptyList(); + } + return categories.get(category).getProducts(); + } +} diff --git a/src/main/java/tree/Comparable.java b/src/main/java/tree/Comparable.java new file mode 100644 index 0000000..64cedab --- /dev/null +++ b/src/main/java/tree/Comparable.java @@ -0,0 +1,5 @@ +package tree; + +interface Comparable { + CompareResult compare(T other); +} diff --git a/src/main/java/tree/CompareResult.java b/src/main/java/tree/CompareResult.java new file mode 100644 index 0000000..7856397 --- /dev/null +++ b/src/main/java/tree/CompareResult.java @@ -0,0 +1,5 @@ +package tree; + +enum CompareResult{ + GREATER_THEN, EQUALS, LESS_THEN +} diff --git a/src/main/java/tree/Tree.java b/src/main/java/tree/Tree.java index 54d07f5..c595846 100644 --- a/src/main/java/tree/Tree.java +++ b/src/main/java/tree/Tree.java @@ -1,9 +1,82 @@ package tree; -public class Tree { +import java.util.ArrayList; +import java.util.List; -} +public class Tree> { + private Node head = null; + + public void add(T item){ + Node current = new Node<>(item); + if (isEmpty()) { + head = current; + } else { + head.addNode(current); + } + } + + public boolean isEmpty(){ + return head == null; + } + + public boolean contains(T item) { + return !isEmpty() && head.findNode(item); + } + + public List getElements(){ + List elements = new ArrayList<>(); + head.getNodes(elements); + return elements; + } + + private static class Node> { + private T value; + private Node left; + private Node right; -class Node { - + Node(T value) { + this.value = value; + left = null; + right = null; + } + + T getValue() { + return value; + } + + void addNode(Node current) { + switch (current.value.compare(this.value)) { + case LESS_THEN: + if (left != null) { + left.addNode(current); + } else left = current; + break; + case GREATER_THEN: + if (right != null) { + right.addNode(current); + } else right = current; + break; + default: + throw new IllegalArgumentException("The item is already exists"); + } + } + + boolean findNode(T current) { + switch (current.compare(this.value)) { + case LESS_THEN: + return left != null && left.findNode(current); + case GREATER_THEN: + return right != null && right.findNode(current); + default: + return true; + } + } + + void getNodes(List nodes) { + if (this.left != null) this.left.getNodes(nodes); + nodes.add(this.value); + if (this.right != null) this.right.getNodes(nodes); + } + } } + diff --git a/src/main/java/tree/User.java b/src/main/java/tree/User.java new file mode 100644 index 0000000..038c8fb --- /dev/null +++ b/src/main/java/tree/User.java @@ -0,0 +1,19 @@ +package tree; + +public class User implements Comparable{ + private final int height; + + public User(int height) { + this.height = height; + } + public int getHeight() { + return height; + } + + @Override + public CompareResult compare(User other) { + if (height > other.height) return CompareResult.GREATER_THEN; + if (height < other.height) return CompareResult.LESS_THEN; + return CompareResult.EQUALS; + } +} diff --git a/src/main/java/words/Counter.java b/src/main/java/words/Counter.java new file mode 100644 index 0000000..e19815d --- /dev/null +++ b/src/main/java/words/Counter.java @@ -0,0 +1,33 @@ +package words; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class Counter { + private Map words = new HashMap<>(); + + private String[] convertToArray(String input) { + return input.trim().split(" "); + } + + public boolean count(String string) { + if (string == null || convertToArray(string)[0].equals("")) { + return false; + } else { + for (String word : convertToArray(string)) { + int count = words.getOrDefault(word, 0); + words.put(word, count + 1); + } + return true; + } + } + + public int getCount(String word) { + return words.getOrDefault(word, 0); + } + + public Map getFrequency() { + return Collections.unmodifiableMap(words); + } +} diff --git a/src/test/java/cluster_manager/ClusterManagerTest.java b/src/test/java/cluster_manager/ClusterManagerTest.java new file mode 100644 index 0000000..b7097ac --- /dev/null +++ b/src/test/java/cluster_manager/ClusterManagerTest.java @@ -0,0 +1,38 @@ +package cluster_manager; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class ClusterManagerTest { + private ClusterManager manager; + + @Test + public void parsing_locations_from_xml() { + File location = new File("locations.xml"); + manager = new ClusterManager(location); + List current = manager.getLocations(); + + List expected = new ArrayList<>(); + + expected.add(new Location(12, "CHURCH VIEW BP", 51.14, 0.2617)); + expected.add(new Location(14, "CLARENDON BP", 51.6581, 0.2511)); + + for (int i = 0; i < expected.size(); i++) { + Assert.assertEquals(expected.get(i).toString(), current.get(i).toString()); + } + } + + @Test + public void generating_locations_to_xml() { + int count = 1000; + manager = new ClusterManager(count); + List current = manager.getLocations(); + + Assert.assertFalse(current.isEmpty()); + Assert.assertEquals(count, current.size()); + } +} diff --git a/src/test/java/products/StockTest.java b/src/test/java/products/StockTest.java new file mode 100644 index 0000000..2679ad5 --- /dev/null +++ b/src/test/java/products/StockTest.java @@ -0,0 +1,53 @@ +package products; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +public class StockTest { + private Stock stock; + + @Before + public void set_up() { + stock = new Stock(); + } + + @Test + public void add_products() { + stock.addProduct("Snickers", 10, 15, CategoryType.Chocolate); + Assert.assertEquals(stock.findAllProducts().get(0).getName(), "Snickers"); + + stock.addProduct("Milk", 1, 20, CategoryType.Healthy, CategoryType.Children, CategoryType.Natural); + Assert.assertEquals(stock.findAllProducts().get(1).getCount(), 1); + + stock.addProduct("Hum", 10, 80, CategoryType.Healthy, CategoryType.Meat); + Assert.assertEquals(stock.findAllProducts().get(2).getPrise(), 80); + Assert.assertEquals(stock.findAllProducts().get(2).getName(), "Hum"); + } + + @Test + public void get_products_in_category() { + stock.addProduct("Milk", 1, 20, CategoryType.Healthy, CategoryType.Children, CategoryType.Natural); + stock.addProduct("Hum", 10, 80, CategoryType.Healthy, CategoryType.Meat); + + List products = stock.findProductsByCategory(CategoryType.Healthy); + + Assert.assertEquals(products.get(0).getName(), "Milk"); + Assert.assertEquals(products.get(1).getName(), "Hum"); + } + + @Test + public void get_categories_of_product() { + stock.addProduct("Milk", 1, 20, CategoryType.Healthy, CategoryType.Children, CategoryType.Natural); + + List categories = stock.findAllProducts().get(0).getCategories(); + + Assert.assertEquals(categories.size(), 3); + Assert.assertEquals(categories.get(0).getCategoryType(), CategoryType.Healthy); + Assert.assertEquals(categories.get(1).getCategoryType(), CategoryType.Children); + Assert.assertEquals(categories.get(2).getCategoryType(), CategoryType.Natural); + } +} + diff --git a/src/test/java/tree/TreeTest.java b/src/test/java/tree/TreeTest.java index cd2bd68..35f9295 100644 --- a/src/test/java/tree/TreeTest.java +++ b/src/test/java/tree/TreeTest.java @@ -1,7 +1,69 @@ package tree; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + import static org.junit.Assert.*; public class TreeTest { + private Tree tree; + private final User rostik = new User(170); + private final User vitalik = new User(182); + private final User rusik = new User(180); + private final User andrii = new User(160); + private final User misha = new User(175); + + @Before + public void set_up() throws Exception { + tree = new Tree<>(); + } + + @Test + public void is_empty() { + assertTrue(tree.isEmpty()); + + tree.add(vitalik); + assertFalse(tree.isEmpty()); + } + + @Test(expected = IllegalArgumentException.class) + public void add_one_node_multiple_times() { + tree.add(vitalik); + tree.add(vitalik); + tree.add(vitalik); + tree.add(vitalik); + + } + + @Test + public void add_and_contains() { + assertFalse("do not contain vitalik", tree.contains(vitalik)); + tree.add(vitalik); + assertTrue("contain vitalik", tree.contains(vitalik)); + + assertFalse("do not contain rostik", tree.contains(rostik)); + assertFalse("do not contain rusik", tree.contains(rusik)); + + tree.add(rostik); + tree.add(rusik); + + assertTrue("contain rostik", tree.contains(rostik)); + assertTrue("contain rusik", tree.contains(rusik)); + } + + @Test + public void get_elements() { + User[] arr = new User[]{vitalik, rostik, rusik, andrii, misha}; + for (int i = 0; i < arr.length; i++) { + tree.add(arr[i]); + } + User[] arrSorted = new User[]{andrii, rostik, misha, rusik, vitalik}; + List nodes = tree.getElements(); + for (int i = 0; i < arrSorted.length; i++) { + assertEquals(nodes.get(i), arrSorted[i]); + } + } } \ No newline at end of file diff --git a/src/test/java/words/CounterTest.java b/src/test/java/words/CounterTest.java new file mode 100644 index 0000000..9f9c22c --- /dev/null +++ b/src/test/java/words/CounterTest.java @@ -0,0 +1,68 @@ +package words; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class CounterTest { + private Counter counter; + + @Before + public void set_up(){ + counter = new Counter(); + } + + @Test + public void count_word(){ + Assert.assertTrue(counter.count("Hello")); + Assert.assertFalse(counter.count(null)); + Assert.assertFalse(counter.count("")); + Assert.assertFalse(counter.count(" ")); + Assert.assertFalse(counter.count(" ")); + } + + @Test + public void frequency(){ + + Assert.assertTrue(counter.getFrequency().isEmpty()); + counter.count(" "); + counter.count(null); + Assert.assertTrue(counter.getFrequency().isEmpty()); + counter.count("Hello Rostik"); + counter.count("Hello Rostik bro"); + counter.count("Rostik and Vitalik"); + Assert.assertFalse(counter.getFrequency().isEmpty()); + + Map expected = new HashMap<>(); + expected.put("Hello", 2); + expected.put("Rostik", 3); + expected.put("bro", 1); + expected.put("and", 1); + expected.put("Vitalik", 1); + + Assert.assertEquals(expected, counter.getFrequency()); + } + + @Test + public void count_multiple_words_in_string(){ + counter.count(" Hello o ."); + + Assert.assertEquals(counter.getCount("Hello"), 1); + Assert.assertEquals(counter.getCount("o"), 1); + Assert.assertEquals(counter.getCount("."), 1); + + Assert.assertEquals(counter.getCount(" "), 0); + + Assert.assertEquals(counter.getCount("hello"), 0); + + counter.count("o o o Vitalik"); + + Assert.assertEquals(counter.getCount("o"), 4); + Assert.assertEquals(counter.getCount("Vitalik"), 1); + } + + +}