Changes between Version 1 and Version 2 of AdvancedTopics


Ignore:
Timestamp:
06/13/26 12:36:20 (3 days ago)
Author:
231055
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedTopics

    v1 v2  
    11= AdvancedTopics =
     2== PostGIS и QGIS ==
     3=== Зошто е избрана темата PostGIS? ===
     4Апликацијата за taxi сервис во својата основа е просторна апликација — секоја вожња има pickup и dropoff локација, секој активен возач има тековна позиција, и една од најважните функционалности на системот е наоѓање на најблискиот слободен возач до корисникот. Токму затоа PostGIS е природен избор — тоа е официјалното просторно проширување за PostgreSQL кое овозможува работа со GPS координати, пресметување на растојанија и просторно пребарување директно во базата на податоци, без потреба од надворешни алатки или рачни математички формули.
     5
     6Во почетната имплементација координатите (latitude, longitude) во табелата Locations беа зачувани како обични NUMERIC(9,6) броеви. Базата не знаеше дека тие вредности всушност претставуваат GPS точки на мапа — за неа тоа беа само два независни децимални броја. PostGIS го решава токму тој проблем со воведување на вистински просторен тип (GEOGRAPHY) и просторни функции (ST_Distance, ST_DWithin, ST_MakePoint) кои разбираат координати и растојанија во метри.
     7
     8=== Која е потребата или употребата на PostGIS? ===
     9Во taxi апликацијата постојат три клучни просторни потреби:
     10
     11'''Наоѓање на најблизок возач''' — Кога корисник бара такси, системот мора брзо да го пронајде најблискиот слободен возач до pickup локацијата. Функцијата fn_find_nearest_driver, која веќе постоеше во проектот, ги наоѓа активните и слободни возачи (is_available = true, status = 'active') и враќа возач, телефон, рејтинг, регистарска ознака и класа на возилото. Со PostGIS оваа функција е проширена со GEOGRAPHY тип, ST_Distance и ST_DWithin, со што пресметката на растојание е директно дел од просторниот систем на базата.
     12
     13'''Пребарување во радиус''' — Преку ST_DWithin функцијата fn_find_nearest_driver сега го ограничува пребарувањето само на возачи во радиус од 10 km од pickup локацијата, наместо да разгледува сите активни возачи без ограничување. Дополнително, новиот VIEW vw_drivers_near_center користи истата логика (ST_DWithin + ST_MakePoint) за да прикаже само возачи во 2 km радиус од одредена точка (центарот на Куманово), што претходно не постоеше како функционалност.
     14
     15'''Визуелна верификација преку QGIS''' — Преку QGIS (Quantum GIS) табелата Locations и погледот vw_drivers_near_center се прикажуваат директно на OpenStreetMap мапа, поврзани преку GEOGRAPHY колоната geom. Ова овозможува визуелна потврда дека координатите се вистински GPS точки и дека просторните пресметки (растојанија, радиуси) се точни.
     16
     17=== Кој аспект од апликацијата го подобрува или проширува? ===
     18''Проширување на табелата Locations''' — Додадена е нова колона geom од тип GEOGRAPHY(POINT, 4326), пополнета од постоечките latitude/longitude вредности преку ST_MakePoint. Со ова секоја од 14,000 локации добива вистинска просторна репрезентација, покрај постоечките numeric координати.
     19
     20'''Просторен индекс''' — Создаден е GIST индекс (idx_locations_geom) на geom колоната. Ова е тип на индекс кој претходно не постоел во проектот (сите досегашни индекси биле стандардни B-Tree), и е потребен за да функционираат ефикасно ST_Distance, ST_DWithin и операторот за најблиска точка <->.
     21
     22'''Проширување на функцијата fn_find_nearest_driver''' — Функцијата е надградена да користи geom наместо рачна Haversine формула. Наместо да пресметува растојание до секој активен возач со тригонометриски функции (SIN, COS, ASIN, RADIANS), сега користи ST_Distance(l.geom, v_pickup_geom). Дополнително е воведено филтрирање ST_DWithin(l.geom, v_pickup_geom, 10000) кое ограничува пребарувањето на возачи во радиус од 10 km, и сортирање преку KNN оператор l.geom <-> v_pickup_geom за брзо наоѓање на најблиската точка.
     23
     24'''Нов VIEW vw_drivers_near_center''' — Креиран е нов поглед кој ги прикажува активните возачи (driver_id, име, рејтинг, населба, улица, класа на возило, регистарска ознака, достапност) заедно со geom колоната и пресметано растојание meters_from_center до центарот на Куманово (42.1322, 21.7144), користејќи ST_Distance и ST_MakePoint. Погледот користи ST_DWithin со радиус од 2000 метри за да прикаже само возачи во близина на центарот (од вкупно 150 активни возачи, во овој радиус се наоѓаат сите 150, бидејќи координатите се генерирани во рамки на градот).
     25
     26'''Визуелизација во QGIS''' — Воспоставена е директна конекција од QGIS кон PostgreSQL базата (Host: localhost, Port: 5432, Database: postgres). Преку geom колоната, табелата Locations и погледот vw_drivers_near_center се прикажани како точкасти слоеви над OpenStreetMap позадина (XYZ Tiles), со што е визуелно потврдено дека сите локации се наоѓаат во рамки на Куманово и неговите околни населби.
     27
     28=== Документација на чекорите за имплементација ===
     29'''1. Инсталација на PostGIS'''
     30PostGIS е инсталиран преку Stack Builder (доаѓа со PostgreSQL инсталацијата за Windows) преку Spatial Extensions → PostGIS Bundle. Потоа е активиран во базата со CREATE EXTENSION postgis; и проверен со SELECT PostGIS_Full_Version(); (верзија 3.6.2).
     31
     32'''2. Додавање на просторна колона на Locations'''
     33На постоечката табела Locations е додадена нова колона geom од тип GEOGRAPHY(POINT, 4326). Колоната е пополнета од постоечките latitude/longitude вредности преку ST_MakePoint(longitude, latitude)::GEOGRAPHY, со што секоја од 14,000 локации добива вистинска просторна репрезентација. SRID 4326 (WGS 84) е истиот координатен систем кој го користат GPS, Google Maps и OpenStreetMap.
     34
     35'''3. Креирање на просторен индекс'''
     36Создаден е GIST индекс (idx_locations_geom) на geom колоната — тип на индекс различен од стандардниот B-Tree, потребен за да функционираат ефикасно ST_Distance, ST_DWithin и операторот <->.
     37
     38'''4. Верификација на пресметките'''
     39Извршена е проверка дека растојанието меѓу две локации се пресметува точно во метри преку ST_Distance, со резултат од 123.11 метри меѓу локација 1 и 2.
     40
     41'''5. Надградба на fn_find_nearest_driver'''
     42Функцијата, која претходно користела рачна Haversine формула, е преправена да користи GEOGRAPHY тип. Земената pickup точка (v_pickup_geom) се споредува со локациите на активните и слободни возачи преку ST_Distance, со филтрирање ST_DWithin(l.geom, v_pickup_geom, 10000) (радиус од 10km) и сортирање преку KNN операторот l.geom <-> v_pickup_geom за најбрзо наоѓање на најблиската точка.
     43
     44'''6. Нов VIEW vw_drivers_near_center'''
     45Креиран е нов поглед кој прикажува активни возачи (име, рејтинг, населба, улица, класа и регистарска ознака на возилото, достапност) заедно со geom колоната и пресметано растојание meters_from_center до центарот на Куманово (42.1322, 21.7144), користејќи ST_Distance и ST_MakePoint. Погледот користи ST_DWithin со радиус од 2000 метри за прикажување само на возачите во близина на центарот.
     46
     47'''7. Визуелизација во QGIS'''
     48QGIS (верзија 3.44.10 LTR) е поврзан директно на PostgreSQL базата (Host: localhost, Port: 5432, Database: postgres). Додадени се два слоја:
     49
     50'''Locations''' — сите 14,000 локации, прикажани како точки преку geom колоната
     51'''vw_drivers_near_center''' — само возачите во 2km радиус од центарот на Куманово
     52
     53Како позадинска карта е додадена OpenStreetMap преку XYZ Tiles, со што локациите се прикажани директно над вистинската карта на Куманово, овозможувајќи визуелна потврда на координатите и резултатите од просторните пребарувања.
     54
     55[[Image(Qgis.png, width=800)]]