Біз ауа тасуды қалай доғардық: BigQuery GIS арқылы Алматы бойынша жеткізуді бағыттау
Алматыдағы логистика — бұл жай ғана тауарларды А нүктесінен Б нүктесіне тасымалдау ғылымы емес. Бұл евклидтік геометрия заңдары шындық алдында дәрменсіз болатын кез келген курьерлік бизнес үшін төзімділіктің қатал сынағы. Таулардың арасында қысылған, өзінің әйгілі "жоғары-төмен" ылдиымен, Әл-Фарабидегі созылмалы 10 балдық кептелістерімен және шатасқан шағынаудандарымен ерекшеленетін қала кез келген стандартты логистикалық модельді бұза алады.
Ұзақ уақыт бойы компаниялар бұл мәселені "тікелей" шешуге тырысты. Олар қаланы квадраттарға бөлді, курьерлерді пошта индекстеріне байлады немесе интерактивті картада маркермен қызмет көрсету аймақтарын сызды. Бірақ бизнес өсті, ал тиімділік төмендеді. Біз классикалық проблемаға тап болдық: курьерлер ауа тасымалдады. Бос жүрістер 35%-ға жетті, жеткізу уақыты (терезелері) бұзылды, ал логистер мыңдаған тапсырыстарды қолмен қайта бөлуге тырысып, қажып кетті. Бұл мақалада біз, OZAT инженерлері, статикалық аймақтардан динамикалық data-driven бағыттауға көше отырып, Google Cloud BigQuery GIS және Google Maps Platform көмегімен ірі e-commerce жобасының логистикалық пайплайнын қалай толығымен қайта құрғанымызды айтып береміз.
Неліктен статикалық жеткізу аймақтары — өлі жүк?
Бағыттаудың (маршрутизацияның) классикалық тәсілі мынадай: логист қаланы полигондарға (мысалы, Бостандық ауданы, Медеу ауданы) бөледі және әр полигонға белгілі бір курьерлер санын тағайындайды. Егер тапсырыс осы полигонға түссе, ол жергілікті жүргізушінің пулына түседі. Бұл жерде не қате?
- Нақты тығыздықты елемеу: Аудандардың шекаралары тапсырыстардың тығыздығын көрсетпейді. Курьер Медеу ауданының шетіне бір жеткізілім үшін 15 шақырым жүруі мүмкін, ал басқа курьер екі аймақтың шекарасында көрші тұрғын үй кешендеріне 40 тапсырыс жеткізіп, "үзіліп" жатады.
- Түзу сызық — бұл жалған: Стандартты жүйелер көбінесе қашықтықты түзу сызықпен (haversine distance) есептейді. Алматыда нүкте тік сызық бойынша 2 км қашықтықта болуы мүмкін, бірақ бір бағытты көшелер (Сейфуллин, Наурызбай батыр) және бұрылыстардың жоқтығына байланысты нақты жол 8 км болады.
- Уақытша соқырлық: Аймақтар тәулік уақытын ескермейді. Таңертең трафик қала бойынша "төмен", кешке "жоғары" жүреді. Жұмыс күндеріндегі (кеңселер) тапсырыс паттерндері демалыс күндерінен (жатын аудандар) түбегейлі ерекшеленеді.
Біздің клиент жанармайға, курьерлердің артық жұмысына және наразы тұтынушылардан түскен жіберіп алған пайдаға ақша жоғалтты. Бізге интеллектуалды шешім қажет болды. Біз өзіміздің Document AI арқылы бухгалтерияны автоматтандыру туралы мақаламызда айтқанымыздай, күрделі сызықты емес есептерді қарапайым шаблондармен шешу әрекеттері сәтсіздікке ұшырайды. Деректерді терең талдау қажет болды.
Data-Driven логистика: BigQuery GIS енгізу
Мәселені шешу үшін біз деректерді геокеңістіктік талдауды (Data Analytics) қолдануды ұйғардық. Клиентте терабайттаған деректер жинақталған: курьерлердің үш жылдық GPS-тректері, барлық сәтті жеткізілімдердің координаттары, мәртебелердің уақыт белгілері. Миллиондаған координаттарды біріктіріп (join), кластерлеуге тырысқанда қарапайым реляциялық дерекқор тұншығып қалар еді. Сондықтан біз қойманы Google BigQuery-де орналастырдық.
BigQuery-де ST_* функцияларының синтаксисін пайдалана отырып, SQL сұрауларында тікелей күрделі кеңістіктік есептеулерді орындауға мүмкіндік беретін қуатты GIS (Geographic Information Systems) модулі бар.
Аудандардан бас тарту: DBSCAN кластерлеу сиқыры
Әкімшілік аудандардың ойдан шығарылған шекараларына байланудың орнына, біз деректердің өзіне жеткізу аймақтарын құруға мәжбүр еттік. Біз BigQuery-ге (ST_CLUSTERDBSCAN) кірістірілген DBSCAN (Density-Based Spatial Clustering of Applications with Noise) алгоритмін қолдандық.
Алгоритм талғампаз жұмыс істейді: ол "ыстық нүктелерді" (hotspots) — бір-біріне жақын орналасқан тапсырыс координаттарының шоғырлануын табады. Егер нүктелер тым алыс орналасса (шу), ол оларды алып тастайды. Бұл бізге нақты сұраныс негізінде кластерлерді динамикалық түрде қалыптастыруға мүмкіндік берді. Мысалы, алгоритм "Нұрлы Тау" бизнес-орталығы мен оған іргелес тұрғын үй кешендері жұма күні күндіз бүкіл бір жатын ауданның бір аптадағы тапсырысындай тапсырыс тудыратынын анықтады. Тиісінше, жүйе мұны жеке микро-кластерге бөлді.
WITH ValidDeliveries AS (
SELECT
order_id,
courier_id,
ST_GEOGPOINT(longitude, latitude) AS geo_point,
delivery_timestamp,
EXTRACT(DAYOFWEEK FROM delivery_timestamp) AS day_of_week,
TIMESTAMP_DIFF(delivery_timestamp, created_timestamp, MINUTE) AS delivery_time_minutes
FROM
`ozat-kz-analytics.logistics.completed_orders`
WHERE
delivery_status = 'SUCCESS'
AND delivery_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
-- Отсекаем GPS-аномалии: берем только точки в радиусе 50 км от центра Алматы
AND ST_DISTANCE(ST_GEOGPOINT(longitude, latitude), ST_GEOGPOINT(76.9286, 43.2567)) < 50000
),
ClusteredHotspots AS (
SELECT
order_id,
geo_point,
day_of_week,
delivery_time_minutes,
-- Магия DBSCAN: Кластеризуем точки доставки (радиус 400 метров, минимум 15 заказов)
-- Партиционируем по дню недели, так как паттерны в будни и выходные разные
ST_CLUSTERDBSCAN(geo_point, 400, 15) OVER (PARTITION BY day_of_week) AS cluster_id
FROM
ValidDeliveries
)
SELECT
cluster_id,
day_of_week,
COUNT(order_id) AS total_orders,
AVG(delivery_time_minutes) AS avg_delivery_time,
-- Вычисляем геометрический центр кластера (центроид) для стоянки курьера
ST_CENTROID_AGG(geo_point) AS cluster_center,
-- Очерчиваем реальный полигон (границы кластера) вместо статичных зон
ST_CONVEXHULL(ST_UNION_AGG(geo_point)) AS cluster_polygon
FROM
ClusteredHotspots
WHERE
cluster_id IS NOT NULL
GROUP BY
cluster_id, day_of_week
ORDER BY
total_orders DESC;Astana Hub стартапынан Enterprise-ке дейін: неліктен архитектураны бірінші күннен дұрыс қалау керек
Google Cloud инфрақұрылымындағы миллиондаған жолдарда секундтар ішінде орындалатын бұл SQL сұрауы бізге тапсырыстар жиналуының нақты центроидтарын алуға және олардың айналасында ST_CONVEXHULL (дөңес қабықша) сызуға мүмкіндік берді. Енді бізде аптаның күніне байланысты өзгеретін нақты жеткізу аймақтары болды.
Маршрутизация және Коммивояжер есебі (VRP)
Тапсырыстарды тығыздығы бойынша топтастыра отырып, біз Марлезон балетінің екінші бөліміне көштік: әр кластердің ішінде тамаша маршрут құру. Бұл жерде ойынға Google Maps Platform және Routes API (Distance Matrix) қосылды.
Коммивояжер мәселесі (Vehicle Routing Problem) — бұл классикалық NP-қиын есеп. N нүктені айналып өтудің ең қысқа жолын табу керек. Біз нүктелерді жай ғана түзу сызықтармен қоса алмадық. Біз кластердегі барлық тапсырыстардың координаттарын Distance Matrix API-ге бердік, ол жолдағы нақты уақыт матрицасын (кептелістерді, бір бағытты қозғалысты және ағымдағы трафикті ескере отырып) қайтарды.
Алынған матрицаны біз оңтайландыру солверінің (OR-Tools негізінде) көмегімен өңдедік. Солвер жолдағы жалпы уақытты барынша азайту және жеткізу уақытын (Time Windows) сақтау үшін тапсырыстарды курьерлер арасында бөлді.
Нәтижелер: Бюджетті құтқарған сандар
BigQuery GIS арқылы статикалық логистикадан динамикалық гео-маршрутизацияға көшу керемет нәтижелер берді. Жүйе 3 ай ішінде сынақ пайдалануға берілді және жұмыстың алғашқы жарты жылында-ақ әзірлеу шығындарын ақтады.
BQ GIS-ке дейінгі және кейінгі логистика метрикалары
Метрикаларға қарайық:
- Бос жүріс 35%-дан 12%-ға дейін төмендеді. Курьерлер шеткі аймақтарда "ауа тасымалдауды" тоқтатты, өйткені жүйе кластерлердің нақты тығыздығына сүйене отырып жүктемені теңестіреді.
- Уақытылы жеткізу (SLA) 68%-дан 94%-ға дейін өсті. "Тікелей" есептеулердің орнына нақты қашықтық матрицасын (Distance Matrix) пайдалану клиенттерге дәл ETA (күтілетін келу уақытын) беруге мүмкіндік берді.
- Жанармайды үнемдеу: Жүрістің төмендеуі бүкіл автопарк ауқымында ЖЖМ шығындарының 22%-ға қысқаруына әкелді.
Қорытынды
Мегаполистегі логистика — бұл математика. Оны "көзбен" немесе картадағы маркердің көмегімен басқару әрекеттері бизнеске тым қымбатқа түседі. BigQuery GIS сияқты геокеңістіктік талдау құралдары бизнесті түсінудің мүлдем жаңа деңгейін ашады. Деректер сіздің аяғыңыздың астында жатыр, оларды тек дұрыс кластерлеу керек.
Біз OZAT-та терең сенімдеміз: жеке автопаркін немесе курьерлік қызметін басқаратын әрбір қазақстандық компания Data-Driven рельстеріне көшуі тиіс. Егер сіз бұлтты технологиялардың көмегімен бизнес-процестерді қалай оңтайландыратынымыз туралы көбірек білгіңіз келсе, біздің сәтті кейстерімізді зерттеңіз немесе бізге жазыңыз. Ауа тасуды доғарыңыз — пайда тасуды бастаңыз!
💡 ОЗАТ кеңесі: Енгізуге дайынсыз ба? Архитектура мен бюджетті Scope Builder арқылы есептеңіз немесе тегін ЖИ-аудиттен өтіңіз.

Рустам Шарафутдинов
Google Cloud архитектурасы саласындағы сарапшы және 15 жылдан астам тәжірибесі бар Senior Full-Stack әзірлеушісі. Ақауға төзімді архитектураларға, жоғары жүктемелі жобаларды оңтайландыруға және AI (Vertex AI) интеграциясына маманданған.