diff --git a/.codacy.yml b/.codacy.yml index c51b7ff70..6aea04e74 100644 --- a/.codacy.yml +++ b/.codacy.yml @@ -1,3 +1,9 @@ --- +engines: + eslint: + exclude_paths: + - app/assets/javascripts/highcharts-maps/tr.js + - plugins/tenant/omu/test/dummy/app/assets/javascripts/* + - plugins/tenant/acme/test/dummy/app/assets/javascripts/* exclude_paths: - '**.md' diff --git a/.eslintrc.json b/.eslintrc.json index 7d03cee42..d6622030e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,4 @@ { - "extends": "standard" -} \ No newline at end of file + "extends": "standard", + "parser": "babel-eslint" +} diff --git a/Gemfile.lock b/Gemfile.lock index 5c721b492..d5d64c6d9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -94,13 +94,13 @@ GEM authy (2.7.5) httpclient (>= 2.5.3.3) aws-eventstream (1.0.3) - aws-partitions (1.266.0) - aws-sdk-core (3.88.0) + aws-partitions (1.269.0) + aws-sdk-core (3.89.1) aws-eventstream (~> 1.0, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.27.0) + aws-sdk-kms (1.28.0) aws-sdk-core (~> 3, >= 3.71.0) aws-sigv4 (~> 1.1) aws-sdk-s3 (1.60.1) @@ -130,7 +130,7 @@ GEM bundler-audit (0.6.1) bundler (>= 1.2.0, < 3) thor (~> 0.18) - byebug (11.1.0) + byebug (11.1.1) capybara (3.30.0) addressable mini_mime (>= 0.1.3) @@ -161,12 +161,12 @@ GEM dotenv-rails (2.7.5) dotenv (= 2.7.5) railties (>= 3.2, < 6.1) - erb_lint (0.0.30) + erb_lint (0.0.31) activesupport better_html (~> 1.0.7) html_tokenizer rainbow - rubocop (~> 0.51) + rubocop (~> 0.79.0) smart_properties erubi (1.9.0) execjs (2.7.0) @@ -264,7 +264,7 @@ GEM parallel (1.19.1) parser (2.7.0.2) ast (~> 2.4.0) - pg (1.2.1) + pg (1.2.2) pg_search (2.3.2) activerecord (>= 5.2) activesupport (>= 5.2) @@ -281,7 +281,7 @@ GEM pundit (2.1.0) activesupport (>= 3.0.0) pwned (2.0.1) - rack (2.0.8) + rack (2.1.1) rack-attack (6.2.2) rack (>= 1.0, < 3) rack-mini-profiler (1.1.4) @@ -351,13 +351,13 @@ GEM rubocop (>= 0.74) rubocop-performance (1.5.2) rubocop (>= 0.71.0) - rubocop-rails (2.4.1) + rubocop-rails (2.4.2) rack (>= 1.1) rubocop (>= 0.72.0) ruby-progressbar (1.10.1) ruby-vips (2.0.17) ffi (~> 1.9) - rubyzip (2.0.0) + rubyzip (2.1.0) safe_yaml (1.0.5) sassc (2.2.1) ffi (~> 1.9) @@ -402,11 +402,11 @@ GEM attr_required (>= 0.0.5) httpclient (>= 2.4) swearjar (1.3.1) - telephone_number (1.4.5) + telephone_number (1.4.6) thor (0.20.3) thread_safe (0.3.6) tilt (2.0.10) - twilio-ruby (5.31.2) + twilio-ruby (5.31.3) faraday (~> 1.0.0) jwt (>= 1.5, <= 2.5) nokogiri (>= 1.6, < 2.0) diff --git a/README.md b/README.md index 96a2f4cd1..90aeb1f8a 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ services, 50K students and 4K employees as a case. Installation ------------ -See [installation guide](/doc/development/installation.md) for details. +See [installation guide](/doc/operations/installation.md) for details. Documentation ------------- diff --git a/app.json b/app.json index fa5d81237..26a167923 100644 --- a/app.json +++ b/app.json @@ -7,7 +7,7 @@ "rails" ], "repository": "https://github.com/omu/nokul", - "version": "0.7.4", + "version": "0.7.5", "scripts": { "dokku": { "predeploy": "bin/plugdo bundle install -j4 --path /app/vendor/bundle --without development:test && bundle exec rails assets:precompile && bundle exec rails db:migrate" diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js index 55c6085f2..6f144bc23 100644 --- a/app/assets/config/manifest.js +++ b/app/assets/config/manifest.js @@ -2,3 +2,5 @@ //= link_directory ../stylesheets .css //= link application.js +//= link chart.js +//= link highcharts-langs/tr.js diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index b70fe4df9..8b150a265 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -1,7 +1,5 @@ // Manifest file for common assets being used in panel -//= require rails-ujs -//= require activestorage //= require coreui //= require helpers/dynamic_select //= require toastr/build/toastr.min diff --git a/app/assets/javascripts/chart.js b/app/assets/javascripts/chart.js new file mode 100644 index 000000000..cb31f8127 --- /dev/null +++ b/app/assets/javascripts/chart.js @@ -0,0 +1,5 @@ +//= require echarts/dist/echarts.min +//= require highcharts/highcharts +//= require highcharts/modules/exporting +//= require highcharts/modules/map +//= require highcharts-maps/tr diff --git a/app/assets/javascripts/highcharts-langs/tr.js b/app/assets/javascripts/highcharts-langs/tr.js new file mode 100644 index 000000000..40509d4bc --- /dev/null +++ b/app/assets/javascripts/highcharts-langs/tr.js @@ -0,0 +1,26 @@ +/* eslint-disable no-undef */ + +Highcharts.setOptions({ + lang: { + contextButtonTitle: 'Grafik İşlem Menüsü', + decimalPoint: ',', + downloadJPEG: 'JPEG olarak indir', + downloadPDF: 'PDF olarak indir', + downloadPNG: 'PNG olarak indir', + downloadSVG: 'SVG olarak indir', + exportButtonTitle: 'Dışarı Aktar', + loading: 'Yükleniyor...', + months: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'], + printButtonTitle: 'Yazdır', + printChart: 'Yazdır', + rangeSelectorFrom: 'Başlangış', + rangeSelectorTo: 'Bitiş', + rangeSelectorZoom: 'Aralık seç', + resetZoom: 'Yakınlaşmayı Sıfırla', + resetZoomTitle: 'Yakınlaşmayı Sıfırla', + shortMonths: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'], + thousandsSep: '.', + viewFullscreen: 'Tam Ekran Görüntüle', + weekdays: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'] + } +}) diff --git a/app/assets/javascripts/highcharts-maps/tr.js b/app/assets/javascripts/highcharts-maps/tr.js new file mode 100644 index 000000000..7f7a70eac --- /dev/null +++ b/app/assets/javascripts/highcharts-maps/tr.js @@ -0,0 +1,14 @@ +/* global Highcharts */ +/* eslint no-undef: "error" */ + +Highcharts.maps['countries/tr/tr-all'] = { + title: 'Turkey', + version: '1.1.2', + type: 'FeatureCollection', + copyright: 'Copyright (c) 2015 Highsoft AS, Based on data from Natural Earth', + copyrightShort: 'Natural Earth', + copyrightUrl: 'http://www.naturalearthdata.com', + crs: { type: 'name', properties: { name: 'urn:ogc:def:crs:EPSG:32636' } }, + 'hc-transform': { default: { crs: '+proj=utm +zone=36 +datum=WGS84 +units=m +no_defs', scale: 0.000418317446042, jsonres: 15.5, jsonmarginX: -999, jsonmarginY: 9851.0, xoffset: -125397.473102, yoffset: 4675858.14012 } }, + features: [{ type: 'Feature', id: 'TR.OR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.68, 'hc-middle-y': 0.42, 'hc-key': 'tr-or', 'hc-a2': 'OR', labelrank: '7', hasc: 'TR.OR', 'alt-name': 'Ordu', 'woe-id': '2347304', subregion: null, fips: 'TU52', 'postal-code': 'OR', name: 'Ordu', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.4229', 'woe-name': 'Ordu', latitude: '40.8376', 'woe-label': 'Ordu, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5081, 8906], [5147, 8927], [5238, 8997], [5315, 9122], [5376, 9125], [5449, 9101], [5511, 9056], [5553, 9054], [5608, 9132], [5660, 9122], [5663, 9077], [5727, 9024], [5773, 9033], [5847, 9014], [5824, 8931], [5840, 8865], [5834, 8758], [5890, 8702], [5809, 8667], [5808, 8617], [5751, 8608], [5701, 8556], [5638, 8584], [5604, 8641], [5572, 8718], [5498, 8719], [5368, 8800], [5255, 8796], [5079, 8866], [5081, 8906]]] } }, { type: 'Feature', id: 'TR.SS', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.58, 'hc-key': 'tr-ss', 'hc-a2': 'SS', labelrank: '7', hasc: 'TR.SS', 'alt-name': 'Samsun', 'woe-id': '2347307', subregion: null, fips: 'TU55', 'postal-code': 'SS', name: 'Samsun', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '36.0198', 'woe-name': 'Samsun', latitude: '41.2761', 'woe-label': 'Samsun, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5315, 9122], [5238, 8997], [5147, 8927], [5081, 8906], [5051, 8936], [4937, 8906], [4877, 8946], [4824, 9000], [4803, 8985], [4779, 8922], [4713, 8881], [4670, 8900], [4534, 8898], [4497, 8934], [4398, 9002], [4364, 8995], [4194, 9038], [4132, 9037], [4110, 9118], [4081, 9167], [4106, 9203], [4196, 9253], [4217, 9222], [4303, 9164], [4416, 9186], [4395, 9281], [4386, 9394], [4406, 9443], [4471, 9439], [4617, 9498], [4650, 9519], [4699, 9496], [4741, 9444], [4753, 9325], [4812, 9253], [4867, 9226], [4872, 9205], [4931, 9172], [4995, 9216], [5019, 9273], [5137, 9261], [5220, 9224], [5247, 9188], [5253, 9144], [5315, 9122]]] } }, { type: 'Feature', id: 'TR.GA', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.68, 'hc-middle-y': 0.57, 'hc-key': 'tr-ga', 'hc-a2': 'GA', labelrank: '7', hasc: 'TR.GA', 'alt-name': 'Gaziantep', 'woe-id': '2347284', subregion: null, fips: 'TU83', 'postal-code': 'GA', name: 'Gaziantep', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.2462', 'woe-name': 'Gaziantep', latitude: '36.9988', 'woe-label': 'Gaziantep, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5963, 6042], [5846, 5982], [5751, 5957], [5677, 5911], [5626, 5953], [5527, 6000], [5510, 5988], [5435, 6063], [5350, 6097], [5330, 6137], [5292, 6132], [5288, 6083], [5203, 6032], [5172, 6000], [5135, 6037], [5049, 6092], [5121, 6192], [5150, 6256], [5196, 6321], [5264, 6356], [5290, 6394], [5318, 6377], [5337, 6314], [5382, 6301], [5432, 6359], [5610, 6422], [5682, 6430], [5706, 6447], [5707, 6522], [5832, 6541], [5900, 6519], [5948, 6482], [5910, 6473], [5862, 6409], [5840, 6348], [5863, 6212], [5895, 6188], [5927, 6195], [5923, 6152], [5948, 6129], [5963, 6042]]] } }, { type: 'Feature', id: 'TR.4409', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.42, 'hc-middle-y': 0.43, 'hc-key': 'tr-4409', 'hc-a2': 'NU', labelrank: '20', hasc: '-99', 'alt-name': null, 'woe-id': '-99', subregion: null, fips: null, 'postal-code': null, name: null, country: 'Turkey', 'type-en': null, region: null, longitude: '29.658', 'woe-name': null, latitude: '36.1327', 'woe-label': null, type: null }, geometry: { type: 'Polygon', coordinates: [[[3515, 5497], [3510, 5491], [3512, 5495], [3515, 5497]]] } }, { type: 'Feature', id: 'TR.KC', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.66, 'hc-middle-y': 0.37, 'hc-key': 'tr-kc', 'hc-a2': 'KC', labelrank: '7', hasc: 'TR.KC', 'alt-name': 'Kocaeli', 'woe-id': '2347296', subregion: null, fips: 'TU41', 'postal-code': 'KC', name: 'Kocaeli', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.9396', 'woe-name': 'Kocaeli', latitude: '40.9008', 'woe-label': 'Kocaeli, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1349, 9102], [1498, 9091], [1573, 9137], [1658, 9105], [1636, 9051], [1644, 9014], [1684, 9006], [1669, 8936], [1590, 8949], [1597, 8920], [1561, 8883], [1535, 8776], [1512, 8732], [1407, 8689], [1369, 8687], [1295, 8717], [1154, 8677], [1091, 8688], [1097, 8715], [1099, 8779], [1140, 8805], [1171, 8777], [1278, 8797], [1371, 8787], [1375, 8817], [1285, 8817], [1232, 8841], [1102, 8841], [1062, 8832], [1009, 8916], [1121, 9008], [1149, 9004], [1190, 8945], [1225, 8932], [1240, 8966], [1339, 9014], [1355, 9050], [1349, 9102]]] } }, { type: 'Feature', id: 'TR.BK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.63, 'hc-middle-y': 0.67, 'hc-key': 'tr-bk', 'hc-a2': 'BK', labelrank: '7', hasc: 'TR.BK', 'alt-name': 'Balıkesir', 'woe-id': '2347267', subregion: null, fips: 'TU10', 'postal-code': 'BK', name: 'Balıkesir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.8355', 'woe-name': 'Balıkesir', latitude: '39.7193', 'woe-label': 'Balıkesir, TR, Turkey', type: 'Il' }, geometry: { type: 'MultiPolygon', coordinates: [[[[113, 8810], [165, 8792], [156, 8772], [95, 8748], [58, 8769], [54, 8796], [113, 8810]]], [[[-430, 7765], [-459, 7834], [-520, 7847], [-398, 7929], [-404, 7954], [-332, 7987], [-321, 8050], [-345, 8059], [-473, 8044], [-471, 8102], [-449, 8157], [-376, 8150], [-264, 8204], [-205, 8207], [-124, 8181], [-30, 8227], [0, 8311], [-17, 8335], [17, 8424], [-25, 8464], [59, 8523], [65, 8561], [185, 8558], [240, 8602], [189, 8610], [135, 8692], [178, 8715], [292, 8683], [326, 8661], [251, 8611], [272, 8585], [366, 8602], [419, 8601], [355, 8531], [380, 8478], [357, 8427], [386, 8351], [424, 8310], [440, 8236], [581, 8121], [625, 8113], [653, 8131], [670, 8057], [707, 8023], [781, 8021], [810, 7997], [774, 7913], [764, 7862], [714, 7786], [631, 7752], [624, 7694], [575, 7704], [522, 7680], [433, 7674], [395, 7643], [321, 7642], [295, 7708], [240, 7776], [176, 7775], [202, 7829], [190, 7852], [70, 7864], [-17, 7913], [-61, 7893], [-98, 7950], [-129, 7958], [-269, 7885], [-304, 7844], [-430, 7765]]]] } }, { type: 'Feature', id: 'TR.CK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.58, 'hc-middle-y': 0.59, 'hc-key': 'tr-ck', 'hc-a2': 'CK', labelrank: '7', hasc: 'TR.CK', 'alt-name': 'Çanakkale', 'woe-id': '2347274', subregion: null, fips: 'TU17', 'postal-code': 'CK', name: 'Çanakkale', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '26.8233', 'woe-name': 'Çanakkale', latitude: '40.0553', 'woe-label': 'Çanakkale, TR, Turkey', type: 'Il' }, geometry: { type: 'MultiPolygon', coordinates: [[[[-806, 8282], [-783, 8272], [-790, 8237], [-839, 8267], [-806, 8282]]], [[[-347, 8883], [-347, 8885], [-268, 8872], [-272, 8815], [-258, 8760], [-418, 8695], [-459, 8628], [-561, 8550], [-618, 8524], [-603, 8490], [-689, 8432], [-730, 8428], [-665, 8524], [-658, 8569], [-686, 8618], [-622, 8644], [-557, 8693], [-463, 8738], [-422, 8735], [-385, 8771], [-330, 8795], [-354, 8838], [-347, 8883]]], [[[-941, 8555], [-854, 8573], [-823, 8556], [-831, 8510], [-805, 8500], [-944, 8475], [-999, 8501], [-941, 8555]]], [[[-473, 8044], [-592, 8031], [-647, 8006], [-683, 8014], [-765, 7999], [-808, 8013], [-781, 8100], [-759, 8119], [-746, 8175], [-756, 8203], [-739, 8347], [-710, 8393], [-646, 8396], [-596, 8456], [-583, 8517], [-531, 8527], [-392, 8655], [-239, 8637], [-191, 8677], [-76, 8673], [-62, 8609], [-1, 8570], [65, 8561], [59, 8523], [-25, 8464], [17, 8424], [-17, 8335], [0, 8311], [-30, 8227], [-124, 8181], [-205, 8207], [-264, 8204], [-376, 8150], [-449, 8157], [-471, 8102], [-473, 8044]]]] } }, { type: 'Feature', id: 'TR.TT', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.5, 'hc-key': 'tr-tt', 'hc-a2': 'TT', labelrank: '7', hasc: 'TR.TT', 'alt-name': 'Tokat', 'woe-id': '2347311', subregion: null, fips: 'TU60', 'postal-code': 'TT', name: 'Tokat', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '36.5724', 'woe-name': 'Tokat', latitude: '40.4442', 'woe-label': 'Tokat, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4937, 8906], [5051, 8936], [5081, 8906], [5079, 8866], [5255, 8796], [5368, 8800], [5498, 8719], [5572, 8718], [5604, 8641], [5549, 8534], [5455, 8488], [5312, 8470], [5221, 8438], [5157, 8443], [5117, 8423], [5085, 8309], [4987, 8256], [4896, 8248], [4768, 8217], [4739, 8262], [4741, 8331], [4717, 8353], [4620, 8325], [4525, 8327], [4441, 8398], [4477, 8463], [4536, 8488], [4618, 8631], [4708, 8626], [4780, 8592], [4874, 8654], [4876, 8690], [4920, 8702], [4969, 8817], [4927, 8865], [4937, 8906]]] } }, { type: 'Feature', id: 'TR.GI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.57, 'hc-key': 'tr-gi', 'hc-a2': 'GI', labelrank: '7', hasc: 'TR.GI', 'alt-name': 'Giresun', 'woe-id': '2347285', subregion: null, fips: 'TU28', 'postal-code': 'GI', name: 'Giresun', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '38.6055', 'woe-name': 'Giresun', latitude: '40.5379', 'woe-label': 'Giresun, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6337, 8403], [6316, 8392], [6243, 8385], [6127, 8424], [6071, 8407], [5968, 8463], [5890, 8702], [5834, 8758], [5840, 8865], [5824, 8931], [5847, 9014], [5942, 9011], [5967, 8992], [6081, 9005], [6138, 9044], [6177, 9032], [6211, 9068], [6287, 9103], [6349, 9108], [6406, 9133], [6397, 9044], [6407, 8942], [6419, 8915], [6354, 8903], [6294, 8846], [6297, 8805], [6267, 8758], [6268, 8694], [6284, 8677], [6350, 8665], [6395, 8637], [6394, 8610], [6313, 8545], [6318, 8471], [6337, 8403]]] } }, { type: 'Feature', id: 'TR.EN', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.18, 'hc-middle-y': 0.45, 'hc-key': 'tr-en', 'hc-a2': 'EN', labelrank: '7', hasc: 'TR.EN', 'alt-name': 'Erzincan', 'woe-id': '2347281', subregion: null, fips: 'TU24', 'postal-code': 'EN', name: 'Erzincan', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.5121', 'woe-name': 'Erzincan', latitude: '39.6874', 'woe-label': 'Erzincan, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6243, 8385], [6316, 8392], [6337, 8403], [6403, 8384], [6509, 8335], [6529, 8314], [6597, 8292], [6728, 8302], [6818, 8339], [6859, 8400], [6947, 8418], [6993, 8453], [7085, 8441], [7070, 8360], [7101, 8347], [7196, 8354], [7237, 8308], [7262, 8242], [7328, 8201], [7302, 8131], [7304, 8086], [7267, 8095], [7092, 8092], [7059, 8103], [6952, 8057], [6876, 8080], [6795, 8023], [6667, 8000], [6580, 8007], [6506, 7989], [6423, 7957], [6400, 7923], [6319, 7872], [6328, 7814], [6286, 7791], [6262, 7738], [6281, 7652], [6264, 7648], [6250, 7639], [6211, 7680], [6160, 7701], [6107, 7700], [6061, 7720], [6076, 7765], [6053, 7892], [6095, 7946], [6041, 7991], [6047, 8119], [6084, 8182], [6126, 8197], [6118, 8230], [6040, 8214], [6051, 8298], [6075, 8314], [6129, 8293], [6183, 8321], [6234, 8320], [6243, 8385]]] } }, { type: 'Feature', id: 'TR.BG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.59, 'hc-middle-y': 0.44, 'hc-key': 'tr-bg', 'hc-a2': 'BG', labelrank: '7', hasc: 'TR.BG', 'alt-name': 'Bingöl', 'woe-id': '2347269', subregion: null, fips: 'TU12', 'postal-code': 'BG', name: 'Bingöl', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.646', 'woe-name': 'Bingöl', latitude: '39.0743', 'woe-label': 'Bingöl, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7267, 8095], [7304, 8086], [7354, 8083], [7433, 8133], [7509, 8078], [7587, 8061], [7642, 7995], [7628, 7949], [7651, 7877], [7695, 7818], [7698, 7758], [7663, 7706], [7650, 7648], [7714, 7546], [7520, 7428], [7374, 7429], [7289, 7398], [7288, 7356], [7254, 7319], [7188, 7311], [7174, 7376], [7141, 7418], [7161, 7497], [7198, 7490], [7213, 7565], [7164, 7627], [7146, 7682], [7153, 7733], [7198, 7823], [7178, 7856], [7115, 7824], [6991, 7745], [7002, 7793], [6986, 7846], [6993, 7920], [7026, 7946], [7074, 7951], [7082, 7978], [7133, 7991], [7179, 8054], [7220, 8052], [7267, 8095]]] } }, { type: 'Feature', id: 'TR.HT', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.52, 'hc-middle-y': 0.51, 'hc-key': 'tr-ht', 'hc-a2': 'HT', labelrank: '7', hasc: 'TR.HT', 'alt-name': 'Hatay', 'woe-id': '2347286', subregion: null, fips: 'TU31', 'postal-code': 'HT', name: 'Hatay', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '36.2284', 'woe-name': 'Hatay', latitude: '36.4876', 'woe-label': 'Hatay, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5049, 6092], [5135, 6037], [5172, 6000], [5142, 5941], [5126, 5849], [5126, 5786], [5110, 5758], [5144, 5637], [5173, 5632], [5192, 5570], [5095, 5565], [5068, 5544], [5022, 5563], [5015, 5519], [5019, 5394], [4972, 5393], [4968, 5367], [4926, 5361], [4895, 5265], [4808, 5303], [4799, 5339], [4759, 5331], [4795, 5405], [4777, 5454], [4686, 5591], [4679, 5618], [4721, 5658], [4752, 5713], [4819, 5772], [4906, 5830], [4920, 5869], [4901, 5972], [4823, 6054], [4780, 6050], [4751, 6019], [4741, 6063], [4797, 6126], [4822, 6119], [4949, 6120], [4991, 6087], [5049, 6092]]] } }, { type: 'Feature', id: 'TR.AA', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.67, 'hc-key': 'tr-aa', 'hc-a2': 'AA', labelrank: '7', hasc: 'TR.AA', 'alt-name': 'Adana', 'woe-id': '2347258', subregion: null, fips: 'TU81', 'postal-code': 'AA', name: 'Adana', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '35.7555', 'woe-name': 'Adana', latitude: '37.4006', 'woe-label': 'Adana, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4822, 6119], [4797, 6126], [4741, 6063], [4751, 6019], [4679, 5946], [4609, 5936], [4546, 5889], [4599, 5899], [4582, 5822], [4532, 5808], [4513, 5825], [4419, 5773], [4239, 5877], [4175, 5899], [4252, 5950], [4241, 6070], [4257, 6116], [4234, 6138], [4171, 6155], [4154, 6270], [4126, 6291], [4084, 6373], [4085, 6423], [4124, 6492], [4101, 6583], [4119, 6610], [4177, 6600], [4233, 6610], [4306, 6687], [4405, 6682], [4528, 6644], [4558, 6659], [4542, 6791], [4749, 6942], [4815, 7057], [4837, 7118], [4904, 7165], [4950, 7179], [4980, 7167], [5043, 7073], [4996, 6997], [4952, 6774], [4976, 6645], [4932, 6598], [4835, 6591], [4810, 6546], [4744, 6376], [4746, 6321], [4765, 6269], [4814, 6264], [4845, 6201], [4822, 6119]]] } }, { type: 'Feature', id: 'TR.CM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.48, 'hc-middle-y': 0.47, 'hc-key': 'tr-cm', 'hc-a2': 'CM', labelrank: '7', hasc: 'TR.CM', 'alt-name': 'Çorum', 'woe-id': '2347276', subregion: null, fips: 'TU19', 'postal-code': 'CM', name: 'Çorum', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.711', 'woe-name': 'Çorum', latitude: '40.6149', 'woe-label': 'Çorum, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3639, 8179], [3638, 8216], [3663, 8264], [3655, 8325], [3617, 8351], [3588, 8436], [3652, 8469], [3689, 8551], [3655, 8628], [3628, 8763], [3645, 8820], [3617, 8865], [3742, 8909], [3754, 8945], [3714, 8995], [3756, 9080], [3794, 9119], [3827, 9186], [3855, 9193], [3870, 9175], [3963, 9162], [3993, 9136], [4055, 9118], [4081, 9167], [4110, 9118], [4132, 9037], [4194, 9038], [4174, 8963], [4167, 8844], [4211, 8752], [4320, 8728], [4390, 8698], [4405, 8666], [4395, 8587], [4349, 8513], [4340, 8428], [4265, 8414], [4260, 8331], [4203, 8284], [4130, 8293], [4048, 8251], [3948, 8236], [3863, 8249], [3757, 8206], [3670, 8195], [3639, 8179]]] } }, { type: 'Feature', id: 'TR.KK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.49, 'hc-key': 'tr-kk', 'hc-a2': 'KK', labelrank: '7', hasc: 'TR.KK', 'alt-name': 'Kırıkkale', 'woe-id': '2347329', subregion: null, fips: 'TU79', 'postal-code': 'KK', name: 'Kırıkkale', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.778', 'woe-name': 'Kırıkkale', latitude: '39.9011', 'woe-label': 'Kırıkkale, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3588, 8436], [3617, 8351], [3655, 8325], [3663, 8264], [3638, 8216], [3639, 8179], [3647, 8150], [3652, 8120], [3563, 8034], [3539, 7960], [3501, 7899], [3411, 7825], [3349, 7716], [3304, 7802], [3282, 7904], [3222, 7986], [3208, 8046], [3238, 8168], [3262, 8230], [3367, 8255], [3370, 8388], [3384, 8488], [3536, 8441], [3588, 8436]]] } }, { type: 'Feature', id: 'TR.NG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.39, 'hc-key': 'tr-ng', 'hc-a2': 'NG', labelrank: '7', hasc: 'TR.NG', 'alt-name': 'Niğde', 'woe-id': '2347323', subregion: null, fips: 'TU73', 'postal-code': 'NG', name: 'Niğde', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.7093', 'woe-name': 'Niğde', latitude: '37.8966', 'woe-label': 'Niğde, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3716, 6809], [3900, 7090], [4013, 7103], [4082, 7064], [4141, 7087], [4183, 6979], [4217, 6944], [4309, 6945], [4325, 6898], [4324, 6836], [4343, 6786], [4317, 6768], [4306, 6687], [4233, 6610], [4177, 6600], [4119, 6610], [4101, 6583], [4124, 6492], [4085, 6423], [4084, 6373], [4044, 6382], [3968, 6346], [3924, 6344], [3852, 6440], [3854, 6493], [3889, 6565], [3882, 6606], [3798, 6719], [3744, 6743], [3716, 6809]]] } }, { type: 'Feature', id: 'TR.AK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.48, 'hc-middle-y': 0.62, 'hc-key': 'tr-ak', 'hc-a2': 'AK', labelrank: '6', hasc: 'TR.AK', 'alt-name': 'Aksaray', 'woe-id': '2347325', subregion: null, fips: 'TU75', 'postal-code': 'AK', name: 'Aksaray', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.8772', 'woe-name': 'Aksaray', latitude: '38.3566', 'woe-label': 'Aksaray, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3900, 7090], [3716, 6809], [3674, 6815], [3542, 6775], [3409, 6770], [3316, 6756], [3254, 6825], [3241, 6882], [3206, 6951], [3210, 7009], [3264, 7186], [3319, 7267], [3463, 7321], [3514, 7320], [3582, 7376], [3583, 7418], [3560, 7478], [3578, 7526], [3644, 7502], [3674, 7454], [3751, 7475], [3745, 7446], [3764, 7382], [3736, 7312], [3745, 7276], [3799, 7252], [3835, 7253], [3825, 7149], [3900, 7090]]] } }, { type: 'Feature', id: 'TR.KH', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.48, 'hc-key': 'tr-kh', 'hc-a2': 'KH', labelrank: '7', hasc: 'TR.KH', 'alt-name': 'Kırşehir', 'woe-id': '2347295', subregion: null, fips: 'TU40', 'postal-code': 'KH', name: 'Kırşehir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.1308', 'woe-name': 'Kırşehir', latitude: '39.3548', 'woe-label': 'Kırşehir, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3751, 7475], [3674, 7454], [3644, 7502], [3578, 7526], [3582, 7550], [3470, 7603], [3361, 7675], [3349, 7716], [3411, 7825], [3501, 7899], [3539, 7960], [3563, 8034], [3652, 8120], [3704, 8099], [3762, 8041], [3832, 8033], [3855, 7987], [3933, 7894], [3986, 7874], [4026, 7820], [3947, 7814], [3969, 7714], [3963, 7668], [3993, 7611], [3970, 7581], [3838, 7516], [3826, 7477], [3836, 7429], [3813, 7423], [3751, 7475]]] } }, { type: 'Feature', id: 'TR.YZ', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.56, 'hc-middle-y': 0.5, 'hc-key': 'tr-yz', 'hc-a2': 'YZ', labelrank: '7', hasc: 'TR.YZ', 'alt-name': 'Yozgat', 'woe-id': '2347317', subregion: null, fips: 'TU66', 'postal-code': 'YZ', name: 'Yozgat', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '35.1328', 'woe-name': 'Yozgat', latitude: '39.5476', 'woe-label': 'Yozgat, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3652, 8120], [3647, 8150], [3639, 8179], [3670, 8195], [3757, 8206], [3863, 8249], [3948, 8236], [4048, 8251], [4130, 8293], [4203, 8284], [4260, 8331], [4265, 8414], [4340, 8428], [4360, 8404], [4441, 8398], [4525, 8327], [4620, 8325], [4717, 8353], [4741, 8331], [4739, 8262], [4768, 8217], [4785, 8165], [4842, 8076], [4827, 8017], [4741, 7936], [4677, 7833], [4632, 7788], [4587, 7721], [4409, 7599], [4322, 7548], [4194, 7565], [4161, 7670], [4116, 7697], [4096, 7747], [4026, 7820], [3986, 7874], [3933, 7894], [3855, 7987], [3832, 8033], [3762, 8041], [3704, 8099], [3652, 8120]]] } }, { type: 'Feature', id: 'TR.AM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.53, 'hc-middle-y': 0.47, 'hc-key': 'tr-am', 'hc-a2': 'AM', labelrank: '7', hasc: 'TR.AM', 'alt-name': 'Amasya', 'woe-id': '2347262', subregion: null, fips: 'TU05', 'postal-code': 'AM', name: 'Amasya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '35.7627', 'woe-name': 'Amasya', latitude: '40.6379', 'woe-label': 'Amasya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4441, 8398], [4360, 8404], [4340, 8428], [4349, 8513], [4395, 8587], [4405, 8666], [4390, 8698], [4320, 8728], [4211, 8752], [4167, 8844], [4174, 8963], [4194, 9038], [4364, 8995], [4398, 9002], [4497, 8934], [4534, 8898], [4670, 8900], [4713, 8881], [4779, 8922], [4803, 8985], [4824, 9000], [4877, 8946], [4937, 8906], [4927, 8865], [4969, 8817], [4920, 8702], [4876, 8690], [4874, 8654], [4780, 8592], [4708, 8626], [4618, 8631], [4536, 8488], [4477, 8463], [4441, 8398]]] } }, { type: 'Feature', id: 'TR.MS', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.36, 'hc-middle-y': 0.62, 'hc-key': 'tr-ms', 'hc-a2': 'MS', labelrank: '7', hasc: 'TR.MS', 'alt-name': 'Muş', 'woe-id': '2347302', subregion: null, fips: 'TU49', 'postal-code': 'MS', name: 'Muş', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '41.9034', 'woe-name': 'Muş', latitude: '38.9124', 'woe-label': 'Muş, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7880, 7427], [7849, 7419], [7818, 7407], [7792, 7429], [7787, 7487], [7714, 7546], [7650, 7648], [7663, 7706], [7698, 7758], [7695, 7818], [7651, 7877], [7628, 7949], [7642, 7995], [7730, 8018], [7776, 8012], [7858, 7952], [7910, 7899], [8008, 7886], [8050, 7921], [8118, 7940], [8179, 7998], [8194, 8093], [8266, 8139], [8319, 8153], [8367, 8072], [8456, 7981], [8467, 7812], [8385, 7752], [8292, 7752], [8200, 7703], [8186, 7657], [8136, 7653], [8128, 7626], [8155, 7569], [8104, 7506], [8066, 7480], [7969, 7478], [7880, 7427]]] } }, { type: 'Feature', id: 'TR.BM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.35, 'hc-key': 'tr-bm', 'hc-a2': 'BM', labelrank: '7', hasc: 'TR.BM', 'alt-name': 'Batman', 'woe-id': '2347326', subregion: null, fips: 'TU76', 'postal-code': 'BM', name: 'Batman', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '41.4262', 'woe-name': 'Batman', latitude: '37.7343', 'woe-label': 'Batman, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7818, 7407], [7849, 7419], [7880, 7427], [7930, 7413], [7975, 7279], [7985, 7194], [7929, 7087], [7865, 7063], [7849, 7028], [7858, 6981], [7925, 6930], [8032, 6898], [8100, 6836], [7941, 6697], [7855, 6671], [7790, 6704], [7742, 6784], [7697, 6831], [7671, 6834], [7643, 6902], [7693, 6970], [7729, 7094], [7715, 7212], [7728, 7321], [7739, 7340], [7824, 7383], [7818, 7407]]] } }, { type: 'Feature', id: 'TR.KA', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.6, 'hc-middle-y': 0.53, 'hc-key': 'tr-ka', 'hc-a2': 'KA', labelrank: '7', hasc: 'TR.KA', 'alt-name': 'Kars', 'woe-id': '2347291', subregion: null, fips: 'TU84', 'postal-code': 'KA', name: 'Kars', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '43.074', 'woe-name': 'Kars', latitude: '40.3671', 'woe-label': 'Kars, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8955, 8678], [8790, 8607], [8775, 8553], [8744, 8562], [8632, 8551], [8467, 8484], [8357, 8493], [8305, 8566], [8241, 8607], [8157, 8624], [8106, 8677], [8119, 8718], [8197, 8753], [8306, 8837], [8284, 8908], [8292, 8959], [8419, 8992], [8428, 9189], [8490, 9231], [8744, 9382], [8763, 9322], [8847, 9289], [8921, 9165], [8940, 9091], [8911, 8979], [8868, 8927], [8906, 8899], [8895, 8843], [8947, 8791], [8981, 8724], [8946, 8698], [8955, 8678]]] } }, { type: 'Feature', id: 'TR.IG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.51, 'hc-key': 'tr-ig', 'hc-a2': 'IG', labelrank: '7', hasc: 'TR.IG', 'alt-name': 'Iğdır', 'woe-id': '20070183', subregion: null, fips: 'TU88', 'postal-code': 'IG', name: 'Iğdır', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '44.0317', 'woe-name': 'Iğdır', latitude: '39.811', 'woe-label': 'Iğdır, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8775, 8553], [8790, 8607], [8955, 8678], [9100, 8632], [9168, 8629], [9288, 8670], [9328, 8669], [9411, 8634], [9478, 8570], [9549, 8523], [9599, 8475], [9633, 8419], [9487, 8492], [9434, 8436], [9439, 8395], [9406, 8404], [9309, 8368], [9222, 8376], [9115, 8364], [9105, 8384], [9016, 8405], [8982, 8450], [8904, 8473], [8836, 8424], [8806, 8436], [8775, 8553]]] } }, { type: 'Feature', id: 'TR.DU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.4, 'hc-middle-y': 0.48, 'hc-key': 'tr-du', 'hc-a2': 'DU', labelrank: '7', hasc: 'TR.DU', 'alt-name': 'Düzce', 'woe-id': '29390030', subregion: null, fips: 'TU93', 'postal-code': 'DU', name: 'Düzce', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '31.3231', 'woe-name': null, latitude: '40.8631', 'woe-label': 'Düzce, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1943, 9034], [2093, 9038], [2156, 9079], [2177, 9059], [2269, 9011], [2402, 8997], [2391, 8934], [2364, 8903], [2243, 8881], [2216, 8861], [2192, 8772], [2149, 8740], [2096, 8736], [2035, 8763], [1946, 8762], [1901, 8779], [1905, 8879], [1893, 8920], [1945, 8991], [1943, 9034]]] } }, { type: 'Feature', id: 'TR.ZO', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.58, 'hc-middle-y': 0.57, 'hc-key': 'tr-zo', 'hc-a2': 'ZO', labelrank: '7', hasc: 'TR.ZO', 'alt-name': 'Zonguldak', 'woe-id': '20070185', subregion: null, fips: 'TU85', 'postal-code': 'ZO', name: 'Zonguldak', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '31.8206', 'woe-name': 'Zonguldak', latitude: '41.2481', 'woe-label': 'Zonguldak, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2669, 9202], [2620, 9138], [2593, 9042], [2592, 8978], [2475, 8983], [2402, 8997], [2269, 9011], [2177, 9059], [2156, 9079], [2187, 9116], [2190, 9198], [2329, 9254], [2445, 9329], [2537, 9379], [2588, 9396], [2651, 9350], [2681, 9263], [2669, 9202]]] } }, { type: 'Feature', id: 'TR.KB', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.48, 'hc-middle-y': 0.54, 'hc-key': 'tr-kb', 'hc-a2': 'KB', labelrank: '7', hasc: 'TR.KB', 'alt-name': 'Karabük', 'woe-id': '20070186', subregion: null, fips: 'TU89', 'postal-code': 'KB', name: 'Karabük', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '32.5067', 'woe-name': 'Karabük', latitude: '41.2347', 'woe-label': 'Karabük, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2592, 8978], [2593, 9042], [2620, 9138], [2669, 9202], [2728, 9198], [2785, 9213], [2851, 9267], [2876, 9320], [2906, 9328], [2958, 9377], [2976, 9356], [3049, 9375], [3088, 9346], [3119, 9247], [3065, 9236], [3012, 9174], [3018, 9072], [3077, 9055], [3094, 9029], [3070, 8970], [3018, 8941], [2965, 8947], [2919, 8888], [2854, 8837], [2797, 8811], [2779, 8868], [2662, 8927], [2666, 8966], [2592, 8978]]] } }, { type: 'Feature', id: 'TR.YL', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.27, 'hc-key': 'tr-yl', 'hc-a2': 'YL', labelrank: '7', hasc: 'TR.YL', 'alt-name': 'Yalova', 'woe-id': '20070182', subregion: null, fips: 'TU92', 'postal-code': 'YL', name: 'Yalova', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.2036', 'woe-name': 'Yalova', latitude: '40.6154', 'woe-label': 'Yalova, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1097, 8715], [1091, 8688], [1057, 8696], [1020, 8661], [985, 8655], [903, 8696], [848, 8705], [846, 8627], [811, 8633], [735, 8674], [746, 8696], [855, 8757], [1018, 8765], [1080, 8792], [1099, 8779], [1097, 8715]]] } }, { type: 'Feature', id: 'TR.SK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.59, 'hc-middle-y': 0.53, 'hc-key': 'tr-sk', 'hc-a2': 'SK', labelrank: '7', hasc: 'TR.SK', 'alt-name': 'Sakarya', 'woe-id': '2347306', subregion: null, fips: 'TU54', 'postal-code': 'SK', name: 'Sakarya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.4439', 'woe-name': 'Sakarya', latitude: '40.6596', 'woe-label': 'Sakarya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1943, 9034], [1945, 8991], [1893, 8920], [1905, 8879], [1901, 8779], [1866, 8753], [1863, 8686], [1789, 8672], [1734, 8583], [1759, 8524], [1748, 8498], [1678, 8506], [1640, 8547], [1574, 8552], [1498, 8534], [1450, 8551], [1409, 8593], [1376, 8655], [1371, 8671], [1369, 8687], [1407, 8689], [1512, 8732], [1535, 8776], [1561, 8883], [1597, 8920], [1590, 8949], [1669, 8936], [1684, 9006], [1644, 9014], [1636, 9051], [1658, 9105], [1804, 9066], [1830, 9044], [1943, 9034]]] } }, { type: 'Feature', id: 'TR.CI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.6, 'hc-middle-y': 0.55, 'hc-key': 'tr-ci', 'hc-a2': 'CI', labelrank: '7', hasc: 'TR.CI', 'alt-name': 'Çankırı', 'woe-id': '2347275', subregion: null, fips: 'TU82', 'postal-code': 'CI', name: 'Çankırı', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.2142', 'woe-name': 'Çankırı', latitude: '40.7087', 'woe-label': 'Çankırı, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2786, 8751], [2795, 8790], [2797, 8811], [2854, 8837], [2919, 8888], [2965, 8947], [3018, 8941], [3070, 8970], [3094, 9029], [3114, 9006], [3184, 8998], [3279, 8934], [3357, 8976], [3399, 8984], [3487, 9032], [3520, 9006], [3483, 8945], [3504, 8910], [3572, 8870], [3617, 8865], [3645, 8820], [3628, 8763], [3655, 8628], [3689, 8551], [3652, 8469], [3588, 8436], [3536, 8441], [3384, 8488], [3275, 8528], [3246, 8486], [3206, 8481], [3169, 8509], [3151, 8552], [3080, 8603], [3033, 8670], [2873, 8745], [2786, 8751]]] } }, { type: 'Feature', id: 'TR.BL', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.62, 'hc-middle-y': 0.47, 'hc-key': 'tr-bl', 'hc-a2': 'BL', labelrank: '7', hasc: 'TR.BL', 'alt-name': 'Bolu', 'woe-id': '2347271', subregion: null, fips: 'TU14', 'postal-code': 'BL', name: 'Bolu', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '31.6806', 'woe-name': 'Bolu', latitude: '40.5854', 'woe-label': 'Bolu, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2797, 8811], [2795, 8790], [2786, 8751], [2751, 8728], [2748, 8689], [2769, 8631], [2724, 8566], [2679, 8543], [2603, 8555], [2557, 8532], [2407, 8490], [2317, 8490], [2267, 8471], [2204, 8489], [2186, 8509], [2093, 8501], [1994, 8550], [1957, 8429], [1911, 8404], [1876, 8359], [1840, 8366], [1807, 8379], [1755, 8466], [1748, 8498], [1759, 8524], [1734, 8583], [1789, 8672], [1863, 8686], [1866, 8753], [1901, 8779], [1946, 8762], [2035, 8763], [2096, 8736], [2149, 8740], [2192, 8772], [2216, 8861], [2243, 8881], [2364, 8903], [2391, 8934], [2402, 8997], [2475, 8983], [2592, 8978], [2666, 8966], [2662, 8927], [2779, 8868], [2797, 8811]]] } }, { type: 'Feature', id: 'TR.ED', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.74, 'hc-key': 'tr-ed', 'hc-a2': 'ED', labelrank: '7', hasc: 'TR.ED', 'alt-name': 'Edirne', 'woe-id': '2347279', subregion: null, fips: 'TU22', 'postal-code': 'ED', name: 'Edirne', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '26.4697', 'woe-name': 'Edirne', latitude: '40.9579', 'woe-label': 'Edirne, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[-347, 8885], [-347, 8883], [-354, 8838], [-449, 8830], [-508, 8805], [-540, 8822], [-619, 8815], [-743, 8832], [-760, 8923], [-702, 8942], [-655, 8996], [-645, 9033], [-568, 9075], [-582, 9190], [-567, 9284], [-533, 9285], [-449, 9346], [-422, 9328], [-395, 9361], [-405, 9532], [-416, 9517], [-474, 9563], [-466, 9582], [-541, 9615], [-536, 9670], [-512, 9688], [-431, 9687], [-414, 9760], [-370, 9787], [-310, 9776], [-255, 9783], [-235, 9629], [-234, 9559], [-251, 9490], [-317, 9354], [-303, 9320], [-301, 9206], [-342, 9131], [-375, 9039], [-375, 8980], [-347, 8885]]] } }, { type: 'Feature', id: 'TR.ES', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.55, 'hc-key': 'tr-es', 'hc-a2': 'ES', labelrank: '7', hasc: 'TR.ES', 'alt-name': 'Eskişehir', 'woe-id': '2347283', subregion: null, fips: 'TU26', 'postal-code': 'ES', name: 'Eskişehir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '31.0894', 'woe-name': 'Eskişehir', latitude: '39.6297', 'woe-label': 'Eskişehir, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1807, 8379], [1840, 8366], [1876, 8359], [1899, 8328], [1906, 8270], [1942, 8267], [1995, 8288], [2055, 8270], [2087, 8293], [2165, 8291], [2188, 8267], [2352, 8264], [2381, 8168], [2416, 8157], [2435, 8111], [2412, 8085], [2442, 7973], [2470, 7948], [2494, 7883], [2488, 7777], [2521, 7724], [2496, 7693], [2418, 7650], [2403, 7597], [2326, 7595], [2261, 7602], [2188, 7596], [2147, 7629], [2120, 7692], [2082, 7735], [1914, 7647], [1863, 7689], [1806, 7640], [1722, 7603], [1679, 7631], [1659, 7670], [1624, 7691], [1615, 7737], [1561, 7813], [1542, 7912], [1462, 8008], [1520, 8084], [1528, 8158], [1579, 8207], [1637, 8217], [1686, 8270], [1705, 8343], [1751, 8378], [1807, 8379]]] } }, { type: 'Feature', id: 'TR.KO', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.35, 'hc-middle-y': 0.42, 'hc-key': 'tr-ko', 'hc-a2': 'KO', labelrank: '7', hasc: 'TR.KO', 'alt-name': 'Konya', 'woe-id': '2347321', subregion: null, fips: 'TU71', 'postal-code': 'KO', name: 'Konya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '32.469', 'woe-name': 'Konya', latitude: '38.04', 'woe-label': 'Konya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2326, 7595], [2403, 7597], [2418, 7650], [2467, 7624], [2566, 7550], [2653, 7570], [2763, 7522], [2832, 7565], [2874, 7547], [2978, 7636], [3061, 7598], [3091, 7683], [3115, 7683], [3236, 7609], [3266, 7539], [3262, 7378], [3319, 7267], [3264, 7186], [3210, 7009], [3206, 6951], [3241, 6882], [3254, 6825], [3316, 6756], [3409, 6770], [3542, 6775], [3674, 6815], [3716, 6809], [3744, 6743], [3798, 6719], [3882, 6606], [3889, 6565], [3854, 6493], [3852, 6440], [3924, 6344], [3918, 6321], [3835, 6268], [3753, 6233], [3718, 6199], [3664, 6292], [3517, 6448], [3501, 6540], [3421, 6551], [3351, 6474], [3292, 6452], [3118, 6436], [3064, 6414], [2966, 6305], [2842, 6140], [2831, 6067], [2900, 6048], [2907, 6007], [2806, 5899], [2741, 5850], [2745, 5899], [2724, 5964], [2655, 5981], [2666, 6055], [2625, 6076], [2553, 6141], [2499, 6208], [2375, 6303], [2228, 6335], [2146, 6347], [2099, 6396], [2121, 6479], [2100, 6552], [2144, 6582], [2171, 6653], [2159, 6766], [2172, 6813], [2268, 6861], [2272, 6884], [2161, 6982], [2083, 7064], [2068, 7117], [2169, 7181], [2263, 7289], [2272, 7372], [2334, 7476], [2312, 7529], [2326, 7595]]] } }, { type: 'Feature', id: 'TR.BU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.5, 'hc-key': 'tr-bu', 'hc-a2': 'BU', labelrank: '7', hasc: 'TR.BU', 'alt-name': 'Bursa', 'woe-id': '2347273', subregion: null, fips: 'TU16', 'postal-code': 'BU', name: 'Bursa', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.0593', 'woe-name': 'Bursa', latitude: '40.1314', 'woe-label': 'Bursa, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1369, 8687], [1371, 8671], [1376, 8655], [1323, 8620], [1294, 8542], [1310, 8483], [1244, 8409], [1226, 8302], [1267, 8247], [1274, 8211], [1215, 8209], [1146, 8201], [1089, 8226], [1060, 8208], [1011, 8081], [984, 8063], [965, 7983], [934, 7965], [831, 7980], [810, 7997], [781, 8021], [707, 8023], [670, 8057], [653, 8131], [625, 8113], [581, 8121], [440, 8236], [424, 8310], [386, 8351], [357, 8427], [380, 8478], [355, 8531], [419, 8601], [572, 8594], [654, 8564], [729, 8588], [830, 8555], [890, 8561], [905, 8597], [939, 8601], [894, 8637], [846, 8627], [848, 8705], [903, 8696], [985, 8655], [1020, 8661], [1057, 8696], [1091, 8688], [1154, 8677], [1295, 8717], [1369, 8687]]] } }, { type: 'Feature', id: 'TR.KL', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.49, 'hc-key': 'tr-kl', 'hc-a2': 'KL', labelrank: '7', hasc: 'TR.KL', 'alt-name': 'Kırklareli', 'woe-id': '2347294', subregion: null, fips: 'TU39', 'postal-code': 'KL', name: 'Kırklareli', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.4916', 'woe-name': 'Kırklareli', latitude: '41.6201', 'woe-label': 'Kırklareli, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[461, 9423], [435, 9390], [434, 9390], [244, 9379], [130, 9355], [80, 9280], [12, 9251], [-68, 9329], [-220, 9332], [-303, 9320], [-317, 9354], [-251, 9490], [-234, 9559], [-235, 9629], [-255, 9783], [-200, 9795], [-151, 9847], [-70, 9830], [-15, 9851], [58, 9761], [123, 9704], [159, 9740], [221, 9746], [255, 9726], [267, 9762], [379, 9740], [390, 9680], [354, 9680], [348, 9633], [405, 9525], [401, 9502], [461, 9423]]] } }, { type: 'Feature', id: 'TR.IB', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.27, 'hc-middle-y': 0.55, 'hc-key': 'tr-ib', 'hc-a2': 'IB', labelrank: '7', hasc: 'TR.IB', 'alt-name': 'İstanbul', 'woe-id': '2347289', subregion: null, fips: 'TU34', 'postal-code': 'IB', name: 'İstanbul', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '28.8463', 'woe-name': 'İstanbul', latitude: '41.1285', 'woe-label': 'İstanbul, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[434, 9390], [435, 9390], [461, 9423], [556, 9351], [671, 9294], [834, 9206], [942, 9179], [926, 9131], [952, 9161], [1008, 9180], [1217, 9127], [1349, 9102], [1355, 9050], [1339, 9014], [1240, 8966], [1225, 8932], [1190, 8945], [1149, 9004], [1121, 9008], [1009, 8916], [951, 8947], [889, 8998], [880, 9034], [911, 9065], [915, 9100], [865, 9014], [842, 9018], [776, 8989], [735, 9004], [653, 9007], [644, 9071], [624, 9017], [582, 9050], [461, 9094], [428, 9093], [419, 9189], [448, 9290], [434, 9390]]] } }, { type: 'Feature', id: 'TR.KR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.39, 'hc-key': 'tr-kr', 'hc-a2': 'KR', labelrank: '7', hasc: 'TR.KR', 'alt-name': 'Karaman', 'woe-id': '2347328', subregion: null, fips: 'TU78', 'postal-code': 'KR', name: 'Karaman', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.3026', 'woe-name': 'Karaman', latitude: '37.2262', 'woe-label': 'Karaman, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2854, 5680], [2784, 5749], [2741, 5850], [2806, 5899], [2907, 6007], [2900, 6048], [2831, 6067], [2842, 6140], [2966, 6305], [3064, 6414], [3118, 6436], [3292, 6452], [3351, 6474], [3421, 6551], [3501, 6540], [3517, 6448], [3664, 6292], [3718, 6199], [3613, 6170], [3558, 6128], [3481, 6106], [3413, 6108], [3368, 6090], [3271, 6076], [3172, 6003], [3153, 5950], [3118, 5973], [3044, 5943], [3081, 5849], [3149, 5810], [3190, 5768], [3175, 5749], [3115, 5763], [3086, 5700], [3032, 5699], [2964, 5676], [2854, 5680]]] } }, { type: 'Feature', id: 'TR.AL', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.26, 'hc-middle-y': 0.48, 'hc-key': 'tr-al', 'hc-a2': 'AL', labelrank: '7', hasc: 'TR.AL', 'alt-name': 'Antalya', 'woe-id': '2347264', subregion: null, fips: 'TU07', 'postal-code': 'AL', name: 'Antalya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.9564', 'woe-name': 'Antalya', latitude: '37.1141', 'woe-label': 'Antalya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2741, 5850], [2784, 5749], [2854, 5680], [2851, 5559], [2806, 5433], [2772, 5440], [2686, 5494], [2638, 5547], [2635, 5573], [2586, 5624], [2535, 5717], [2491, 5758], [2370, 5793], [2324, 5831], [2134, 5921], [2096, 5955], [1865, 5994], [1770, 5991], [1719, 6022], [1669, 5985], [1650, 5945], [1640, 5828], [1645, 5762], [1616, 5735], [1588, 5673], [1613, 5629], [1540, 5533], [1541, 5563], [1458, 5609], [1402, 5604], [1393, 5572], [1301, 5549], [1256, 5549], [1153, 5485], [1175, 5510], [1135, 5511], [1114, 5487], [1075, 5548], [1013, 5553], [966, 5596], [933, 5574], [879, 5618], [906, 5640], [942, 5738], [1010, 5749], [1013, 5788], [1070, 5831], [1075, 5915], [1143, 6056], [1176, 6066], [1231, 6141], [1242, 6195], [1275, 6237], [1380, 6287], [1502, 6326], [1536, 6320], [1584, 6270], [1782, 6268], [1829, 6336], [1871, 6370], [1921, 6349], [2012, 6372], [2068, 6401], [2099, 6396], [2146, 6347], [2228, 6335], [2375, 6303], [2499, 6208], [2553, 6141], [2625, 6076], [2666, 6055], [2655, 5981], [2724, 5964], [2745, 5899], [2741, 5850]]] } }, { type: 'Feature', id: 'TR.AF', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.56, 'hc-middle-y': 0.33, 'hc-key': 'tr-af', 'hc-a2': 'AF', labelrank: '7', hasc: 'TR.AF', 'alt-name': 'Afyon', 'woe-id': '2347260', subregion: null, fips: 'TU03', 'postal-code': 'AF', name: 'Afyonkarahisar', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.6938', 'woe-name': 'Afyon', latitude: '38.6784', 'woe-label': 'Afyonkarahisar, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1352, 6670], [1301, 6675], [1254, 6661], [1230, 6706], [1153, 6732], [1156, 6805], [1359, 6950], [1368, 7016], [1297, 7139], [1219, 7160], [1253, 7253], [1288, 7285], [1301, 7342], [1421, 7408], [1462, 7465], [1516, 7604], [1583, 7632], [1624, 7691], [1659, 7670], [1679, 7631], [1722, 7603], [1806, 7640], [1863, 7689], [1914, 7647], [2082, 7735], [2120, 7692], [2147, 7629], [2188, 7596], [2261, 7602], [2326, 7595], [2312, 7529], [2334, 7476], [2272, 7372], [2263, 7289], [2169, 7181], [2068, 7117], [1982, 7185], [1870, 7090], [1798, 7018], [1730, 7000], [1654, 6961], [1595, 6904], [1467, 6800], [1458, 6725], [1438, 6691], [1352, 6670]]] } }, { type: 'Feature', id: 'TR.BD', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.4, 'hc-key': 'tr-bd', 'hc-a2': 'BD', labelrank: '7', hasc: 'TR.BD', 'alt-name': 'Burdur', 'woe-id': '2347272', subregion: null, fips: 'TU15', 'postal-code': 'BD', name: 'Burdur', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.1627', 'woe-name': 'Burdur', latitude: '37.5001', 'woe-label': 'Burdur, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1254, 6661], [1301, 6675], [1352, 6670], [1369, 6624], [1412, 6625], [1537, 6714], [1635, 6613], [1711, 6604], [1744, 6582], [1777, 6489], [1825, 6410], [1851, 6408], [1871, 6370], [1829, 6336], [1782, 6268], [1584, 6270], [1536, 6320], [1502, 6326], [1380, 6287], [1275, 6237], [1242, 6195], [1231, 6141], [1176, 6066], [1143, 6056], [1097, 6125], [1027, 6118], [998, 6085], [976, 6094], [975, 6173], [992, 6249], [1096, 6414], [1076, 6467], [1074, 6535], [1148, 6571], [1163, 6603], [1254, 6661]]] } }, { type: 'Feature', id: 'TR.IP', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.57, 'hc-middle-y': 0.54, 'hc-key': 'tr-ip', 'hc-a2': 'IP', labelrank: '7', hasc: 'TR.IP', 'alt-name': 'Isparta', 'woe-id': '2347288', subregion: null, fips: 'TU33', 'postal-code': 'IP', name: 'Isparta', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.818', 'woe-name': 'Isparta', latitude: '37.8923', 'woe-label': 'Isparta, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2099, 6396], [2068, 6401], [2012, 6372], [1921, 6349], [1871, 6370], [1851, 6408], [1825, 6410], [1777, 6489], [1744, 6582], [1711, 6604], [1635, 6613], [1537, 6714], [1412, 6625], [1369, 6624], [1352, 6670], [1438, 6691], [1458, 6725], [1467, 6800], [1595, 6904], [1654, 6961], [1730, 7000], [1798, 7018], [1870, 7090], [1982, 7185], [2068, 7117], [2083, 7064], [2161, 6982], [2272, 6884], [2268, 6861], [2172, 6813], [2159, 6766], [2171, 6653], [2144, 6582], [2100, 6552], [2121, 6479], [2099, 6396]]] } }, { type: 'Feature', id: 'TR.AY', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.62, 'hc-middle-y': 0.49, 'hc-key': 'tr-ay', 'hc-a2': 'AY', labelrank: '7', hasc: 'TR.AY', 'alt-name': 'Aydın', 'woe-id': '2347266', subregion: null, fips: 'TU09', 'postal-code': 'AY', name: 'Aydın', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.9573', 'woe-name': 'Aydın', latitude: '37.7292', 'woe-label': 'Aydın, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[533, 6940], [610, 6935], [653, 6879], [664, 6789], [643, 6747], [674, 6691], [710, 6682], [712, 6646], [672, 6634], [612, 6570], [527, 6568], [514, 6542], [538, 6486], [464, 6500], [388, 6557], [347, 6568], [269, 6492], [159, 6494], [136, 6508], [57, 6510], [18, 6540], [-69, 6574], [-107, 6565], [-157, 6476], [-201, 6435], [-250, 6427], [-269, 6443], [-258, 6529], [-284, 6523], [-260, 6616], [-370, 6672], [-303, 6685], [-230, 6720], [-217, 6824], [-131, 6837], [-59, 6879], [-29, 6882], [110, 6863], [244, 6891], [354, 6887], [533, 6940]]] } }, { type: 'Feature', id: 'TR.MN', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.55, 'hc-middle-y': 0.53, 'hc-key': 'tr-mn', 'hc-a2': 'MN', labelrank: '7', hasc: 'TR.MN', 'alt-name': 'Manisa', 'woe-id': '2347299', subregion: null, fips: 'TU45', 'postal-code': 'MN', name: 'Manisa', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '28.1324', 'woe-name': 'Manisa', latitude: '38.7115', 'woe-label': 'Manisa, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[610, 6935], [533, 6940], [474, 7075], [406, 7106], [313, 7097], [278, 7161], [190, 7175], [165, 7129], [136, 7124], [99, 7193], [19, 7246], [-5, 7304], [-119, 7315], [-151, 7346], [-163, 7396], [-198, 7435], [-147, 7515], [-133, 7568], [-65, 7600], [-10, 7645], [-3, 7682], [-30, 7749], [-61, 7893], [-17, 7913], [70, 7864], [190, 7852], [202, 7829], [176, 7775], [240, 7776], [295, 7708], [321, 7642], [395, 7643], [433, 7674], [522, 7680], [575, 7704], [624, 7694], [662, 7652], [761, 7617], [803, 7535], [796, 7491], [824, 7422], [819, 7377], [712, 7288], [740, 7240], [744, 7172], [730, 7116], [696, 7075], [747, 7038], [694, 7028], [660, 6944], [610, 6935]]] } }, { type: 'Feature', id: 'TR.DY', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.62, 'hc-middle-y': 0.47, 'hc-key': 'tr-dy', 'hc-a2': 'DY', labelrank: '7', hasc: 'TR.DY', 'alt-name': 'Diyarbakır', 'woe-id': '2347278', subregion: null, fips: 'TU21', 'postal-code': 'DY', name: 'Diyarbakır', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.2706', 'woe-name': 'Diyarbakır', latitude: '38.0261', 'woe-label': 'Diyarbakır, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6579, 6952], [6612, 7034], [6590, 7070], [6529, 7057], [6544, 7124], [6522, 7165], [6599, 7184], [6696, 7175], [6777, 7207], [6864, 7214], [6899, 7235], [6930, 7306], [6998, 7291], [7188, 7311], [7254, 7319], [7288, 7356], [7289, 7398], [7374, 7429], [7520, 7428], [7714, 7546], [7787, 7487], [7792, 7429], [7818, 7407], [7824, 7383], [7739, 7340], [7728, 7321], [7715, 7212], [7729, 7094], [7693, 6970], [7643, 6902], [7671, 6834], [7637, 6814], [7436, 6802], [7374, 6784], [7344, 6728], [7298, 6721], [7128, 6580], [7077, 6504], [7048, 6532], [7001, 6624], [6979, 6709], [6977, 6788], [6914, 6830], [6904, 6811], [6815, 6852], [6738, 6915], [6625, 6930], [6579, 6952]]] } }, { type: 'Feature', id: 'TR.AD', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.55, 'hc-middle-y': 0.48, 'hc-key': 'tr-ad', 'hc-a2': 'AD', labelrank: '7', hasc: 'TR.AD', 'alt-name': 'Adıyaman', 'woe-id': '2347259', subregion: null, fips: 'TU02', 'postal-code': 'AD', name: 'Adıyaman', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '38.339', 'woe-name': 'Adıyaman', latitude: '37.8102', 'woe-label': 'Adıyaman, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6529, 7057], [6590, 7070], [6612, 7034], [6579, 6952], [6508, 6907], [6505, 6872], [6465, 6845], [6464, 6740], [6422, 6723], [6442, 6704], [6373, 6688], [6414, 6658], [6288, 6630], [6218, 6544], [6080, 6511], [6033, 6463], [5979, 6489], [5948, 6482], [5900, 6519], [5832, 6541], [5707, 6522], [5608, 6569], [5585, 6643], [5662, 6738], [5844, 6791], [5893, 6782], [5980, 6815], [6013, 6849], [6025, 6916], [6068, 6942], [6140, 7048], [6213, 7063], [6250, 7035], [6223, 6989], [6277, 6972], [6357, 6972], [6429, 6988], [6506, 7025], [6529, 7057]]] } }, { type: 'Feature', id: 'TR.KM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.54, 'hc-key': 'tr-km', 'hc-a2': 'KM', labelrank: '7', hasc: 'TR.KM', 'alt-name': 'Kahramanmaraş', 'woe-id': '2347300', subregion: null, fips: 'TU46', 'postal-code': 'KM', name: 'Kahramanmaraş', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.0013', 'woe-name': 'Kahramanmaraş', latitude: '37.9278', 'woe-label': 'Kahramanmaraş, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5662, 6738], [5585, 6643], [5608, 6569], [5707, 6522], [5706, 6447], [5682, 6430], [5610, 6422], [5432, 6359], [5382, 6301], [5337, 6314], [5318, 6377], [5290, 6394], [5264, 6356], [5196, 6321], [5169, 6357], [5094, 6403], [4953, 6368], [4929, 6396], [4902, 6480], [4934, 6542], [4932, 6598], [4976, 6645], [4952, 6774], [4996, 6997], [5043, 7073], [5121, 7175], [5154, 7265], [5172, 7278], [5246, 7299], [5349, 7277], [5475, 7294], [5445, 7237], [5453, 7195], [5495, 7202], [5580, 7188], [5654, 7149], [5739, 7121], [5769, 7074], [5738, 6938], [5708, 6889], [5684, 6782], [5662, 6738]]] } }, { type: 'Feature', id: 'TR.KY', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.45, 'hc-middle-y': 0.38, 'hc-key': 'tr-ky', 'hc-a2': 'KY', labelrank: '7', hasc: 'TR.KY', 'alt-name': 'Kayseri', 'woe-id': '2347293', subregion: null, fips: 'TU38', 'postal-code': 'KY', name: 'Kayseri', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '35.9256', 'woe-name': 'Kayseri', latitude: '38.7168', 'woe-label': 'Kayseri, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5172, 7278], [5154, 7265], [5121, 7175], [5043, 7073], [4980, 7167], [4950, 7179], [4904, 7165], [4837, 7118], [4815, 7057], [4749, 6942], [4542, 6791], [4558, 6659], [4528, 6644], [4405, 6682], [4306, 6687], [4317, 6768], [4343, 6786], [4324, 6836], [4325, 6898], [4309, 6945], [4217, 6944], [4183, 6979], [4141, 7087], [4226, 7224], [4223, 7324], [4155, 7425], [4194, 7565], [4322, 7548], [4409, 7599], [4587, 7721], [4632, 7788], [4689, 7774], [4798, 7701], [4854, 7695], [4896, 7712], [4989, 7702], [5046, 7673], [5096, 7692], [5196, 7688], [5242, 7666], [5265, 7602], [5223, 7479], [5172, 7278]]] } }, { type: 'Feature', id: 'TR.EG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.38, 'hc-middle-y': 0.7, 'hc-key': 'tr-eg', 'hc-a2': 'EG', labelrank: '7', hasc: 'TR.EG', 'alt-name': 'Elazığ', 'woe-id': '2347280', subregion: null, fips: 'TU23', 'postal-code': 'EG', name: 'Elazığ', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.3702', 'woe-name': 'Elazığ', latitude: '38.5718', 'woe-label': 'Elazığ, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6250, 7639], [6264, 7648], [6281, 7652], [6305, 7621], [6301, 7561], [6327, 7539], [6430, 7560], [6560, 7540], [6706, 7482], [6735, 7515], [6829, 7528], [6880, 7553], [6912, 7593], [6930, 7659], [6917, 7712], [6934, 7732], [6991, 7745], [7115, 7824], [7178, 7856], [7198, 7823], [7153, 7733], [7146, 7682], [7164, 7627], [7213, 7565], [7198, 7490], [7161, 7497], [7141, 7418], [7174, 7376], [7188, 7311], [6998, 7291], [6930, 7306], [6899, 7235], [6864, 7214], [6777, 7207], [6696, 7175], [6599, 7184], [6522, 7165], [6453, 7148], [6391, 7172], [6345, 7224], [6277, 7206], [6206, 7233], [6157, 7238], [6094, 7278], [6077, 7320], [6104, 7378], [6136, 7393], [6161, 7441], [6223, 7439], [6231, 7464], [6217, 7545], [6198, 7584], [6210, 7635], [6250, 7639]]] } }, { type: 'Feature', id: 'TR.IC', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.47, 'hc-middle-y': 0.54, 'hc-key': 'tr-ic', 'hc-a2': 'IC', labelrank: '6', hasc: 'TR.IC', 'alt-name': 'Mersin', 'woe-id': '2347287', subregion: null, fips: 'TU32', 'postal-code': 'IC', name: 'Mersin', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.8268', 'woe-name': 'Mersin', latitude: '36.6614', 'woe-label': 'Mersin, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4175, 5899], [4080, 5961], [4035, 5959], [3956, 5924], [3876, 5848], [3796, 5792], [3740, 5709], [3682, 5666], [3683, 5605], [3638, 5586], [3615, 5521], [3598, 5576], [3563, 5593], [3522, 5533], [3489, 5520], [3456, 5469], [3433, 5504], [3378, 5457], [3323, 5479], [3281, 5464], [3134, 5460], [3107, 5424], [3022, 5439], [2941, 5384], [2864, 5399], [2806, 5433], [2851, 5559], [2854, 5680], [2964, 5676], [3032, 5699], [3086, 5700], [3115, 5763], [3175, 5749], [3190, 5768], [3149, 5810], [3081, 5849], [3044, 5943], [3118, 5973], [3153, 5950], [3172, 6003], [3271, 6076], [3368, 6090], [3413, 6108], [3481, 6106], [3558, 6128], [3613, 6170], [3718, 6199], [3753, 6233], [3835, 6268], [3918, 6321], [3924, 6344], [3968, 6346], [4044, 6382], [4084, 6373], [4126, 6291], [4154, 6270], [4171, 6155], [4234, 6138], [4257, 6116], [4241, 6070], [4252, 5950], [4175, 5899]]] } }, { type: 'Feature', id: 'TR.SP', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.54, 'hc-middle-y': 0.55, 'hc-key': 'tr-sp', 'hc-a2': 'SP', labelrank: '7', hasc: 'TR.SP', 'alt-name': 'Sinop', 'woe-id': '2347308', subregion: null, fips: 'TU57', 'postal-code': 'SP', name: 'Sinop', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.8226', 'woe-name': 'Sinop', latitude: '41.5894', 'woe-label': 'Sinop, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3709, 9658], [3772, 9650], [3853, 9671], [3895, 9655], [3967, 9652], [4022, 9665], [4070, 9699], [4101, 9765], [4141, 9761], [4204, 9710], [4181, 9657], [4255, 9526], [4296, 9493], [4352, 9478], [4406, 9443], [4386, 9394], [4395, 9281], [4416, 9186], [4303, 9164], [4217, 9222], [4196, 9253], [4106, 9203], [4081, 9167], [4055, 9118], [3993, 9136], [3963, 9162], [3870, 9175], [3855, 9193], [3858, 9287], [3848, 9314], [3863, 9367], [3895, 9395], [3913, 9443], [3883, 9483], [3847, 9492], [3706, 9505], [3671, 9518], [3713, 9617], [3709, 9658]]] } }, { type: 'Feature', id: 'TR.AV', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.51, 'hc-middle-y': 0.38, 'hc-key': 'tr-av', 'hc-a2': 'AV', labelrank: '6', hasc: 'TR.AV', 'alt-name': 'Artvin', 'woe-id': '2347265', subregion: null, fips: 'TU08', 'postal-code': 'AV', name: 'Artvin', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '41.8331', 'woe-name': 'Artvin', latitude: '41.0175', 'woe-label': 'Artvin, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7509, 9390], [7552, 9432], [7607, 9456], [7628, 9511], [7668, 9560], [7728, 9542], [7769, 9552], [7833, 9510], [7900, 9578], [7941, 9567], [8015, 9586], [8179, 9553], [8198, 9483], [8246, 9386], [8237, 9335], [8194, 9307], [8152, 9250], [8125, 9178], [7987, 9154], [7953, 9126], [7956, 9066], [7925, 9011], [7920, 8949], [7899, 8909], [7805, 8938], [7763, 8922], [7671, 8863], [7630, 8892], [7637, 9005], [7548, 9014], [7503, 9034], [7508, 9064], [7626, 9237], [7548, 9300], [7509, 9390]]] } }, { type: 'Feature', id: 'TR.RI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.53, 'hc-key': 'tr-ri', 'hc-a2': 'RI', labelrank: '7', hasc: 'TR.RI', 'alt-name': 'Rize', 'woe-id': '2347305', subregion: null, fips: 'TU53', 'postal-code': 'RI', name: 'Rize', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.8691', 'woe-name': 'Rize', latitude: '40.9466', 'woe-label': 'Rize, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7067, 9127], [7125, 9173], [7176, 9172], [7249, 9218], [7313, 9297], [7352, 9293], [7417, 9325], [7467, 9375], [7509, 9390], [7548, 9300], [7626, 9237], [7508, 9064], [7503, 9034], [7409, 8950], [7344, 8928], [7331, 8885], [7255, 8860], [7170, 8808], [7161, 8902], [7119, 8987], [7108, 9037], [7067, 9127]]] } }, { type: 'Feature', id: 'TR.TB', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.5, 'hc-middle-y': 0.53, 'hc-key': 'tr-tb', 'hc-a2': 'TB', labelrank: '7', hasc: 'TR.TB', 'alt-name': 'Trabzon', 'woe-id': '2347312', subregion: null, fips: 'TU61', 'postal-code': 'TB', name: 'Trabzon', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.8034', 'woe-name': 'Trabzon', latitude: '40.7988', 'woe-label': 'Trabzon, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6406, 9133], [6475, 9122], [6557, 9173], [6592, 9167], [6650, 9116], [6694, 9103], [6726, 9116], [6799, 9084], [6875, 9103], [6948, 9064], [7067, 9127], [7108, 9037], [7119, 8987], [7161, 8902], [7170, 8808], [7004, 8771], [6910, 8779], [6850, 8826], [6809, 8792], [6779, 8834], [6739, 8856], [6719, 8812], [6667, 8801], [6535, 8843], [6460, 8932], [6419, 8915], [6407, 8942], [6397, 9044], [6406, 9133]]] } }, { type: 'Feature', id: 'TR.AN', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.58, 'hc-middle-y': 0.48, 'hc-key': 'tr-an', 'hc-a2': 'AN', labelrank: '7', hasc: 'TR.AN', 'alt-name': 'Ankara', 'woe-id': '2347263', subregion: null, fips: 'TU68', 'postal-code': 'AN', name: 'Ankara', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '32.578', 'woe-name': 'Ankara', latitude: '39.829', 'woe-label': 'Ankara, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[3319, 7267], [3262, 7378], [3266, 7539], [3236, 7609], [3115, 7683], [3091, 7683], [3061, 7598], [2978, 7636], [2874, 7547], [2832, 7565], [2763, 7522], [2653, 7570], [2566, 7550], [2467, 7624], [2418, 7650], [2496, 7693], [2521, 7724], [2488, 7777], [2494, 7883], [2470, 7948], [2442, 7973], [2412, 8085], [2435, 8111], [2416, 8157], [2381, 8168], [2352, 8264], [2188, 8267], [2165, 8291], [2087, 8293], [2055, 8270], [1995, 8288], [1942, 8267], [1906, 8270], [1899, 8328], [1876, 8359], [1911, 8404], [1957, 8429], [1994, 8550], [2093, 8501], [2186, 8509], [2204, 8489], [2267, 8471], [2317, 8490], [2407, 8490], [2557, 8532], [2603, 8555], [2679, 8543], [2724, 8566], [2769, 8631], [2748, 8689], [2751, 8728], [2786, 8751], [2873, 8745], [3033, 8670], [3080, 8603], [3151, 8552], [3169, 8509], [3206, 8481], [3246, 8486], [3275, 8528], [3384, 8488], [3370, 8388], [3367, 8255], [3262, 8230], [3238, 8168], [3208, 8046], [3222, 7986], [3282, 7904], [3304, 7802], [3349, 7716], [3361, 7675], [3470, 7603], [3582, 7550], [3578, 7526], [3560, 7478], [3583, 7418], [3582, 7376], [3514, 7320], [3463, 7321], [3319, 7267]]] } }, { type: 'Feature', id: 'TR.SU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.56, 'hc-middle-y': 0.62, 'hc-key': 'tr-su', 'hc-a2': 'SU', labelrank: '7', hasc: 'TR.SU', 'alt-name': 'Şanlıurfa', 'woe-id': '2347314', subregion: null, fips: 'TU63', 'postal-code': 'SU', name: 'Şanlıurfa', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.0508', 'woe-name': 'Şanlıurfa', latitude: '37.3189', 'woe-label': 'Şanlıurfa, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7253, 6189], [7096, 6093], [6975, 6037], [6674, 5958], [6643, 5955], [6551, 5979], [6415, 5960], [6337, 5979], [6254, 6057], [6113, 6098], [6055, 6098], [5963, 6042], [5948, 6129], [5923, 6152], [5927, 6195], [5895, 6188], [5863, 6212], [5840, 6348], [5862, 6409], [5910, 6473], [5948, 6482], [5979, 6489], [6033, 6463], [6080, 6511], [6218, 6544], [6288, 6630], [6414, 6658], [6373, 6688], [6442, 6704], [6422, 6723], [6464, 6740], [6465, 6845], [6505, 6872], [6508, 6907], [6579, 6952], [6625, 6930], [6738, 6915], [6815, 6852], [6904, 6811], [6914, 6830], [6977, 6788], [6979, 6709], [7001, 6624], [7048, 6532], [7077, 6504], [7091, 6419], [7160, 6361], [7167, 6288], [7226, 6200], [7253, 6189]]] } }, { type: 'Feature', id: 'TR.BB', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.42, 'hc-middle-y': 0.45, 'hc-key': 'tr-bb', 'hc-a2': 'BB', labelrank: '6', hasc: 'TR.BB', 'alt-name': 'Bayburt', 'woe-id': '2347327', subregion: null, fips: 'TU77', 'postal-code': 'BB', name: 'Bayburt', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.3056', 'woe-name': 'Bayburt', latitude: '40.2859', 'woe-label': 'Bayburt, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6809, 8792], [6850, 8826], [6910, 8779], [7004, 8771], [7170, 8808], [7191, 8766], [7233, 8626], [7269, 8610], [7359, 8599], [7337, 8537], [7240, 8489], [7196, 8443], [7085, 8441], [6993, 8453], [6947, 8418], [6859, 8400], [6820, 8491], [6839, 8581], [6835, 8687], [6809, 8792]]] } }, { type: 'Feature', id: 'TR.EM', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.5, 'hc-middle-y': 0.57, 'hc-key': 'tr-em', 'hc-a2': 'EM', labelrank: '7', hasc: 'TR.EM', 'alt-name': 'Erzurum', 'woe-id': '2347282', subregion: null, fips: 'TU25', 'postal-code': 'EM', name: 'Erzurum', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '41.403', 'woe-name': 'Erzurum', latitude: '39.9678', 'woe-label': 'Erzurum, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8292, 8959], [8284, 8908], [8306, 8837], [8197, 8753], [8119, 8718], [8106, 8677], [8157, 8624], [8241, 8607], [8305, 8566], [8357, 8493], [8262, 8424], [8201, 8416], [8252, 8365], [8335, 8342], [8324, 8316], [8336, 8219], [8319, 8153], [8266, 8139], [8194, 8093], [8179, 7998], [8118, 7940], [8050, 7921], [8008, 7886], [7910, 7899], [7858, 7952], [7776, 8012], [7730, 8018], [7642, 7995], [7587, 8061], [7509, 8078], [7433, 8133], [7354, 8083], [7304, 8086], [7302, 8131], [7328, 8201], [7262, 8242], [7237, 8308], [7196, 8354], [7101, 8347], [7070, 8360], [7085, 8441], [7196, 8443], [7240, 8489], [7337, 8537], [7359, 8599], [7269, 8610], [7233, 8626], [7191, 8766], [7170, 8808], [7255, 8860], [7331, 8885], [7344, 8928], [7409, 8950], [7503, 9034], [7548, 9014], [7637, 9005], [7630, 8892], [7671, 8863], [7763, 8922], [7805, 8938], [7899, 8909], [7920, 8949], [7925, 9011], [7956, 9066], [7953, 9126], [7987, 9154], [8125, 9178], [8142, 9124], [8214, 9055], [8292, 8959]]] } }, { type: 'Feature', id: 'TR.MR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.46, 'hc-middle-y': 0.4, 'hc-key': 'tr-mr', 'hc-a2': 'MR', labelrank: '7', hasc: 'TR.MR', 'alt-name': 'Mardin', 'woe-id': '2347322', subregion: null, fips: 'TU72', 'postal-code': 'MR', name: 'Mardin', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '40.9525', 'woe-name': 'Mardin', latitude: '37.4282', 'woe-label': 'Mardin, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8184, 6436], [7948, 6357], [7788, 6336], [7608, 6362], [7501, 6337], [7400, 6275], [7348, 6260], [7253, 6189], [7226, 6200], [7167, 6288], [7160, 6361], [7091, 6419], [7077, 6504], [7128, 6580], [7298, 6721], [7344, 6728], [7374, 6784], [7436, 6802], [7637, 6814], [7671, 6834], [7697, 6831], [7742, 6784], [7790, 6704], [7855, 6671], [7941, 6697], [8100, 6836], [8165, 6688], [8162, 6639], [8069, 6580], [8048, 6551], [8060, 6522], [8129, 6507], [8168, 6480], [8184, 6436]]] } }, { type: 'Feature', id: 'TR.SR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.62, 'hc-middle-y': 0.42, 'hc-key': 'tr-sr', 'hc-a2': 'SR', labelrank: '6', hasc: 'TR.SR', 'alt-name': 'Şırnak', 'woe-id': '2347330', subregion: null, fips: 'TU80', 'postal-code': 'SR', name: 'Şırnak', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '42.5455', 'woe-name': 'Şırnak', latitude: '37.4047', 'woe-label': 'Şırnak, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[9019, 6631], [8961, 6630], [8881, 6663], [8853, 6661], [8772, 6616], [8645, 6631], [8568, 6469], [8453, 6430], [8436, 6473], [8442, 6515], [8403, 6553], [8363, 6551], [8353, 6577], [8271, 6476], [8184, 6436], [8168, 6480], [8129, 6507], [8060, 6522], [8048, 6551], [8069, 6580], [8162, 6639], [8165, 6688], [8100, 6836], [8185, 6804], [8299, 6806], [8340, 6855], [8416, 6860], [8535, 6842], [8756, 6838], [8788, 6878], [8790, 6919], [8833, 6949], [8943, 6933], [8998, 6943], [8995, 6834], [9033, 6751], [9035, 6687], [9019, 6631]]] } }, { type: 'Feature', id: 'TR.SI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.39, 'hc-middle-y': 0.53, 'hc-key': 'tr-si', 'hc-a2': 'SI', labelrank: '7', hasc: 'TR.SI', 'alt-name': 'Siirt', 'woe-id': '2347324', subregion: null, fips: 'TU74', 'postal-code': 'SI', name: 'Siirt', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '42.2212', 'woe-name': 'Siirt', latitude: '37.9159', 'woe-label': 'Siirt, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8790, 6919], [8788, 6878], [8756, 6838], [8535, 6842], [8416, 6860], [8340, 6855], [8299, 6806], [8185, 6804], [8100, 6836], [8032, 6898], [7925, 6930], [7858, 6981], [7849, 7028], [7865, 7063], [7929, 7087], [7985, 7194], [8046, 7178], [8108, 7178], [8203, 7220], [8243, 7206], [8319, 7151], [8430, 7124], [8571, 7051], [8607, 7082], [8598, 7160], [8620, 7229], [8664, 7237], [8753, 7222], [8773, 7113], [8771, 7009], [8761, 6970], [8790, 6919]]] } }, { type: 'Feature', id: 'TR.HK', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.42, 'hc-middle-y': 0.44, 'hc-key': 'tr-hk', 'hc-a2': 'HK', labelrank: '7', hasc: 'TR.HK', 'alt-name': 'Hakkari', 'woe-id': '2347320', subregion: null, fips: 'TU70', 'postal-code': 'HK', name: 'Hakkari', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '44.0804', 'woe-name': 'Hakkari', latitude: '37.6097', 'woe-label': 'Hakkâri, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[9453, 7122], [9464, 7102], [9521, 7110], [9556, 7097], [9606, 7039], [9637, 7052], [9694, 7013], [9670, 6949], [9697, 6929], [9701, 6817], [9851, 6722], [9833, 6676], [9844, 6610], [9823, 6626], [9733, 6614], [9655, 6530], [9608, 6508], [9593, 6458], [9550, 6458], [9510, 6529], [9538, 6584], [9520, 6653], [9437, 6685], [9381, 6679], [9332, 6609], [9286, 6585], [9261, 6602], [9173, 6592], [9091, 6595], [9019, 6631], [9035, 6687], [9033, 6751], [8995, 6834], [8998, 6943], [9075, 6953], [9181, 6993], [9230, 6985], [9303, 7001], [9333, 7024], [9361, 7108], [9453, 7122]]] } }, { type: 'Feature', id: 'TR.VA', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.5, 'hc-middle-y': 0.52, 'hc-key': 'tr-va', 'hc-a2': 'VA', labelrank: '7', hasc: 'TR.VA', 'alt-name': 'Van', 'woe-id': '2347316', subregion: null, fips: 'TU65', 'postal-code': 'VA', name: 'Van', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '43.5684', 'woe-name': 'Van', latitude: '38.5212', 'woe-label': 'Van, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[9236, 8146], [9266, 8049], [9332, 8017], [9338, 7937], [9319, 7904], [9358, 7833], [9409, 7805], [9408, 7670], [9441, 7647], [9459, 7473], [9536, 7479], [9561, 7442], [9518, 7383], [9520, 7308], [9457, 7169], [9453, 7122], [9361, 7108], [9333, 7024], [9303, 7001], [9230, 6985], [9181, 6993], [9075, 6953], [8998, 6943], [8943, 6933], [8833, 6949], [8790, 6919], [8761, 6970], [8771, 7009], [8773, 7113], [8753, 7222], [8664, 7237], [8620, 7229], [8589, 7236], [8571, 7325], [8541, 7384], [8551, 7427], [8642, 7496], [8702, 7624], [8767, 7697], [8778, 7751], [8751, 7785], [8680, 7817], [8652, 7907], [8727, 7957], [8720, 8029], [8674, 8046], [8676, 8068], [8740, 8094], [8780, 8144], [8864, 8134], [8927, 8091], [8997, 8089], [9045, 8125], [9160, 8115], [9236, 8146]]] } }, { type: 'Feature', id: 'TR.AR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.35, 'hc-middle-y': 0.51, 'hc-key': 'tr-ar', 'hc-a2': 'AR', labelrank: '7', hasc: 'TR.AR', 'alt-name': 'Ardahan', 'woe-id': '20070284', subregion: null, fips: 'TU86', 'postal-code': 'AR', name: 'Ardahan', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '42.8342', 'woe-name': 'Ardahan', latitude: '41.1809', 'woe-label': 'Ardahan, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8179, 9553], [8224, 9616], [8230, 9658], [8280, 9679], [8367, 9678], [8344, 9625], [8381, 9606], [8399, 9629], [8482, 9552], [8589, 9500], [8548, 9462], [8586, 9462], [8624, 9415], [8673, 9435], [8738, 9417], [8744, 9382], [8490, 9231], [8428, 9189], [8419, 8992], [8292, 8959], [8214, 9055], [8142, 9124], [8125, 9178], [8152, 9250], [8194, 9307], [8237, 9335], [8246, 9386], [8198, 9483], [8179, 9553]]] } }, { type: 'Feature', id: 'TR.KI', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.43, 'hc-middle-y': 0.56, 'hc-key': 'tr-ki', 'hc-a2': 'KI', labelrank: '7', hasc: 'TR.KI', 'alt-name': 'Kilis', 'woe-id': '20070285', subregion: null, fips: 'TU90', 'postal-code': 'KI', name: 'Kilis', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.0035', 'woe-name': 'Kilis', latitude: '36.8329', 'woe-label': 'Kilis, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5677, 5911], [5634, 5881], [5515, 5893], [5435, 5884], [5406, 5860], [5383, 5875], [5379, 5931], [5351, 5954], [5172, 6000], [5203, 6032], [5288, 6083], [5292, 6132], [5330, 6137], [5350, 6097], [5435, 6063], [5510, 5988], [5527, 6000], [5626, 5953], [5677, 5911]]] } }, { type: 'Feature', id: 'TR.BR', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.56, 'hc-middle-y': 0.51, 'hc-key': 'tr-br', 'hc-a2': 'BR', labelrank: '7', hasc: 'TR.BR', 'alt-name': 'Bartın', 'woe-id': '20070187', subregion: null, fips: 'TU87', 'postal-code': 'BR', name: 'Bartın', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '32.4688', 'woe-name': 'Bartın', latitude: '41.5857', 'woe-label': 'Bartın, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2588, 9396], [2659, 9482], [2732, 9498], [2847, 9567], [2948, 9581], [2953, 9538], [2987, 9453], [2953, 9428], [2958, 9377], [2906, 9328], [2876, 9320], [2851, 9267], [2785, 9213], [2728, 9198], [2669, 9202], [2681, 9263], [2651, 9350], [2588, 9396]]] } }, { type: 'Feature', id: 'TR.TG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.35, 'hc-middle-y': 0.47, 'hc-key': 'tr-tg', 'hc-a2': 'TG', labelrank: '7', hasc: 'TR.TG', 'alt-name': 'Tekirdağ', 'woe-id': '2347310', subregion: null, fips: 'TU59', 'postal-code': 'TG', name: 'Tekirdağ', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.4547', 'woe-name': 'Tekirdağ', latitude: '41.0824', 'woe-label': 'Tekirdağ, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[428, 9093], [338, 9069], [306, 9024], [252, 9029], [186, 9058], [69, 9048], [38, 9016], [7, 8938], [-47, 8890], [-73, 8851], [-137, 8803], [-210, 8794], [-258, 8760], [-272, 8815], [-268, 8872], [-347, 8885], [-375, 8980], [-375, 9039], [-342, 9131], [-301, 9206], [-303, 9320], [-220, 9332], [-68, 9329], [12, 9251], [80, 9280], [130, 9355], [244, 9379], [434, 9390], [448, 9290], [419, 9189], [428, 9093]]] } }, { type: 'Feature', id: 'TR.IZ', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.45, 'hc-middle-y': 0.69, 'hc-key': 'tr-iz', 'hc-a2': 'IZ', labelrank: '7', hasc: 'TR.IZ', 'alt-name': 'İzmir', 'woe-id': '2347290', subregion: null, fips: 'TU35', 'postal-code': 'IZ', name: 'İzmir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '27.3977', 'woe-name': 'İzmir', latitude: '38.2426', 'woe-label': 'İzmir, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[-217, 6824], [-225, 6896], [-295, 6905], [-322, 6941], [-387, 6964], [-436, 6948], [-454, 7025], [-487, 7079], [-559, 7074], [-590, 7007], [-668, 7088], [-783, 7141], [-734, 7183], [-704, 7166], [-641, 7198], [-652, 7242], [-617, 7244], [-676, 7288], [-700, 7387], [-660, 7426], [-610, 7403], [-546, 7302], [-562, 7228], [-532, 7147], [-530, 7204], [-496, 7236], [-476, 7185], [-386, 7189], [-334, 7210], [-292, 7200], [-252, 7239], [-327, 7246], [-377, 7229], [-399, 7289], [-429, 7315], [-419, 7350], [-472, 7368], [-486, 7444], [-428, 7465], [-390, 7447], [-369, 7466], [-381, 7506], [-284, 7550], [-294, 7589], [-328, 7577], [-359, 7594], [-399, 7580], [-425, 7605], [-421, 7666], [-376, 7690], [-430, 7765], [-304, 7844], [-269, 7885], [-129, 7958], [-98, 7950], [-61, 7893], [-30, 7749], [-3, 7682], [-10, 7645], [-65, 7600], [-133, 7568], [-147, 7515], [-198, 7435], [-163, 7396], [-151, 7346], [-119, 7315], [-5, 7304], [19, 7246], [99, 7193], [136, 7124], [165, 7129], [190, 7175], [278, 7161], [313, 7097], [406, 7106], [474, 7075], [533, 6940], [354, 6887], [244, 6891], [110, 6863], [-29, 6882], [-59, 6879], [-131, 6837], [-217, 6824]]] } }, { type: 'Feature', id: 'TR.KS', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.4, 'hc-key': 'tr-ks', 'hc-a2': 'KS', labelrank: '7', hasc: 'TR.KS', 'alt-name': 'Kastamonu', 'woe-id': '2347292', subregion: null, fips: 'TU37', 'postal-code': 'KS', name: 'Kastamonu', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '33.6356', 'woe-name': 'Kastamonu', latitude: '41.5114', 'woe-label': 'Kastamonu, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[2948, 9581], [3016, 9597], [3060, 9622], [3145, 9651], [3230, 9696], [3346, 9690], [3385, 9679], [3525, 9666], [3595, 9673], [3709, 9658], [3713, 9617], [3671, 9518], [3706, 9505], [3847, 9492], [3883, 9483], [3913, 9443], [3895, 9395], [3863, 9367], [3848, 9314], [3858, 9287], [3855, 9193], [3827, 9186], [3794, 9119], [3756, 9080], [3714, 8995], [3754, 8945], [3742, 8909], [3617, 8865], [3572, 8870], [3504, 8910], [3483, 8945], [3520, 9006], [3487, 9032], [3399, 8984], [3357, 8976], [3279, 8934], [3184, 8998], [3114, 9006], [3094, 9029], [3077, 9055], [3018, 9072], [3012, 9174], [3065, 9236], [3119, 9247], [3088, 9346], [3049, 9375], [2976, 9356], [2958, 9377], [2953, 9428], [2987, 9453], [2953, 9538], [2948, 9581]]] } }, { type: 'Feature', id: 'TR.MG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.5, 'hc-middle-y': 0.37, 'hc-key': 'tr-mg', 'hc-a2': 'MG', labelrank: '7', hasc: 'TR.MG', 'alt-name': 'Muğla', 'woe-id': '2347301', subregion: null, fips: 'TU48', 'postal-code': 'MG', name: 'Muğla', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '28.6482', 'woe-name': 'Muğla', latitude: '37.0501', 'woe-label': 'Muğla, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[879, 5618], [786, 5692], [806, 5706], [788, 5756], [801, 5808], [755, 5804], [761, 5861], [805, 5866], [794, 5889], [705, 5955], [659, 5915], [646, 5876], [566, 5928], [520, 5926], [513, 6010], [432, 6016], [425, 6063], [383, 6044], [410, 6024], [392, 5997], [323, 6045], [300, 6018], [328, 5966], [252, 5919], [220, 5871], [149, 5843], [132, 5875], [175, 5873], [209, 5901], [142, 5939], [227, 5954], [189, 5988], [113, 5975], [8, 5996], [-23, 5973], [-33, 5924], [-100, 5947], [-158, 5934], [-211, 5954], [-152, 6001], [-64, 6003], [-55, 6029], [23, 6010], [47, 6027], [159, 6015], [195, 6020], [169, 6057], [198, 6065], [184, 6106], [275, 6110], [293, 6154], [362, 6172], [348, 6187], [234, 6180], [106, 6182], [43, 6162], [9, 6172], [-84, 6154], [-153, 6198], [-217, 6192], [-231, 6153], [-257, 6158], [-272, 6230], [-216, 6271], [-178, 6273], [-129, 6243], [-81, 6268], [-94, 6314], [-47, 6316], [-40, 6370], [-129, 6359], [-110, 6412], [-164, 6412], [-137, 6459], [-156, 6476], [-107, 6565], [-69, 6574], [18, 6540], [57, 6510], [136, 6508], [159, 6494], [269, 6492], [347, 6568], [388, 6557], [464, 6500], [538, 6486], [545, 6417], [607, 6398], [646, 6305], [689, 6297], [712, 6261], [787, 6205], [799, 6114], [901, 6062], [941, 6105], [947, 6152], [975, 6173], [976, 6094], [998, 6085], [1027, 6118], [1097, 6125], [1143, 6056], [1075, 5915], [1070, 5831], [1013, 5788], [1010, 5749], [942, 5738], [906, 5640], [879, 5618]]] } }, { type: 'Feature', id: 'TR.KU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.49, 'hc-middle-y': 0.59, 'hc-key': 'tr-ku', 'hc-a2': 'KU', labelrank: '7', hasc: 'TR.KU', 'alt-name': 'Kütahya', 'woe-id': '2347297', subregion: null, fips: 'TU43', 'postal-code': 'KU', name: 'Kütahya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.5498', 'woe-name': 'Kütahya', latitude: '39.3471', 'woe-label': 'Kütahya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[819, 7377], [824, 7422], [796, 7491], [803, 7535], [761, 7617], [662, 7652], [624, 7694], [631, 7752], [714, 7786], [764, 7862], [774, 7913], [810, 7997], [831, 7980], [934, 7965], [965, 7983], [984, 8063], [1011, 8081], [1060, 8208], [1089, 8226], [1146, 8201], [1215, 8209], [1205, 8118], [1231, 8067], [1332, 7996], [1356, 7989], [1462, 8008], [1542, 7912], [1561, 7813], [1615, 7737], [1624, 7691], [1583, 7632], [1516, 7604], [1462, 7465], [1421, 7408], [1301, 7342], [1304, 7416], [1279, 7447], [1193, 7474], [1127, 7462], [1101, 7389], [996, 7371], [918, 7378], [851, 7402], [819, 7377]]] } }, { type: 'Feature', id: 'TR.NV', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.55, 'hc-middle-y': 0.67, 'hc-key': 'tr-nv', 'hc-a2': 'NV', labelrank: '7', hasc: 'TR.NV', 'alt-name': 'Nevşehir', 'woe-id': '2347303', subregion: null, fips: 'TU50', 'postal-code': 'NV', name: 'Nevşehir', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '34.6408', 'woe-name': 'Nevşehir', latitude: '38.7415', 'woe-label': 'Nevşehir, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[4194, 7565], [4155, 7425], [4223, 7324], [4226, 7224], [4141, 7087], [4082, 7064], [4013, 7103], [3900, 7090], [3825, 7149], [3835, 7253], [3799, 7252], [3745, 7276], [3736, 7312], [3764, 7382], [3745, 7446], [3751, 7475], [3813, 7423], [3836, 7429], [3826, 7477], [3838, 7516], [3970, 7581], [3993, 7611], [3963, 7668], [3969, 7714], [3947, 7814], [4026, 7820], [4096, 7747], [4116, 7697], [4161, 7670], [4194, 7565]]] } }, { type: 'Feature', id: 'TR.SV', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.59, 'hc-middle-y': 0.44, 'hc-key': 'tr-sv', 'hc-a2': 'SV', labelrank: '7', hasc: 'TR.SV', 'alt-name': 'Sivas', 'woe-id': '2347309', subregion: null, fips: 'TU58', 'postal-code': 'SV', name: 'Sivas', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '37.2907', 'woe-name': 'Sivas', latitude: '39.429', 'woe-label': 'Sivas, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5604, 8641], [5638, 8584], [5701, 8556], [5751, 8608], [5808, 8617], [5809, 8667], [5890, 8702], [5968, 8463], [6071, 8407], [6127, 8424], [6243, 8385], [6234, 8320], [6183, 8321], [6129, 8293], [6075, 8314], [6051, 8298], [6040, 8214], [6118, 8230], [6126, 8197], [6084, 8182], [6047, 8119], [6041, 7991], [6095, 7946], [6053, 7892], [6076, 7765], [6061, 7720], [5980, 7670], [5823, 7643], [5744, 7592], [5697, 7580], [5649, 7601], [5613, 7565], [5644, 7469], [5598, 7396], [5562, 7374], [5508, 7311], [5475, 7294], [5349, 7277], [5246, 7299], [5172, 7278], [5223, 7479], [5265, 7602], [5242, 7666], [5196, 7688], [5096, 7692], [5046, 7673], [4989, 7702], [4896, 7712], [4854, 7695], [4798, 7701], [4689, 7774], [4632, 7788], [4677, 7833], [4741, 7936], [4827, 8017], [4842, 8076], [4785, 8165], [4768, 8217], [4896, 8248], [4987, 8256], [5085, 8309], [5117, 8423], [5157, 8443], [5221, 8438], [5312, 8470], [5455, 8488], [5549, 8534], [5604, 8641]]] } }, { type: 'Feature', id: 'TR.TC', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.38, 'hc-middle-y': 0.58, 'hc-key': 'tr-tc', 'hc-a2': 'TC', labelrank: '7', hasc: 'TR.TC', 'alt-name': 'Tunceli', 'woe-id': '2347313', subregion: null, fips: 'TU62', 'postal-code': 'TC', name: 'Tunceli', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.6357', 'woe-name': 'Tunceli', latitude: '39.1519', 'woe-label': 'Tunceli, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6281, 7652], [6262, 7738], [6286, 7791], [6328, 7814], [6319, 7872], [6400, 7923], [6423, 7957], [6506, 7989], [6580, 8007], [6667, 8000], [6795, 8023], [6876, 8080], [6952, 8057], [7059, 8103], [7092, 8092], [7267, 8095], [7220, 8052], [7179, 8054], [7133, 7991], [7082, 7978], [7074, 7951], [7026, 7946], [6993, 7920], [6986, 7846], [7002, 7793], [6991, 7745], [6934, 7732], [6917, 7712], [6930, 7659], [6912, 7593], [6880, 7553], [6829, 7528], [6735, 7515], [6706, 7482], [6560, 7540], [6430, 7560], [6327, 7539], [6301, 7561], [6305, 7621], [6281, 7652]]] } }, { type: 'Feature', id: 'TR.ML', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.38, 'hc-middle-y': 0.51, 'hc-key': 'tr-ml', 'hc-a2': 'ML', labelrank: '7', hasc: 'TR.ML', 'alt-name': 'Malatya', 'woe-id': '2347298', subregion: null, fips: 'TU44', 'postal-code': 'ML', name: 'Malatya', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '38.1872', 'woe-name': 'Malatya', latitude: '38.5144', 'woe-label': 'Malatya, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6061, 7720], [6107, 7700], [6160, 7701], [6211, 7680], [6250, 7639], [6210, 7635], [6198, 7584], [6217, 7545], [6231, 7464], [6223, 7439], [6161, 7441], [6136, 7393], [6104, 7378], [6077, 7320], [6094, 7278], [6157, 7238], [6206, 7233], [6277, 7206], [6345, 7224], [6391, 7172], [6453, 7148], [6522, 7165], [6544, 7124], [6529, 7057], [6506, 7025], [6429, 6988], [6357, 6972], [6277, 6972], [6223, 6989], [6250, 7035], [6213, 7063], [6140, 7048], [6068, 6942], [6025, 6916], [6013, 6849], [5980, 6815], [5893, 6782], [5844, 6791], [5662, 6738], [5684, 6782], [5708, 6889], [5738, 6938], [5769, 7074], [5739, 7121], [5654, 7149], [5580, 7188], [5495, 7202], [5453, 7195], [5445, 7237], [5475, 7294], [5508, 7311], [5562, 7374], [5598, 7396], [5644, 7469], [5613, 7565], [5649, 7601], [5697, 7580], [5744, 7592], [5823, 7643], [5980, 7670], [6061, 7720]]] } }, { type: 'Feature', id: 'TR.AG', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.45, 'hc-middle-y': 0.37, 'hc-key': 'tr-ag', 'hc-a2': 'AG', labelrank: '7', hasc: 'TR.AG', 'alt-name': 'Ağrı', 'woe-id': '2347261', subregion: null, fips: 'TU04', 'postal-code': 'AG', name: 'Ağrı', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '43.3647', 'woe-name': 'Ağrı', latitude: '39.5925', 'woe-label': 'Ağrı, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[8319, 8153], [8336, 8219], [8324, 8316], [8335, 8342], [8252, 8365], [8201, 8416], [8262, 8424], [8357, 8493], [8467, 8484], [8632, 8551], [8744, 8562], [8775, 8553], [8806, 8436], [8836, 8424], [8904, 8473], [8982, 8450], [9016, 8405], [9105, 8384], [9115, 8364], [9222, 8376], [9309, 8368], [9406, 8404], [9439, 8395], [9423, 8343], [9428, 8241], [9411, 8216], [9357, 8194], [9316, 8209], [9239, 8192], [9215, 8170], [9236, 8146], [9160, 8115], [9045, 8125], [8997, 8089], [8927, 8091], [8864, 8134], [8780, 8144], [8740, 8094], [8676, 8068], [8674, 8046], [8720, 8029], [8727, 7957], [8652, 7907], [8551, 7872], [8467, 7812], [8456, 7981], [8367, 8072], [8319, 8153]]] } }, { type: 'Feature', id: 'TR.BT', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.52, 'hc-middle-y': 0.51, 'hc-key': 'tr-bt', 'hc-a2': 'BT', labelrank: '7', hasc: 'TR.BT', 'alt-name': 'Bitlis', 'woe-id': '2347270', subregion: null, fips: 'TU13', 'postal-code': 'BT', name: 'Bitlis', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '42.3462', 'woe-name': 'Bitlis', latitude: '38.5155', 'woe-label': 'Bitlis, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[7880, 7427], [7969, 7478], [8066, 7480], [8104, 7506], [8155, 7569], [8128, 7626], [8136, 7653], [8186, 7657], [8200, 7703], [8292, 7752], [8385, 7752], [8467, 7812], [8551, 7872], [8652, 7907], [8680, 7817], [8751, 7785], [8778, 7751], [8767, 7697], [8702, 7624], [8642, 7496], [8551, 7427], [8541, 7384], [8571, 7325], [8589, 7236], [8620, 7229], [8598, 7160], [8607, 7082], [8571, 7051], [8430, 7124], [8319, 7151], [8243, 7206], [8203, 7220], [8108, 7178], [8046, 7178], [7985, 7194], [7975, 7279], [7930, 7413], [7880, 7427]]] } }, { type: 'Feature', id: 'TR.GU', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.53, 'hc-middle-y': 0.57, 'hc-key': 'tr-gu', 'hc-a2': 'GU', labelrank: '7', hasc: 'TR.GU', 'alt-name': 'Gümüşhane', 'woe-id': '2347319', subregion: null, fips: 'TU69', 'postal-code': 'GU', name: 'Gümüşhane', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '39.3544', 'woe-name': 'Gümüşhane', latitude: '40.2812', 'woe-label': 'Gümüşhane, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[6859, 8400], [6818, 8339], [6728, 8302], [6597, 8292], [6529, 8314], [6509, 8335], [6403, 8384], [6337, 8403], [6318, 8471], [6313, 8545], [6394, 8610], [6395, 8637], [6350, 8665], [6284, 8677], [6268, 8694], [6267, 8758], [6297, 8805], [6294, 8846], [6354, 8903], [6419, 8915], [6460, 8932], [6535, 8843], [6667, 8801], [6719, 8812], [6739, 8856], [6779, 8834], [6809, 8792], [6835, 8687], [6839, 8581], [6820, 8491], [6859, 8400]]] } }, { type: 'Feature', id: 'TR.OS', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.64, 'hc-key': 'tr-os', 'hc-a2': 'OS', labelrank: '7', hasc: 'TR.OS', 'alt-name': 'Osmaniye', 'woe-id': '20070184', subregion: null, fips: 'TU91', 'postal-code': 'OS', name: 'Osmaniye', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '36.3011', 'woe-name': 'Osmaniye', latitude: '37.1737', 'woe-label': 'Osmaniye, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[5196, 6321], [5150, 6256], [5121, 6192], [5049, 6092], [4991, 6087], [4949, 6120], [4822, 6119], [4845, 6201], [4814, 6264], [4765, 6269], [4746, 6321], [4744, 6376], [4810, 6546], [4835, 6591], [4932, 6598], [4934, 6542], [4902, 6480], [4929, 6396], [4953, 6368], [5094, 6403], [5169, 6357], [5196, 6321]]] } }, { type: 'Feature', id: 'TR.BC', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.38, 'hc-middle-y': 0.54, 'hc-key': 'tr-bc', 'hc-a2': 'BC', labelrank: '7', hasc: 'TR.BC', 'alt-name': 'Bilecik', 'woe-id': '2347268', subregion: null, fips: 'TU11', 'postal-code': 'BC', name: 'Bilecik', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '30.2002', 'woe-name': 'Bilecik', latitude: '40.0387', 'woe-label': 'Bilecik, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1376, 8655], [1409, 8593], [1450, 8551], [1498, 8534], [1574, 8552], [1640, 8547], [1678, 8506], [1748, 8498], [1755, 8466], [1807, 8379], [1751, 8378], [1705, 8343], [1686, 8270], [1637, 8217], [1579, 8207], [1528, 8158], [1520, 8084], [1462, 8008], [1356, 7989], [1332, 7996], [1231, 8067], [1205, 8118], [1215, 8209], [1274, 8211], [1267, 8247], [1226, 8302], [1244, 8409], [1310, 8483], [1294, 8542], [1323, 8620], [1376, 8655]]] } }, { type: 'Feature', id: 'TR.DN', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.42, 'hc-middle-y': 0.53, 'hc-key': 'tr-dn', 'hc-a2': 'DN', labelrank: '7', hasc: 'TR.DN', 'alt-name': 'Denizli', 'woe-id': '2347277', subregion: null, fips: 'TU20', 'postal-code': 'DN', name: 'Denizli', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.2821', 'woe-name': 'Denizli', latitude: '37.7539', 'woe-label': 'Denizli, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1219, 7160], [1297, 7139], [1368, 7016], [1359, 6950], [1156, 6805], [1153, 6732], [1230, 6706], [1254, 6661], [1163, 6603], [1148, 6571], [1074, 6535], [1076, 6467], [1096, 6414], [992, 6249], [975, 6173], [947, 6152], [941, 6105], [901, 6062], [799, 6114], [787, 6205], [712, 6261], [689, 6297], [646, 6305], [607, 6398], [545, 6417], [538, 6486], [514, 6542], [527, 6568], [612, 6570], [672, 6634], [712, 6646], [710, 6682], [674, 6691], [643, 6747], [664, 6789], [653, 6879], [610, 6935], [660, 6944], [694, 7028], [747, 7038], [811, 7009], [872, 7026], [910, 7001], [983, 7002], [1021, 7046], [1104, 7040], [1144, 7061], [1148, 7147], [1219, 7160]]] } }, { type: 'Feature', id: 'TR.US', properties: { 'hc-group': 'admin1', 'hc-middle-x': 0.44, 'hc-middle-y': 0.55, 'hc-key': 'tr-us', 'hc-a2': 'US', labelrank: '7', hasc: 'TR.US', 'alt-name': 'Uşak', 'woe-id': '2347315', subregion: null, fips: 'TU64', 'postal-code': 'US', name: 'Uşak', country: 'Turkey', 'type-en': 'Province', region: null, longitude: '29.3636', 'woe-name': 'Uşak', latitude: '38.4942', 'woe-label': 'Uşak, TR, Turkey', type: 'Il' }, geometry: { type: 'Polygon', coordinates: [[[1301, 7342], [1288, 7285], [1253, 7253], [1219, 7160], [1148, 7147], [1144, 7061], [1104, 7040], [1021, 7046], [983, 7002], [910, 7001], [872, 7026], [811, 7009], [747, 7038], [696, 7075], [730, 7116], [744, 7172], [740, 7240], [712, 7288], [819, 7377], [851, 7402], [918, 7378], [996, 7371], [1101, 7389], [1127, 7462], [1193, 7474], [1279, 7447], [1304, 7416], [1301, 7342]]] } }] +} diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index f1210d095..7d32270d6 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -5,7 +5,7 @@ *= require toastr/build/toastr.min *= require select2/dist/css/select2.min *= require custom/select2 - *= require custom/loading + *= require custom/content_loader *= require intl-tel-input/build/css/intlTelInput.min *= require custom/intl_tel_input *= require flatpickr/dist/flatpickr.min diff --git a/app/assets/stylesheets/custom/loading.css b/app/assets/stylesheets/custom/content_loader.css similarity index 56% rename from app/assets/stylesheets/custom/loading.css rename to app/assets/stylesheets/custom/content_loader.css index 48a0dee0e..46ff552c2 100644 --- a/app/assets/stylesheets/custom/loading.css +++ b/app/assets/stylesheets/custom/content_loader.css @@ -1,23 +1,24 @@ + + .loading { - position: fixed; + position: absolute; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; - background-color: rgb(0, 0, 0); - background-color: rgba(0, 0, 0, 0.4); + background: #d3d3d37a; + display: flex; + justify-content: center; + align-items: center; } .loading>.loading-content { - height: 100%; - display: flex; - align-items: center; - justify-content: center; + color: #707070; + text-align: center; } -.snipper-large { - width: 3em; - height: 3em; +.custom-card-header { + padding: .25rem .75rem; } diff --git a/app/controllers/studies/dashboard_controller.rb b/app/controllers/detsis/dashboard_controller.rb similarity index 88% rename from app/controllers/studies/dashboard_controller.rb rename to app/controllers/detsis/dashboard_controller.rb index 485d39463..b379ca022 100644 --- a/app/controllers/studies/dashboard_controller.rb +++ b/app/controllers/detsis/dashboard_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Studies +module Detsis class DashboardController < ApplicationController def index; end end diff --git a/app/controllers/detsis/sdp_codes_controller.rb b/app/controllers/detsis/sdp_codes_controller.rb new file mode 100644 index 000000000..e48041e31 --- /dev/null +++ b/app/controllers/detsis/sdp_codes_controller.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Detsis + class SdpCodesController < ApplicationController + include SearchableModule + + def index + @sdp_codes = pagy_by_search(SdpCode.order(:main)) + end + end +end diff --git a/app/controllers/manager/dashboard_controller.rb b/app/controllers/manager/dashboard_controller.rb new file mode 100644 index 000000000..21210a6c4 --- /dev/null +++ b/app/controllers/manager/dashboard_controller.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Manager + class DashboardController < ApplicationController + def stats; end + end +end diff --git a/app/controllers/manager/stats/articles_controller.rb b/app/controllers/manager/stats/articles_controller.rb new file mode 100644 index 000000000..d016d46af --- /dev/null +++ b/app/controllers/manager/stats/articles_controller.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Manager + module Stats + class ArticlesController < ApplicationController + layout false + + def index; end + end + end +end diff --git a/app/controllers/manager/stats/employees_controller.rb b/app/controllers/manager/stats/employees_controller.rb new file mode 100644 index 000000000..704e9ae4c --- /dev/null +++ b/app/controllers/manager/stats/employees_controller.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Manager + module Stats + class EmployeesController < ApplicationController + layout false + + def index; end + + def academic + @series = Employee.active.academic.group('titles.name').count + end + end + end +end diff --git a/app/controllers/manager/stats/students_controller.rb b/app/controllers/manager/stats/students_controller.rb new file mode 100644 index 000000000..01b21859a --- /dev/null +++ b/app/controllers/manager/stats/students_controller.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +module Manager + module Stats + class StudentsController < ApplicationController + layout false + + def index; end + + def cities + @series = Xokul::Ubs::Statistic::Student.by_cities( + schema: { + city: :name, + total: :value + } + ).each { |item| item[:name] = item[:name].capitalize_turkish }.to_json + end + + def double_major_and_minor + @series = Xokul::Ubs::Statistic::Student.double_major_and_minor( + schema: { + category: :name, + number_of_students: :y + } + ).to_json + end + + def genders + @series = Xokul::Ubs::Statistic::Student.by_genders( + schema: { + gender: :name, + number_of_students: :y + } + ).to_json + end + + def genders_and_degrees + data = Xokul::Ubs::Statistic::Student.by_genders_and_degree + @degrees = data.map { |item| item[:degree] }.uniq + @series = data.group_by { |item| item[:gender] }.map do |gender, values| + { + name: gender, + data: @degrees.map do |degree| + values.find { |v| v[:degree] == degree }&.fetch(:number_of_students, 0) + end + } + end.to_json + end + + def non_graduates + data = Xokul::Ubs::Statistic::Student.non_graduates + @degrees = data.map { |item| item[:degree] }.uniq + @series = data.group_by { |item| item[:status] }.map do |status, values| + { + name: status, + data: @degrees.map do |degree| + values.find { |v| v[:degree] == degree }&.fetch(:number_of_students, 0) + end + } + end.to_json + end + end + end +end diff --git a/app/controllers/studentship/course_enrollments_controller.rb b/app/controllers/studentship/course_enrollments_controller.rb index 8be1660ba..90190996f 100644 --- a/app/controllers/studentship/course_enrollments_controller.rb +++ b/app/controllers/studentship/course_enrollments_controller.rb @@ -33,12 +33,10 @@ def destroy end def save - if @service.course_enrollments.any? - message = @service.save ? t('.success') : t('.error') - redirect_to(list_student_course_enrollments_path(@student), flash: { info: message }) - else - redirect_with(t('.errors.empty_selected_courses_list')) - end + return redirect_with(t('.errors.empty_selected_courses_list')) if @service.course_enrollments.empty? + return redirect_with(t('.error')) unless @service.save + + redirect_to(list_student_course_enrollments_path(@student), flash: { info: t('.success') }) end private @@ -73,7 +71,7 @@ def check_registration_status end def course_enrollment_params - params.require(:course_enrollment).permit(:available_course_id) + params.require(:course_enrollment).permit(:available_course_id, :available_course_group_id) end end end diff --git a/app/controllers/studies/articles_controller.rb b/app/controllers/studies/articles_controller.rb deleted file mode 100644 index 2db2c7e13..000000000 --- a/app/controllers/studies/articles_controller.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -module Studies - class ArticlesController < ApplicationController - def index; end - end -end diff --git a/app/controllers/studies/certifications_controller.rb b/app/controllers/studies/certifications_controller.rb deleted file mode 100644 index 9202c5a68..000000000 --- a/app/controllers/studies/certifications_controller.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -module Studies - class CertificationsController < ApplicationController - def index; end - end -end diff --git a/app/controllers/studies/projects_controller.rb b/app/controllers/studies/projects_controller.rb deleted file mode 100644 index 6574c700d..000000000 --- a/app/controllers/studies/projects_controller.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -module Studies - class ProjectsController < ApplicationController - def index; end - end -end diff --git a/app/helpers/component_helper.rb b/app/helpers/component_helper.rb index d29a4b7bc..7ecdcaec7 100644 --- a/app/helpers/component_helper.rb +++ b/app/helpers/component_helper.rb @@ -24,6 +24,21 @@ def klass_for_status(status) STATUSES.fetch(status.to_sym, 'secondary') end + def content_loader_panel_tag(url, header: nil, refresh: {}, &block) + render 'layouts/components/content_loader_panel', + url: url, + header: header, + content: (block_given? ? capture(&block) : nil), + refresh: OpenStruct.new( + auto: refresh.fetch(:auto, false), + interval: refresh.fetch(:interval, 10_000) + ) + end + + def content_loader_tag(url) + render 'layouts/components/content_loader_basic', url: url + end + def loading_tag(text = t('loading')) tag.div(class: 'loading', id: 'loading', style: 'display: none;') do tag.div(class: 'loading-content') do diff --git a/app/javascript/channels/consumer.js b/app/javascript/channels/consumer.js index 0eceb59b1..9f1489fd8 100644 --- a/app/javascript/channels/consumer.js +++ b/app/javascript/channels/consumer.js @@ -1,6 +1,6 @@ // Action Cable provides the framework to deal with WebSockets in Rails. // You can generate new channels where WebSocket features live using the `rails generate channel` command. -import { createConsumer } from "@rails/actioncable" +import { createConsumer } from '@rails/actioncable' export default createConsumer() diff --git a/app/javascript/controllers/content_loader_controller.js b/app/javascript/controllers/content_loader_controller.js new file mode 100644 index 000000000..f9b2264b4 --- /dev/null +++ b/app/javascript/controllers/content_loader_controller.js @@ -0,0 +1,57 @@ +import { Controller } from 'stimulus' +import fetchContent from './fetch_content' + +export default class extends Controller { + static targets = ['content', 'loadingMessage', 'autoRefresh'] + + connect () { + this.load() + if (this.data.has('refreshInterval') && this.hasautoRefreshTarget) { + this.startRefreshing() + } + } + + disconnect () { + this.stopRefreshing() + } + + load () { + fetchContent({ + url: this.url, + targetElement: this.contentTarget, + loadingElement: this.loadingMessageTarget + }) + } + + startRefreshing () { + this.refreshTimer = setInterval(() => { + this.load() + }, this.data.get('refreshInterval')) + } + + stopRefreshing () { + if (this.refreshTimer) { + clearInterval(this.refreshTimer) + } + } + + autoRefreshStart () { + if (this.autoRefreshTarget.checked) return this.startRefreshing() + + this.stopRefreshing() + } + + showLoading () { + this.loadingMessageTarget.classList.remove('d-none') + } + + refresh (event) { + event.preventDefault() + this.showLoading() + this.load() + } + + get url () { + return this.data.get('url') + } +} diff --git a/app/javascript/controllers/fetch_content.js b/app/javascript/controllers/fetch_content.js new file mode 100644 index 000000000..7c729e127 --- /dev/null +++ b/app/javascript/controllers/fetch_content.js @@ -0,0 +1,26 @@ +/* eslint-disable no-undef */ +export default function ({ url, targetElement, loadingElement }) { + const ERROR_MESSAGE = ` +
+

+ + İşlem sırasında bir hata oluştu! Lütfen tekrardan deneyiniz. +

+
+ ` + + fetch(url) + .then(response => { + if (response.ok) return response.text() + + throw Error(response.statusText) + }) + .then(html => { + $(targetElement).html(html) + loadingElement.classList.add('d-none') + }) + .catch(() => { + $(targetElement).html(ERROR_MESSAGE) + loadingElement.classList.add('d-none') + }) +} diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js new file mode 100644 index 000000000..5b50a70b7 --- /dev/null +++ b/app/javascript/controllers/index.js @@ -0,0 +1,9 @@ +// Load all the controllers within this directory and all subdirectories. +// Controller files must be named *_controller.js. + +import { Application } from 'stimulus' +import { definitionsFromContext } from 'stimulus/webpack-helpers' + +const application = Application.start() +const context = require.context('controllers', true, /_controller\.js$/) +application.load(definitionsFromContext(context)) diff --git a/app/javascript/controllers/manager_dashboard_controller.js b/app/javascript/controllers/manager_dashboard_controller.js new file mode 100644 index 000000000..59fb6eaa5 --- /dev/null +++ b/app/javascript/controllers/manager_dashboard_controller.js @@ -0,0 +1,21 @@ +/* eslint-disable no-undef */ +import { Controller } from 'stimulus' +import fetchContent from './fetch_content' + +export default class extends Controller { + static targets = ['content', 'loadingMessage'] + + load (event) { + this.showLoading() + + fetchContent({ + url: event.target.dataset.contentUrl, + targetElement: this.contentTarget, + loadingElement: this.loadingMessageTarget + }) + } + + showLoading () { + this.loadingMessageTarget.classList.remove('d-none') + } +} diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index fab885eb6..3456c0f3f 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -3,16 +3,10 @@ // a relevant structure within app/javascript and only use these pack files to reference // that code so it'll be compiled. -require("@rails/ujs").start() -require("@rails/activestorage").start() -require("channels") -require("trix") -require("@rails/actiontext") +import 'controllers' -if (navigator.serviceWorker) { - navigator.serviceWorker.register('/service-worker.js', { scope: './' }) - .then(function(registration) { - console.log('[Companion]', 'Service worker registered!') - console.log(registration) - }) - } +require('@rails/ujs').start() +require('@rails/activestorage').start() +require('channels') +require('trix') +require('@rails/actiontext') diff --git a/app/models/available_course.rb b/app/models/available_course.rb index 6035a93c2..cc6858e43 100644 --- a/app/models/available_course.rb +++ b/app/models/available_course.rb @@ -56,7 +56,11 @@ class AvailableCourse < ApplicationRecord # custom methods def quota_full? - groups.sum(:quota) == course_enrollments.where(status: :saved).length + groups.sum(:quota) == course_enrollments.saved.count + end + + def enrollable_groups + groups.order(:name).reject(&:quota_full?) end private diff --git a/app/models/available_course_group.rb b/app/models/available_course_group.rb index 55546c7d3..7a3b9e091 100644 --- a/app/models/available_course_group.rb +++ b/app/models/available_course_group.rb @@ -3,6 +3,7 @@ class AvailableCourseGroup < ApplicationRecord # relations belongs_to :available_course, counter_cache: :groups_count + has_many :course_enrollments, dependent: :destroy has_many :lecturers, class_name: 'AvailableCourseLecturer', foreign_key: :group_id, inverse_of: :group, dependent: :destroy @@ -14,4 +15,9 @@ class AvailableCourseGroup < ApplicationRecord validates :name, presence: true, uniqueness: { scope: :available_course }, length: { maximum: 255 } validates :quota, allow_nil: true, numericality: { only_integer: true, greater_than_or_equal_to: 1 } validates_associated :lecturers + + # custom methods + def quota_full? + quota == course_enrollments.saved.count + end end diff --git a/app/models/course_enrollment.rb b/app/models/course_enrollment.rb index c5af7552f..70d1a131f 100644 --- a/app/models/course_enrollment.rb +++ b/app/models/course_enrollment.rb @@ -6,6 +6,7 @@ class CourseEnrollment < ApplicationRecord # relations belongs_to :available_course + belongs_to :available_course_group belongs_to :semester_registration # validations diff --git a/app/models/sdp_code.rb b/app/models/sdp_code.rb new file mode 100644 index 000000000..b30dd14ce --- /dev/null +++ b/app/models/sdp_code.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class SdpCode < ApplicationRecord + include PgSearch::Model + + pg_search_scope( + :search, against: %i[main first second third name], using: { tsearch: { prefix: true } } + ) + + # rubocop:disable Style/FormatStringToken + def full_code + tmpl = '%03
d.%02d.%02d' + format(tmpl, main: main, first: first, second: second) + end + # rubocop:enable Style/FormatStringToken +end diff --git a/app/models/semester_registration.rb b/app/models/semester_registration.rb index 0716851c4..f35feadeb 100644 --- a/app/models/semester_registration.rb +++ b/app/models/semester_registration.rb @@ -11,6 +11,7 @@ class SemesterRegistration < ApplicationRecord belongs_to :academic_term belongs_to :student has_many :course_enrollments, dependent: :destroy + has_many :available_course_groups, through: :course_enrollments # validations validates :semester, uniqueness: { scope: :student_id }, numericality: { greater_than: 0 } diff --git a/app/services/student_course_enrollment_service.rb b/app/services/student_course_enrollment_service.rb index bb40b358a..b2d51855b 100644 --- a/app/services/student_course_enrollment_service.rb +++ b/app/services/student_course_enrollment_service.rb @@ -37,14 +37,15 @@ def course_enrollments @course_enrollments ||= @student.current_registration .course_enrollments - .includes(available_course: [curriculum_course: %i[course curriculum_semester]]) + .includes(:available_course_group, available_course: [curriculum_course: %i[course curriculum_semester]]) end def enroll(course_enrollment_params) course_enrollment = @student.current_registration.course_enrollments.new(course_enrollment_params) - available_course = course_enrollment.available_course + available_course = enrollable(course_enrollment.available_course) + check_group_quota(available_course, course_enrollment.available_course_group) - return course_enrollment.save if enrollable(available_course).errors.empty? + return course_enrollment.save if available_course.errors.empty? raise EnrollableError, available_course.errors.full_messages.first end @@ -58,7 +59,9 @@ def drop(course_enrollment) end def save - @student.current_registration.course_enrollments.update(status: :saved) + return unless savable? + + @course_enrollments.update(status: :saved) @student.current_registration.update(status: :saved) end @@ -76,6 +79,10 @@ def dropable(available_course) available_course end + def savable? + @student.current_registration.available_course_groups.none?(&:quota_full?) + end + private def extra_ects @@ -140,6 +147,10 @@ def check_quota(available_course) available_course.errors.add(:base, translate('quota_full')) if available_course.quota_full? end + def check_group_quota(available_course, available_course_group) + available_course.errors.add(:base, translate('group_quota_full')) if available_course_group.quota_full? + end + def check_group(available_course) group_remaining_ects = remaining_ects_for(available_course.curriculum_course.curriculum_course_group) available_course.errors.add(:base, translate('already_enrolled_at_group')) if group_remaining_ects.zero? diff --git a/app/services/xokul/detsis.rb b/app/services/xokul/detsis.rb new file mode 100644 index 000000000..be0cc5710 --- /dev/null +++ b/app/services/xokul/detsis.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Xokul + module Detsis + module_function + + def sdp_code_references + Connection.request '/detsis/sdp_code_references' + end + end +end diff --git a/app/services/xokul/ubs/statistic/student.rb b/app/services/xokul/ubs/statistic/student.rb new file mode 100644 index 000000000..011f9e16b --- /dev/null +++ b/app/services/xokul/ubs/statistic/student.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +module Xokul + module Ubs + module Statistic + module Student + NAMESPACE = '/ubs/api/students/statistics' + + module_function + + def by_genders_and_degree + Connection.request("#{NAMESPACE}/genders_and_degree?locale=#{I18n.locale}") + end + + def by_genders(schema: {}) + transform_keys( + Connection.request("#{NAMESPACE}/genders?locale=#{I18n.locale}"), schema + ) + end + + def by_cities(schema: {}) + transform_keys( + Connection.request("#{NAMESPACE}/cities?locale=#{I18n.locale}"), schema + ) + end + + def by_units + Connection.request("#{NAMESPACE}/units?locale=#{I18n.locale}") + end + + def non_graduates + Connection.request("#{NAMESPACE}/non_graduates?locale=#{I18n.locale}") + end + + def double_major_and_minor(schema: {}) + transform_keys( + Connection.request("#{NAMESPACE}/double_major_and_minor?locale=#{I18n.locale}"), schema + ) + end + + def transform_keys(results, schema) + results.map { |item| item.transform_keys { |key| schema.fetch(key, key) } } + end + end + end + end +end diff --git a/app/views/detsis/dashboard/_card.html.erb b/app/views/detsis/dashboard/_card.html.erb new file mode 100644 index 000000000..ea4246081 --- /dev/null +++ b/app/views/detsis/dashboard/_card.html.erb @@ -0,0 +1,4 @@ +<%= link_to path, class: 'list-group-item d-flex list-group-item-action justify-content-between align-items-center' do %> + <%= t(title) %> + <%= count %> +<% end %> diff --git a/app/views/detsis/dashboard/index.html.erb b/app/views/detsis/dashboard/index.html.erb new file mode 100644 index 000000000..1f49327f2 --- /dev/null +++ b/app/views/detsis/dashboard/index.html.erb @@ -0,0 +1,17 @@ +
+
+
+
+ <%= t('.card_header') %> +
+
+
+ <%= render 'card', + count: SdpCode.count, + path: detsis_sdp_codes_path, + title: '.sdp_codes' %> +
+
+
+
+
diff --git a/app/views/detsis/sdp_codes/_search.html.erb b/app/views/detsis/sdp_codes/_search.html.erb new file mode 100644 index 000000000..e1d1adaa6 --- /dev/null +++ b/app/views/detsis/sdp_codes/_search.html.erb @@ -0,0 +1,45 @@ +
+
+ +
+
+ <%= form_tag detsis_sdp_codes_path, method: :get do %> +
+
+
+ <%= label_tag :term, t('smart_search') %> + <%= text_field_tag :term, + params[:term], + placeholder: t('.smart_search_placeholder'), + class: 'form-control' %> +
+
+
+
+
+ <%= submit_tag t('search'), class: 'btn btn-primary' %> +
+
+ <% end %> +
+
+
+
diff --git a/app/views/detsis/sdp_codes/index.html.erb b/app/views/detsis/sdp_codes/index.html.erb new file mode 100644 index 000000000..af06c2cab --- /dev/null +++ b/app/views/detsis/sdp_codes/index.html.erb @@ -0,0 +1,41 @@ +
+
+
+
+ <%= fa_icon 'align-justify', text: t('.card_header') %> +
+
+ <%= render 'search' %> + + + + + + + + + + + + + <% @sdp_codes.each do |code| %> + + + + + + + + + <% end %> + +
<%= t('.name') %><%= t('.main') %><%= t('.first') %><%= t('.second') %><%= t('.third') %><%= t('.full_code') %>
<%= code.name %><%= code.main %><%= code.first %><%= code.second %><%= code.third %><%= code.full_code %>
+
+
+ +
+
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a9af83ea1..58e209865 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -4,6 +4,7 @@ <%= render 'layouts/shared/meta' %> <%= stylesheet_link_tag 'application', media: 'all' %> <%= javascript_include_tag 'application' %> + <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload', async: true %> diff --git a/app/views/layouts/components/_content_loader_basic.html.erb b/app/views/layouts/components/_content_loader_basic.html.erb new file mode 100644 index 000000000..72dc351fa --- /dev/null +++ b/app/views/layouts/components/_content_loader_basic.html.erb @@ -0,0 +1,5 @@ +
+
+ <%= render 'layouts/components/loading' %> +
diff --git a/app/views/layouts/components/_content_loader_panel.html.erb b/app/views/layouts/components/_content_loader_panel.html.erb new file mode 100644 index 000000000..c3bbadeec --- /dev/null +++ b/app/views/layouts/components/_content_loader_panel.html.erb @@ -0,0 +1,49 @@ +
+ data-content-loader-refresh-interval="<%= refresh.interval %>" + <% end %>> +
+
+
+
+

<%= header %>

+
+
+
+
+ +
+ <% if refresh.auto %> +
+ +
+ <% end %> +
+
+
+
+
+
+ <%= content %> + <%= render 'layouts/components/loading' %> +
+
+
diff --git a/app/views/layouts/components/_loading.html.erb b/app/views/layouts/components/_loading.html.erb new file mode 100644 index 000000000..2fb7bf773 --- /dev/null +++ b/app/views/layouts/components/_loading.html.erb @@ -0,0 +1,8 @@ +
+
+
+ <%= t('loading') %> +
+

<%= t('loading') %>

+
+
diff --git a/app/views/layouts/shared/_sidebar.html.erb b/app/views/layouts/shared/_sidebar.html.erb index dcf179e41..6c8a97c8a 100644 --- a/app/views/layouts/shared/_sidebar.html.erb +++ b/app/views/layouts/shared/_sidebar.html.erb @@ -6,11 +6,6 @@ <%= fa_icon('home', class: 'nav-icon') %> <%= t('home_nav') %> <% end %> - + + + +