Înapoi la catalog
Season 44 15 Episoade 1h 1m 2026

GeoDjango and PostGIS

v6.0 — Ediția 2026. Un curs audio complet despre construirea aplicațiilor web spațiale folosind GeoDjango și PostGIS. Înregistrat în 2026, acoperind versiunea GeoDjango 6.0.

Analiză geospațială Aplicații web spațiale Baze de date
GeoDjango and PostGIS
Se redă acum
Click play to start
0:00
0:00
1
Puterea framework-urilor web spațiale
Acest episod prezintă GeoDjango și PostGIS ca o combinație puternică pentru construirea aplicațiilor web geografice. Vei învăța de ce bazele de date tradiționale au dificultăți cu datele spațiale și cum extensiile spațiale rezolvă această problemă.
3m 50s
2
Geometry vs Geography în PostGIS
Acest episod explorează tipurile de date PostGIS, concentrându-se în special pe diferența dintre tipurile Geometry și Geography. Vei învăța când să folosești matematica carteziană pe plan plat versus calculele sferice ale Pământului.
3m 37s
3
Configurarea mediului tău spațial
Acest episod acoperă configurarea inițială a unui proiect GeoDjango și PostGIS. Vei învăța cum să activezi extensia PostGIS și să configurezi setările Django pentru a te conecta la un backend spațial.
4m 33s
4
Sisteme de referință de coordonate și SRIDs
Acest episod analizează sistemele de referință de coordonate și SRIDs. Vei învăța ce este WGS84 și de ce proiectarea corectă a datelor hărții tale este crucială pentru măsurători precise ale distanțelor.
3m 58s
5
Proiectarea modelelor geografice
Acest episod demonstrează cum să proiectezi modele geografice în GeoDjango. Vei învăța cum să definești atributele PointField și MultiPolygonField pentru a stoca date spațiale în aplicația ta Django.
4m 07s
6
GDAL și OGR API
Acest episod introduce wrapper-ul GDAL și OGR API în interiorul GeoDjango. Vei învăța cum să inspectezi și să citești fișiere vectoriale externe, precum Shapefiles, în mod nativ în Python înainte de a le importa.
4m 00s
7
Ingerarea datelor spațiale cu LayerMapping
Acest episod acoperă automatizarea importurilor de date spațiale. Vei învăța cum să folosești utilitarul LayerMapping pentru a mapa datele externe Shapefile direct în modelele tale GeoDjango, fără efort.
3m 56s
8
GEOS API: Geometrie Pythonică
Acest episod se concentrează pe GEOS API pentru manipularea pythonică a geometriei. Vei învăța cum să efectuezi operațiuni topologice, precum reuniuni și intersecții, în memorie, fără a interoga baza de date.
3m 40s
9
Stăpânirea Spatial Lookups
Acest episod explică lookup-urile pentru interogări geografice în Django ORM. Vei învăța cum să folosești filtre spațiale pentru a găsi relații, cum ar fi ce puncte sunt conținute în anumite granițe.
4m 09s
10
Interogări de distanță de înaltă performanță
Acest episod abordează interogările de proximitate și distanță de înaltă performanță. Vei învăța cum să folosești lookup-urile de distanță și obiectul de distanță geografică pentru a găsi eficient locațiile din apropiere.
4m 11s
11
Funcții geografice ale bazei de date
Acest episod explorează funcțiile spațiale ale bazei de date accesibile prin GeoDjango. Vei învăța cum să calculezi arii, să extragi centroizi și să generezi GeoJSON direct în stratul bazei de date.
4m 12s
12
Date Raster în PostGIS
Acest episod introduce rasterele PostGIS și RasterFields din GeoDjango. Vei învăța cum să stochezi și să interoghezi date spațiale continue, cum ar fi modelele de elevație sau hărțile de temperatură.
4m 20s
13
Geolocație cu GeoIP2
Acest episod acoperă geolocația bazată pe IP folosind modulul GeoIP2 din GeoDjango. Vei învăța cum să mapezi adresele IP ale utilizatorilor la orașe și țări folosind seturile de date MaxMind.
4m 13s
14
Testarea aplicațiilor spațiale
Acest episod se concentrează pe testarea aplicațiilor spațiale în GeoDjango. Vei învăța cum să-ți configurezi suita de teste, să gestionezi bazele de date șablon PostGIS și să setezi privilegiile utilizatorilor.
4m 13s
15
Deploy-ul aplicațiilor GeoDjango
Acest episod încheie seria discutând considerentele de deploy pentru aplicațiile GeoDjango. Vei învăța despre siguranța firelor de execuție în GDAL și cum să-ți configurezi procesele WSGI pentru a preveni blocajele.
4m 02s

Episoade

1

Puterea framework-urilor web spațiale

3m 50s

Acest episod prezintă GeoDjango și PostGIS ca o combinație puternică pentru construirea aplicațiilor web geografice. Vei învăța de ce bazele de date tradiționale au dificultăți cu datele spațiale și cum extensiile spațiale rezolvă această problemă.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 1 din 15. Ai încercat vreodată să calculezi distanța dintre două puncte de latitudine și longitudine folosind un query SQL obișnuit? De obicei, ajungi să scrii un bloc masiv și fragil de trigonometrie doar ca să afli care cafenea e cea mai apropiată. Bazele de date standard pur și simplu nu înțeleg spațiul fizic. Rezolvarea acestui gap de date este exact ce discutăm astăzi în Puterea framework-urilor web spațiale. Lumea crede adesea că stocarea datelor geografice înseamnă doar să adaugi două coloane de tip decimal într-un tabel din baza de date, una pentru latitudine și una pentru longitudine. Asta e o concepție greșită frecventă. Dacă construiești un sistem de rutare pentru livrări de mâncare și trebuie să găsești cel mai apropiat restaurant de un client, o bază de date standard tratează acele coordonate ca pe niște numere floating-point arbitrare. Nu știe că Pământul e o sferă. Nu poate calcula eficient granițele, intersecțiile sau distanțele din lumea reală. Ești obligat să tragi mii de înregistrări în memoria aplicației și să faci calculele tu singur. Aici intervine o bază de date spațială. PostGIS este o extensie spațială pentru baza de date PostgreSQL. Schimbă fundamental modul în care sunt stocate datele. În loc de două coloane numerice separate, stochezi un singur obiect de tip geometry sau geography. O bază de date spațială înțelege nativ matematica lumii fizice. Știe ce înseamnă un punct, o linie și un poligon. Dacă vrei să găsești toate restaurantele aflate pe o rază de doi kilometri de un utilizator, PostGIS folosește indecși spațiali specializați pentru a găsi răspunsul instantaneu, la nivel de bază de date. Dar o bază de date inteligentă e doar jumătate din soluție. Tot trebuie să conectezi acea logică spațială la aplicația ta web. Asta ne aduce la GeoDjango. GeoDjango este un framework geografic de top, integrat direct în Django. Acționează ca o punte între baza ta de date spațială și logica aplicației. GeoDjango extinde Object-Relational Mapper-ul standard din Django, astfel încât să poată înțelege geometriile din PostGIS. Interacționezi cu datele geografice exact așa cum interacționezi cu modelele obișnuite din baza de date. În loc să scrii query-uri SQL spațiale raw, folosești Python. Poți filtra rezultatele din baza de date pe baza relațiilor spațiale, cum ar fi să verifici dacă poligonul zonei de livrare a unui restaurant conține un anumit punct de adresă al utilizatorului. GeoDjango traduce codul tău Python în query-urile PostGIS corecte. Include chiar și widget-uri de hartă pentru panoul de administrare Django, ca să poți crea și modifica vizual date geografice out of the box. Împreună, PostGIS și GeoDjango formează un stack incredibil de capabil. PostGIS gestionează munca matematică grea la nivelul de storage, iar GeoDjango oferă interfața Python curată pentru a servi acele date utilizatorilor tăi. Nu te mai lupți cu trigonometria complexă și începi să construiești feature-uri reale, location-aware. Iată ideea cheie. Adevărata putere a unui framework spațial nu e doar să desenezi linii pe o hartă web. Ci e mutarea completă a matematicii spațiale complexe din codul aplicației tale, direct într-un database engine construit special ca să înțeleagă geometria. Dacă ți se par utile aceste deep dive-uri, poți susține emisiunea căutând DevStoriesEU pe Patreon. Asta e tot pentru azi. Mulțumesc că m-ai ascultat — du-te și construiește ceva cool.
2

Geometry vs Geography în PostGIS

3m 37s

Acest episod explorează tipurile de date PostGIS, concentrându-se în special pe diferența dintre tipurile Geometry și Geography. Vei învăța când să folosești matematica carteziană pe plan plat versus calculele sferice ale Pământului.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 2 din 15. Cea mai scurtă cale între două puncte de pe Pământ nu este o linie dreaptă, ci o curbă. Dacă baza ta de date tratează longitudinea și latitudinea ca pe o grilă X și Y obișnuită, query-urile tale de distanță vor fi complet greșite. Pentru a repara asta, trebuie să înțelegi diferența dintre tipurile de date PostGIS Geometry și Geography. Implicit, bazele de date spațiale funcționează pe un plan plat, bidimensional. Acesta este tipul Geometry. Folosește matematica carteziană standard. Dacă vrei să găsești distanța dintre două puncte, baza de date desenează practic o linie dreaptă și aplică teorema lui Pitagora. Această abordare este incredibil de rapidă și foarte precisă pentru datele locale. Dacă mapezi un cartier, desenezi pereții unei clădiri sau trasezi granița exactă a unui parc mic, curbura Pământului este neglijabilă. O hartă plată funcționează perfect. Developerii presupun adesea că pot folosi tipul Geometry pentru orice. Ei stochează coordonate GPS globale, care sunt grade de longitudine și latitudine, într-o coloană Geometry plată. Când cer bazei de date să calculeze o distanță, aceasta returnează un număr fără sens în grade, în loc de metri sau mile. Pentru a obține distanțe din lumea reală cu tipul Geometry pe suprafețe mari, trebuie să îți traduci continuu datele în proiecții de hartă specifice, localizate. Acesta este exact motivul pentru care PostGIS oferă tipul Geography. Tipul Geography modelează Pământul ca pe o sferă. Mai exact, folosește nativ sistemul de referință spațială WGS84. Când stochezi coordonate într-o coloană Geography, baza de date înțelege că suprafața este curbată. Când îi ceri o distanță, nu desenează o linie plată. Calculează o rută pe cercul mare. Gândește-te la măsurarea unei rute de zbor de la New York la Londra. Dacă folosești tipul Geometry pe o hartă plată standard neproiectată, baza de date calculează o linie dreaptă care taie direct grila. Dacă folosești tipul Geography, baza de date calculează distanța reală cea mai scurtă pe curbura Pământului, urmărind cercul mare peste Atlantic. Și mai bine, tipul Geography returnează automat această distanță în metri. Eviți complet nevoia de a gestiona singur proiecții de hartă complexe. Aici este ideea de bază. Ai putea concluziona că Geography este tipul superior și ar trebui să înlocuiască complet Geometry. Asta este fals. Calcularea distanțelor pe o sferă necesită trigonometrie complexă. Cere mult mai multă putere de procesare decât matematica pe plan plat, ceea ce face ca operațiunile pe tipurile Geography să fie mai lente. În plus, PostGIS suportă mult mai puține funcții spațiale pentru Geography decât pentru Geometry. Multe operații geometrice avansate pur și simplu nu se traduc în matematică sferică. Alegerea ta depinde în întregime de întinderea fizică a datelor tale. Folosește tipul Geography atunci când aplicația ta stochează puncte la nivel global și are nevoie de distanțe precise, fără overhead-ul gestionării proiecțiilor. Folosește tipul Geometry atunci când datele tale sunt limitate la o anumită regiune locală sau când ai nevoie de performanță maximă absolută și de suita completă de funcții spațiale. Tipul pe care îl alegi definește forma lumii în care trăiește baza ta de date. Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
3

Configurarea mediului tău spațial

4m 33s

Acest episod acoperă configurarea inițială a unui proiect GeoDjango și PostGIS. Vei învăța cum să activezi extensia PostGIS și să configurezi setările Django pentru a te conecta la un backend spațial.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 3 din 15. Transformarea bazei de date standard într-un motor spațial necesită exact trei cuvinte SQL, dar dacă le execuți în contextul greșit, aplicația ta Django va eșua la prima ei migrare. Astăzi, ne concentrăm în întregime pe configurarea mediului tău spațial. Începem de la layer-ul bazei de date. Ai deja PostgreSQL rulând și ai creat o bază de date goală pentru noul tău proiect. În această etapă, acea bază de date este complet standard. Înțelege doar text, integers, dates și tipuri relaționale standard. Nu are nicio idee despre ce este o coordonată sau o limită geografică. Pentru a schimba asta, trebuie să activezi PostGIS. Lumea se încurcă adesea aici, presupunând că instalarea pachetelor PostGIS pe serverul lor face automat fiecare bază de date spatially aware. Nu este cazul. Extensia spațială trebuie creată în interiorul bazei de date specifice pe care o va folosi proiectul tău. Trebuie să te conectezi direct la acea nouă bază de date folosind un client de baze de date sau command line-ul. Odată conectat, execuți comanda pentru a crea extensia numită postgis. Acele trei cuvinte SQL transformă instantaneu environment-ul. PostgreSQL execută comanda, încărcând sute de funcții spațiale și tipuri de date specializate în schema ta. De asemenea, generează un system table crucial care stochează sistemele de referință spațială, ce oferă formulele matematice necesare pentru a proiecta coordonatele globale pe un ecran plat. Cu baza de date pregătită, treci la proiectul tău Django. Faci bootstrap la un proiect standard și creezi o nouă aplicație. Să numim această aplicație world. Acum, deschide fișierul tău de setări. Sunt necesare două modificări distincte pentru a face legătura între Django și PostGIS. Mai întâi, localizează array-ul installed apps. Trebuie să adaugi modulul numit django dot contrib dot gis. Acest modul este nucleul GeoDjango. Încarcă wrapper-ele Python pentru librăriile geografice subiacente, oferind spatial fields și database lookups geografice pe care le vei folosi pentru a scrie queries mai târziu. De asemenea, adaugi noua ta aplicație world la această listă, astfel încât Django să știe să-i urmărească modelele. Iată ideea cheie. A doua modificare are loc în dicționarul tău de configurare a bazei de date. Django rutează tot traficul bazei de date printr-un engine backend. Dacă lași engine-ul setat pe backend-ul PostgreSQL default, Django va trata baza ta de date spațială ca pe o bază de date relațională standard. Nu va ști cum să serializeze o formă geografică sau să facă parse în siguranță la un bounding box query. Trebuie să direcționezi explicit engine-ul către backend-ul GeoDjango PostGIS. Schimbi valoarea engine-ului în django dot contrib dot gis dot db dot backends dot postgis. Restul dicționarului de conexiune rămâne identic. Oferi în continuare numele bazei de date, user-ul, parola, host-ul și portul exact așa cum ai face-o pentru un setup standard. Când rulezi migrările inițiale, acest nou backend preia controlul. Se conectează la PostgreSQL și verifică imediat extensia PostGIS. Dacă ai uitat să creezi extensia în baza de date, backend-ul va prinde tipurile spațiale lipsă și va arunca o eroare. Dacă extensia este prezentă, conexiunea reușește. Acum ai un spatial pipeline complet. Adevărata putere a acestei configurații specifice este că, odată ce backend-ul postgis este wired up, complexitatea masivă a queries-urilor din baza de date spațială este complet ascunsă în spatele familiarului object relational mapper din Django. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
4

Sisteme de referință de coordonate și SRIDs

3m 58s

Acest episod analizează sistemele de referință de coordonate și SRIDs. Vei învăța ce este WGS84 și de ce proiectarea corectă a datelor hărții tale este crucială pentru măsurători precise ale distanțelor.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 4 din 15. Încearcă să măsori amprenta unei clădiri folosind latitudinea și longitudinea, iar numerele tale vor fi complet inutile. Asta pentru că latitudinea și longitudinea sunt doar unghiuri față de centrul Pământului, nu distanțe fizice. Pentru a transforma aceste unghiuri în măsurători utilizabile, cum ar fi metri sau picioare, ai nevoie de un Coordinate Reference System și un SRID. O coordonată precum 48 de grade nord și 2 grade est este doar o pereche de numere brute. Fără context, baza ta de date nu știe cum să mapeze aceste numere la lumea fizică. Acest context provine de la Spatial Reference System Identifier, numit în mod obișnuit SRID. Un SRID este pur și simplu un integer care leagă datele tale brute de coordonate de un model matematic specific al Pământului. By default, field-urile de geometry din GeoDjango folosesc un SRID de 4326. Acest integer reprezintă sistemul de coordonate WGS84. Este modelul standard folosit de sateliții GPS și de majoritatea librăriilor de web mapping. Stochează date folosind grade de latitudine și longitudine. WGS84 este excelent pentru a indica locații oriunde pe glob. Totuși, este un sistem geografic, ceea ce înseamnă că modelează Pământul ca o formă tridimensională. Iată ideea cheie. Nu poți calcula cu exactitate distanțe sau arii plane folosind grade. Distanța fizică dintre două linii de longitudine se micșorează pe măsură ce te deplasezi de la ecuator spre poli. Dacă încerci să găsești toate cafenelele aflate la 500 de metri de un punct folosind SRID 4326, baza de date trebuie să facă calcule sferice complexe on the fly, ceea ce este lent și adesea imprecis. Pentru a rezolva asta, folosești projected coordinate systems. Un sistem proiectat aplatizează matematic o porțiune specifică a Pământului curbat pe un grid bidimensional. Odată ce zona este aplatizată, coordonatele se schimbă din unghiuri în unități standard de lungime, cum ar fi metri sau picioare. Asta face ca acele calcule de distanță să fie rapide și precise folosind geometrie de bază. Alegerea SRID-ului depinde în întregime de scope-ul aplicației tale. Dacă construiești un sistem global de flight tracking, îți stochezi datele folosind WGS84 și SRID 4326. Punctele tale se întind pe întreaga lume, deci ai nevoie de un sistem global, chiar dacă calculele de distanță sunt puțin mai complexe. Dacă construiești o aplicație locală de city planning pentru a măsura limitele exacte ale proprietăților, folosirea WGS84 este o greșeală. În schimb, atribui un local projected coordinate system field-ului tău spațial. De exemplu, ai putea folosi un sistem de coordonate State Plane specific, cu propriul său SRID unic. Aceste sisteme locale sunt extrem de personalizate. Ele minimizează distorsiunea care apare atunci când aplatizezi o sferă, dar numai pentru acea zonă geografică specifică. Când îți configurezi modelele în GeoDjango, definești SRID-ul direct pe field-ul spațial. Dacă nu faci nimic, face default la 4326. Dacă vrei o proiecție localizată în metri, pasezi acel integer specific în definiția field-ului. GeoDjango tratează apoi toată geometria din acea coloană conform acelui model matematic specific. SRID-ul corect se asigură că acele calcule de distanță nu se deformează pe măsură ce datele tale se îndepărtează mai mult de ecuator. Mersi că ne-ai ascultat. Pe data viitoare!
5

Proiectarea modelelor geografice

4m 07s

Acest episod demonstrează cum să proiectezi modele geografice în GeoDjango. Vei învăța cum să definești atributele PointField și MultiPolygonField pentru a stoca date spațiale în aplicația ta Django.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 5 din 15. Vrei să adaugi date de locație în aplicația ta, așa că te-ai putea gândi să adaugi două float fields simple pentru latitudine și longitudine în baza de date. Dar făcând asta îți blochezi complet accesul la spatial queries avansate, calcule de distanță și intersecții geometrice. Pentru a debloca aceste capabilități, ai nevoie de spatial types adecvate, ceea ce ne aduce la Proiectarea Modelelor Geografice. Trecerea de la modelele standard Django la cele GeoDjango necesită doar o mică schimbare în importurile tale. În loc să le iei din modelele standard de database Django, imporți models din modulul geographic contrib. Acest modul custom oferă un drop-in replacement. Îți oferă acces la fiecare field type standard din Django, cum ar fi characters și integers, introducând în același timp spatial types în exact aceeași class definition. Ia un scenariu în care construiești un model WorldBorder pentru a stoca date despre țări. Definești model class-ul la fel ca pe oricare altul. Atribui un character field pentru numele țării, un integer field pentru populație și un float field pentru suprafața totală a terenului. Pentru a gestiona geometria reală a hărții, adaugi un geographic field direct lângă celelalte. Pentru o țară, ai folosi un MultiPolygonField. În timp ce un PointField este perfect pentru stocarea unei singure perechi de coordonate, cum ar fi o capitală, un MultiPolygonField poate reprezenta granițe naționale complexe, inclusiv națiuni cu mai multe mase de uscat separate sau insule în larg. Când atașezi acest spatial field la modelul tău, definești un sistem de coordonate în fundal. Fiecare geographic field se bazează pe un Spatial Reference System Identifier, cunoscut sub numele de SRID. SRID-ul îi spune bazei de date cum să proiecteze numerele brute ale coordonatelor pe forma reală a Pământului. Dacă nu setezi explicit această valoare, GeoDjango pune automat SRID-ul pe default la 4326. Acel integer specific se referă la standardul WGS84, care este exact același sistem de coordonate folosit de hardware-ul GPS standard. Dacă datele tale sursă se bazează pe o proiecție locală diferită, pur și simplu pasezi acel integer țintă parametrului SRID chiar în interiorul definiției field-ului. Aici devine interesant. Developerii familiarizați cu Django ORM știu că pentru a face o coloană rapidă la query, trebuie să pasezi explicit un database index flag în definiția field-ului. Pentru că spatial queries sunt inerent grele, ai putea presupune că trebuie să configurezi manual indexuri specializate pentru coloanele tale de geometrie. Nu e nevoie. Aceste geographic fields din GeoDjango funcționează diferit. Ele includ un parameter specific pentru spatial indexing, și este default pe true. Când îți rulezi migrations, GeoDjango îi spune automat bazei de date din spate să construiască un spatial index specializat. Obții bounding box queries de înaltă performanță și geographic intersection lookups straight out of the box, cu zero configurare extra. Adevărata putere a proiectării de models în acest fel este că demistifică complet datele spațiale. Un poligon masiv și complex care reprezintă un continent devine doar o altă proprietate pe Python object-ul tău, gata să fie salvat și interogat alături de un simplu număr de populație. Asta e tot pentru azi. Mersi că ai ascultat — du-te și construiește ceva cool.
6

GDAL și OGR API

4m 00s

Acest episod introduce wrapper-ul GDAL și OGR API în interiorul GeoDjango. Vei învăța cum să inspectezi și să citești fișiere vectoriale externe, precum Shapefiles, în mod nativ în Python înainte de a le importa.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 6 din 15. Primești un fișier spațial masiv — un ESRI Shapefile sau un GeoJSON — și trebuie să știi ce atribute conține. Primul tău instinct ar putea fi să instalezi un program GIS de desktop destul de greoi doar ca să arunci o privire înăuntru. Nu e nevoie. GeoDjango poate citi aceste fișiere nativ direct în shell-ul Python folosind API-ul GDAL și OGR. Dacă sistemele informatice geografice sunt o trusă de scule, Geospatial Data Abstraction Library este traducătorul universal. Din punct de vedere tehnic, GDAL gestionează date raster precum imaginile din satelit, în timp ce partenerul său OGR gestionează date vectoriale precum puncte, linii și poligoane. GeoDjango vine cu un wrapper Pythonic peste biblioteca OGR, oferindu-ți o modalitate directă de a inspecta aproape orice format de fișier vectorial de pe planetă. Să zicem că ai descărcat un shapefile care conține granițele tuturor țărilor din lume. Înainte să scrii un script pentru a importa aceste date, trebuie să știi exact cum sunt structurate. Începi prin a importa obiectul DataSource din modulul GDAL al GeoDjango. Creezi o nouă sursă de date pasându-i calea către shapefile-ul tău. Acest obiect reprezintă acum întregul tău dataset spațial descărcat. O sursă de date își organizează informațiile spațiale în layere. Poți cere sursei de date numărul de layere. Un ESRI Shapefile conține în mod tradițional un singur layer, dar formatele precum GeoPackages pot conține zeci. Extragi acel prim layer folosind indexul său, exact ca atunci când scoți un element dintr-o listă Python standard. Aici e ideea de bază. Obiectul layer este locul unde are loc introspecția propriu-zisă. Acesta acționează ca un container pentru înregistrările spațiale individuale, pe care API-ul le numește features. Poți cere layerului să returneze numărul total de features. Pentru fișierul nostru cu granițele lumii, numărul ar trebui să se potrivească aproximativ cu numărul de țări de pe Pământ. De asemenea, poți cere layerului tipul său de geometrie. Asta confirmă dacă datele sunt formate din puncte, linii sau poligoane. Pentru granițele țărilor, tipul returnat va fi de obicei MultiPolygon. Mai departe, trebuie să știi ce metadate sunt atașate acelor forme. Poți cere layerului lista sa de fields. Asta returnează o listă de string-uri care reprezintă numele coloanelor de atribute. S-ar putea să vezi nume care corespund unui cod intern de țară, unui nume comun și numărului populației. Poți chiar să mergi un nivel mai în profunzime. Accesând un feature individual din layer prin indexul său, poți inspecta o singură țară. Poți cere acelui feature specific valoarea field-ului său pentru numele comun. De asemenea, poți accesa obiectul de geometrie specific acelui feature și îi poți cere să-și afișeze coordonatele ca Well-Known Text sau GeoJSON. Acum ai cartografiat exact ce forme conține fișierul, numele atributelor sale și structura înregistrărilor sale. Ai făcut toate astea exclusiv prin Python, fără să scrii un script de import pentru baza de date sau să te bazezi pe un software extern de vizualizare. Wrapper-ul GDAL transformă shell-ul tău standard de Python într-o lentilă de explorare pentru datele spațiale, permițându-ți să validezi fișiere externe înainte ca măcar o singură înregistrare să ajungă în baza ta de date. Asta e tot pentru acest episod. Mersi că ai ascultat și continuă să construiți!
7

Ingerarea datelor spațiale cu LayerMapping

3m 56s

Acest episod acoperă automatizarea importurilor de date spațiale. Vei învăța cum să folosești utilitarul LayerMapping pentru a mapa datele externe Shapefile direct în modelele tale GeoDjango, fără efort.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 7 din 15. Să imporți manual mii de poligoane geografice și metadatele lor ar putea dura zile întregi. Fișierele tale sursă au nume de coloane criptice și tipuri care nu se potrivesc, dar baza ta de date cere o structură strictă. Soluția este utilitarul LayerMapping din GeoDjango, care gestionează tot acest proces de ingestie cu exact un singur dictionary. Când lucrezi cu date spațiale, primești adesea fișiere vectoriale precum ESRI Shapefiles. Aceste fișiere conțin atât formele geometrice ale locațiilor, cât și datele atributelor atașate acelor forme. Totuși, fișierele externe se potrivesc foarte rar cu schema bazei tale de date. Un Shapefile ar putea avea o coloană pentru populație abreviată ca POP2005 și un cod de țară trecut ca ISO2. Modelul tău Django impecabil, să-l numim WorldBorder, are fields clar denumite și strict tipizate exact pentru acele atribute. Ai putea fi tentat să folosești importuri SQL manuale sau tool-uri de baze de date precum pgAdmin ca să împingi aceste date în PostGIS. LayerMapping este o abordare complet diferită. Este un utilitar programatic, un script Python. Trăiește direct în proiectul tău Django, legând fișierele spațiale externe direct de Object Relational Mapper-ul tău. Iată ideea de bază. Nucleul LayerMapping este un simplu dictionary Python. Cheile acestui dictionary sunt numele acelor fields curate din modelul tău Django. Valorile sunt numele brute, de tip string, ale atributelor din fișierul tău sursă. De exemplu, dictionary-ul tău mapează acel field name din modelul Django la atributul NAME din Shapefile. Mapează acel field pentru populație din modelul tău la POP2005, și acel field pentru codul ISO la ISO2. De asemenea, mapezi acel field de geometrie din modelul tău la tipul de geometrie al Shapefile-ului, care este de obicei reprezentat printr-un string precum MULTIPOLYGON. Ca să automatizezi asta, scrii un scurt fișier Python, numit de obicei un load script. În interiorul acestui script, imporți modelul tău WorldBorder și tool-ul LayerMapping. Îți definești acel mapping dictionary. Apoi, creezi o nouă instanță LayerMapping. Îi pasezi acestei instanțe trei informații obligatorii. În primul rând, modelul tău Django. În al doilea rând, acel file path către Shapefile-ul tău sursă. În al treilea rând, acel mapping dictionary pe care tocmai l-ai creat. De asemenea, poți oferi argumente opționale pentru a controla comportamentul de ingestie. Dacă datele tale sursă sunt deja exact în sistemul de referință spațială pe care îl așteaptă baza ta de date, poți spune utilitarului să nu facă transformări de coordonate. Asta sare peste calculele inutile și accelerează importul. În cele din urmă, apelezi metoda save pe instanța ta LayerMapping. Când execuți acest script, utilitarul preia controlul în întregime. Deschide Shapefile-ul, iterează prin fiecare feature geografic în parte și folosește acel dictionary pentru a alinia atributele dezordonate ale fișierului cu acele fields stricte ale modelului tău. Traduce automat geometria brută într-un format pe care PostGIS îl înțelege și salvează înregistrările în baza ta de date. Poți instrui metoda save să arunce o excepție la prima eroare pe care o întâlnește, sau o poți lăsa să ruleze și pur și simplu să facă log la orice features problematice în terminalul tău. Cel mai important aspect este că LayerMapping decuplează complet structura rigidă a fișierelor spațiale externe de designul curat al bazei tale de date, permițându-ți să faci ingestie de dataset-uri masive cu doar câteva linii de Python. Înainte să încheiem, dacă îți place emisiunea și vrei să ne ajuți să continuăm, ne poți susține căutând DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Îți mulțumesc că ne asculți și continuă să construiești!
8

GEOS API: Geometrie Pythonică

3m 40s

Acest episod se concentrează pe GEOS API pentru manipularea pythonică a geometriei. Vei învăța cum să efectuezi operațiuni topologice, precum reuniuni și intersecții, în memorie, fără a interoga baza de date.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 8 din 15. S-ar putea să crezi că de fiecare dată când ai nevoie să îmbini două poligoane sau să găsești o intersecție spațială, trebuie să scrii un query și să aștepți ca baza de date să returneze un răspuns. Realitatea este că poți face calcule spațiale complexe direct în shell-ul Python, fără să atingi vreodată o conexiune la baza de date. Exact asta acoperim astăzi: API-ul GEOS și geometria Pythonică. O concepție greșită des întâlnită despre GeoDjango este că PostGIS se ocupă de tot greul pe partea spațială. Deși PostGIS este incredibil de puternic, API-ul GEOS îți permite să efectuezi operații geometrice în întregime în memoria locală. GEOS vine de la Geometry Engine Open Source. Este o librărie C++ extrem de optimizată, dar GeoDjango îți oferă un wrapper puternic numit obiectul GEOSGeometry. Acest obiect te lasă să creezi, să manipulezi și să analizezi geometrii exclusiv în Python. Aici devine interesant. Un obiect GEOSGeometry nu se simte ca un wrapper greoi peste o librărie C. Se comportă exact ca un container Python nativ. Dacă ai un LineString cu zece puncte, poți rula funcția standard Python length pe el ca să vezi că are zece coordonate. Poți itera printr-un Polygon cu un for-loop standard pentru a extrage inelele sale individuale, sau poți folosi un index pentru a scoate un punct specific dintr-o geometrie MultiPoint. Se comportă exact ca niște liste sau tuple de coordonate familiare. Adevărata putere se deblochează atunci când aplici operații topologice. Să spunem că construiești o aplicație de logistică și ai două zone de livrare care se suprapun, definite ca GEOS Polygons. Trebuie să găsești zona exactă în care aceste două zone se suprapun. Nu trebuie să salvezi aceste zone într-un model și să rulezi un query pe baza de date. În schimb, poți genera suprapunerea instantaneu în memorie. Mai întâi, instanțiezi două obiecte GEOSGeometry care reprezintă zonele tale de livrare. Apoi, poți pur și simplu să apelezi metoda intersection pe primul poligon, pasând al doilea poligon ca argument. Pentru că API-ul este profund Pythonic, poți folosi direct operatorul bitwise AND. Tastezi efectiv poligonul unu, un ampersand și poligonul doi. Asta returnează un obiect GEOSGeometry complet nou, care reprezintă forma exactă a suprapunerii. Ai acces la o suită completă de astfel de operații spațiale. Dacă trebuie să găsești zona acoperită de prima zonă de livrare, dar strict în afara celei de-a doua, folosești metoda difference, sau operatorul obișnuit minus din Python. Dacă vrei să le îmbini într-o singură zonă masivă, folosești metoda union, sau operatorul bitwise OR pipe. Poți chiar să generezi forme noi din senin. Apelarea metodei buffer pe o geometrie de tip point cu un argument width calculează și returnează instantaneu un poligon care reprezintă un cerc perfect desenat în jurul acelui punct. Pentru că totul se bazează pe motorul C++ din spate, aceste calcule se fac extrem de rapid. Ideea principală aici este că API-ul GEOS îți oferă un motor spațial independent, in-memory, care îți permite să validezi geometrii, să calculezi buffere și să găsești intersecții înainte ca un singur byte de date să ajungă vreodată în baza ta de date. Asta e tot pentru acest episod. Ne auzim data viitoare!
9

Stăpânirea Spatial Lookups

4m 09s

Acest episod explică lookup-urile pentru interogări geografice în Django ORM. Vei învăța cum să folosești filtre spațiale pentru a găsi relații, cum ar fi ce puncte sunt conținute în anumite granițe.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 9 din 15. Uită să mai scrii comparații masive de coordonate. Ai o locație a utilizatorului și o zonă de livrare și trebuie să știi dacă se suprapun. Să faci asta matematic înseamnă să verifici sute de muchii de poligon în logica aplicației tale. În schimb, GeoDjango reduce asta în întregime la o operațiune de bază de date. Astăzi, învățăm să stăpânim spatial lookups. Dacă ai folosit Django, știi sintaxa double-underscore pentru filtrarea de querysets. Adaugi ceva de genul double-underscore exact sau double-underscore in la numele unui field. GeoDjango extinde exact aceeași sintaxă pentru a executa relații topologice PostGIS complexe. Relațiile topologice sunt doar reguli despre modul în care geometriile împart spațiul. Se ating? Se suprapun? Este una complet în interiorul celeilalte? GeoDjango îți oferă lookup types dedicate pentru a pune aceste întrebări direct în query-urile tale ORM. Cel mai comun și mai permisiv spatial lookup este intersects. Dacă filtrezi un geometry field cu double-underscore intersects, baza de date returnează înregistrări în care cele două geometrii împart orice porțiune de spațiu. Se pot intersecta, se pot atinge la o margine, sau una o poate cuprinde complet pe cealaltă. Atâta timp cât există orice spațiu comun, intersects este evaluat la true. Adesea, ai nevoie de mai multă precizie decât o simplă intersecție. Ai nevoie de limite stricte. Aici intră în joc contains și within. Developerii le confundă pe acestea două constant. Iată ideea cheie. Diferența este pur direcțională. Dacă geometria A contains geometria B, atunci geometria B este within geometria A. Gândește-te la o cutie și o bilă. Cutia conține bila. Bila este în interiorul cutiei. Alegi acel lookup pe baza geometriei care se află în coloana din baza de date și a geometriei pe care o pasezi ca argument de filter. Ia în considerare un scenariu concret. Ai un tabel în baza de date cu case, iar fiecare casă are o geometrie de tip point care îi reprezintă locația. Orașul tocmai a lansat un nou poligon care definește o zonă de inundații. Trebuie să găsești toate casele care se află perfect în interiorul acelei zone de risc. Nu faci un query pe zona de inundații ca să vezi ce conține. Faci query pe case. Apelezi filter pe modelul casei, faci referință la acel point geometry field, adaugi double-underscore within și pasezi poligonul zonei de inundații ca valoare. Când execuți acel query, Django traduce acel double-underscore lookup într-un function call nativ PostGIS, mai exact ST_Within. Motorul bazei de date evaluează geometriile folosind indecșii săi spațiali optimizați. Verifică dacă absolut fiecare coordonată a punctului casei se află în interiorul poligonului zonei de inundații. Dacă casa se află exact pe marginea poligonului, nu este considerată within. Strict containment înseamnă că interiorul primei geometrii trebuie să fie complet în interiorul celei de-a doua geometrii. Dacă inversezi scenariul, să zicem că faci un query pe un tabel din baza de date cu cartiere pentru a-l găsi pe cel care înconjoară o anumită locație a utilizatorului, folosești double-underscore contains. Filtrezi acel polygon field al cartierului, adaugi double-underscore contains și pasezi punctul utilizatorului. Logica este identică în spate, dar ordinea argumentelor spațiale pasate către PostGIS este inversată. Înțelegerea acestei logici direcționale previne silent failures și querysets goale. Prin maparea operațiunilor PostGIS direct la keyword arguments din Django, filtrezi eficient seturi masive de date spațiale fără să scrii raw SQL. Geometria în funcție de care filtrezi dictează întotdeauna direcția acelui spatial lookup. Mersi că m-ai ascultat. Pe data viitoare!
10

Interogări de distanță de înaltă performanță

4m 11s

Acest episod abordează interogările de proximitate și distanță de înaltă performanță. Vei învăța cum să folosești lookup-urile de distanță și obiectul de distanță geografică pentru a găsi eficient locațiile din apropiere.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 10 din 15. Query-urile de rază sunt baza aplicațiilor location-based. Dacă le scrii greșit, baza ta de date calculează distanța exactă până la fiecare rând din tabel, forțând un full scan masiv. Dacă le scrii corect, durează milisecunde. Query-urile de distanță high-performance fac diferența dintre o aplicație care se mișcă instant și una care crapă sub load. O greșeală comună pe care o fac developerii este să se gândească la query-urile spațiale în același mod în care se gândesc la matematica de bază. Abordarea naivă este să calculezi distanța precisă de la punctul tău target la fiecare alt punct din baza de date, iar apoi să filtrezi tot ce este mai mare decât raza ta maximă. Nu ar trebui să faci niciodată asta. Calcularea distanțelor reale pe o sferă este foarte costisitoare computațional. Dacă query-ul tău filtrează calculând mai întâi distanța, baza de date nu își poate folosi indecșii spațiali. Este forțată să verifice absolut fiecare rând. Pentru a menține query-urile rapide, trebuie să te bazezi pe lookup-uri susținute de indecși. Înainte să ne uităm la lookup-urile din baza de date, ai nevoie de o modalitate prin care să exprimi distanța clar în codul tău Python. GeoDjango oferă obiectul Distance, importat de obicei simplu, ca litera mare D. Îl inițializezi cu o unitate și o valoare. De exemplu, dacă pasezi argumentul m i egal cu cinci acestui obiect, creezi o măsurătoare de exact cinci mile. Poți folosi kilometri, metri sau chiar grade. Asta normalizează măsurătoarea în Python înainte ca query-ul să lovească baza de date. Imaginează-ți un scenariu în care implementezi un feature care găsește toate cafenelele aflate pe o rază de cinci mile de ping-ul GPS curent al unui utilizator. Ai punctul de locație al utilizatorului și vrei să faci un query pe modelul tău de cafenea. Ai putea folosi lookup-ul distance less-than-or-equal. Scrii un filtru de query în care câmpul de locație al cafenelei este urmat de un double underscore și cuvântul distance, un underscore și literele l t e. Îi pasezi un tuple care conține punctul utilizatorului și obiectul tău distance setat la cinci mile. Asta funcționează. Se traduce într-o funcție de bază de date care verifică dacă distanța este mai mică sau egală cu cinci mile. Dar, în funcție de backend-ul tău spațial și de cum sunt setate coloanele tale, acest lookup ar putea totuși să facă mai multă muncă matematică decât este strict necesar, calculând distanțele exacte înainte de a face comparația finală. Aici este ideea cheie. Rareori ai nevoie să știi distanța exactă pentru a filtra o rază. Trebuie doar să știi dacă obiectul se află în interiorul cercului. Aici devine esențial lookup-ul dwithin. În loc de distance less-than-or-equal, adaugi un double underscore și cuvântul dwithin la câmpul tău de locație. Îi pasezi exact același punct al utilizatorului și obiectul distance de cinci mile. În spate, asta rutează direct către funcția PostGIS ST DWithin. Această funcție este extrem de optimizată. Face mai întâi o verificare rapidă de tip bounding-box, care îți folosește perfect indecșii spațiali. Desenează un pătrat brut în jurul razei tale de cinci mile și elimină imediat orice puncte din afara acelui pătrat, fără a face matematică sferică complexă. Face calcule precise și costisitoare doar pentru puținele puncte care pică aproape de marginea cercului, în interiorul acelui pătrat. Dacă tabelul bazei tale de date folosește coloane de tip geography în loc de coloane basic de tip geometry, PostGIS gestionează automat curbura Pământului, păstrând în același timp utilizarea indecșilor extrem de rapidă. Cel mai valoros obicei în programarea spațială este să realizezi că verificarea dacă un punct se află în interiorul unei forme este mereu mai ieftină decât să scoți o ruletă pentru a calcula distanța exactă dintre ele. Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
11

Funcții geografice ale bazei de date

4m 12s

Acest episod explorează funcțiile spațiale ale bazei de date accesibile prin GeoDjango. Vei învăța cum să calculezi arii, să extragi centroizi și să generezi GeoJSON direct în stratul bazei de date.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 11 din 15. Ai o bază de date plină de poligoane masive și complexe, iar frontend-ul tău trebuie doar să afișeze un map pin în centrul fiecăruia. Dacă faci fetch la acele poligoane brute în Python pentru a calcula centrul, tragi megabytes de date de coordonate inutile prin rețea. Soluția este să împingi acele calcule în baza de date folosind Geographic Database Functions. Există două modalități de a obține informații spațiale, cum ar fi aria sau un center point în GeoDjango. Prima este să faci query pe înregistrarea din baza de date, să tragi întreaga geometrie într-un obiect GEOS din Python și să accesezi o proprietate precum dot area pe el. Nu face asta decât dacă ai cu adevărat nevoie de geometria completă în Python. Să faci fetch la granița unui parc național ar putea însemna încărcarea a zeci de mii de vertecși în memorie doar pentru a calcula un singur număr. A doua modalitate, mult mai eficientă, este să îi spui lui PostGIS să calculeze răspunsul și să trimită înapoi doar rezultatul final. Aici devin esențiale Geographic Database Functions, combinate cu metoda annotate din Django ORM. Hai să ne uităm la un scenariu practic. Construiești un API care listează parcuri naționale. Pentru list view, aplicația client are nevoie doar de numele parcului, aria sa totală și o singură coordonată centrală pentru a plasa un map pin. Nu are nevoie de poligonul complex al graniței. În queryset-ul tău din Django, folosești metoda annotate. Îi spui să creeze un atribut nou, poate numit park area, și îl setezi egal cu funcția Area care acționează asupra coloanei tale de geometrie. Lângă el, creezi un alt atribut numit center point, setat egal cu funcția Centroid pe aceeași coloană de geometrie. În cele din urmă, restricționezi output-ul query-ului doar la nume și la cele două adnotări noi. Când acest query se execută, PostGIS citește datele de geometrie brute de pe disk. Rulează rutine interne extrem de optimizate pentru a calcula aria spațială și a găsi acel center point matematic. Apoi returnează exact trei lucruri prin rețea către aplicația ta Django: un string de text pentru nume, un număr pentru arie și o geometrie de tip single point pentru centru. Ocolești complet costurile de bandwidth și memorie pentru transferul poligonului mare. Această strategie se aplică multor operații spațiale. Poți folosi funcția Transform în interiorul unei adnotări pentru a converti coordonatele din proiecția de stocare a bazei de date direct în proiecția de care are nevoie web map-ul tău, cum ar fi Web Mercator. Baza de date se ocupă de matematica din spate înainte ca Python măcar să vadă datele. De asemenea, poți folosi funcția AsGeoJSON. Aceasta instruiește PostGIS să formateze datele spațiale într-un string de text JSON standard direct în baza de date. Când Django îl primește, este doar text gata de a fi pasat direct către frontend-ul tău, evitând complet overhead-ul de serializare din Python. Poți, de asemenea, să aplici funcții agregate pe queryset-uri întregi. Funcția Extent analizează un grup de geometrii și returnează un singur bounding box care le acoperă pe toate. Dacă un user caută toate parcurile dintr-o anumită regiune, returnarea funcției Extent îți oferă coordonatele exacte necesare pentru a da zoom automat pe harta din frontend, astfel încât să încadreze perfect toate rezultatele. Iată ideea principală. Baza ta de date spațială este un motor de calcul extrem de specializat, nu doar un container de stocare. Păstrează calculele spațiale grele în PostGIS și mută doar răspunsurile calculate prin rețea către Python. Asta e tot pentru episodul ăsta. Ne auzim data viitoare!
12

Date Raster în PostGIS

4m 20s

Acest episod introduce rasterele PostGIS și RasterFields din GeoDjango. Vei învăța cum să stochezi și să interoghezi date spațiale continue, cum ar fi modelele de elevație sau hărțile de temperatură.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 12 din 15. Formele vectoriale sunt excelente atunci când vrei să trasezi o linie clară în jurul graniței unui oraș sau să marchezi locația unui utilizator. Dar ce se întâmplă când trebuie să cartografiezi ceva ce nu are limite clare, cum ar fi variația temperaturii pe un continent sau altitudinea unui întreg lanț muntos? Nu poți desena un poligon pentru fiecare grad de temperatură în parte. Aici intervin datele raster din PostGIS. Dacă ești obișnuit să lucrezi cu puncte, linii și poligoane, datele raster necesită o schimbare de perspectivă. Datele raster nu sunt alcătuite din forme discrete. Ele reprezintă o grilă continuă de pixeli, exact ca o fotografie digitală. Dar în loc de valori de culoare pentru roșu, verde și albastru, fiecare pixel conține o anumită valoare numerică. Aceste date pot reprezenta precipitațiile, tipul de sol sau altitudinea. Întreaga grilă este legată matematic de lumea reală prin georeferențiere. Asta înseamnă că baza de date știe exact unde se află fiecare pixel pe hartă. În GeoDjango, gestionarea acestor date implică în principal două componente: RasterField și obiectul GDALRaster. RasterField este tipul coloanei din baza de date. Îl adaugi la modelul tău Django la fel cum ai adăuga un geometry field. Asta îi spune lui PostGIS să aloce intern spațiu pentru datele din grilă. Dar nu interacționezi direct cu raw bytes din baza de date. Când extragi un raster din baza de date, sau înainte să introduci unul, folosești GDALRaster. Acesta este un wrapper de Python peste librăriile geospațiale din spate. Îți permite să inspectezi proprietățile rasterului, cum ar fi scara, sistemul de referință pentru coordonate și valorile efective din interiorul benzilor sale. O bandă este pur și simplu un singur layer de date din grilă. O imagine standard are trei benzi pentru culoare, dar o hartă de elevație are de obicei o singură bandă care reprezintă înălțimea. Ia în considerare un scenariu concret. Construiești o aplicație pentru pasionații de drumeții și ai un Digital Elevation Model al unui lanț muntos. Acest model de elevație este de obicei furnizat sub formă de fișier GeoTIFF. Mai întâi, definești un model Django pentru lanțul muntos și îi adaugi un RasterField. Apoi, în codul tău Python, instanțiezi un GDALRaster pasându-i file path-ul către fișierul tău GeoTIFF. Django încarcă fișierul în memorie ca un obiect GDALRaster. Atribui acel obiect câmpului RasterField de pe modelul tău pentru munte și apelezi save. PostGIS preia acea grilă și o stochează. Acum, când un pasionat de drumeții face upload la ruta sa GPS, poți face un query în baza de date pentru a afla exact în ce pixel se încadrează coordonatele sale. Extragi valoarea elevației stocată în acel pixel. Când citești acel câmp înapoi din baza de date, Django îți dă din nou un obiect GDALRaster. Poți cere acestui obiect lățimea, înălțimea sau extinderea sa spațială. Poți accesa array-urile cu datele brute ale pixelilor direct în Python pentru a face calcule înainte de a trimite datele către front end-ul aplicației tale. Iată ideea cheie. Folosești vectori pentru lucruri care există într-un anumit loc și folosești rastere pentru lucruri care există peste tot într-o zonă. Combinându-le pe amândouă în PostGIS, aplicația ta poate face legătura între obiecte discrete, cum ar fi un traseu de drumeție, și medii continue, cum ar fi altitudinea reală a solului de sub picioare. Dacă vrei să ajuți ca acest show să meargă mai departe, poți căuta DevStoriesEU pe Patreon — sprijinul tău înseamnă enorm. Asta e tot pentru acest episod. Îți mulțumesc că m-ai ascultat și continuă să construiești!
13

Geolocație cu GeoIP2

4m 13s

Acest episod acoperă geolocația bazată pe IP folosind modulul GeoIP2 din GeoDjango. Vei învăța cum să mapezi adresele IP ale utilizatorilor la orașe și țări folosind seturile de date MaxMind.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 13 din 15. Cum procedezi dacă trebuie să știi unde se află un utilizator pentru a-i oferi conținut local, dar nu ți-a acordat permisiuni de GPS? Adresa lui IP de intrare conține răspunsul. Asta este geolocalizarea cu GeoIP2. Ca să fim clari de la bun început, geolocalizarea IP nu este un lookup precis de coordonate, precum un API de geolocalizare din browser. Este o aproximare. Când faci un lookup pe o adresă IP, faci un query pe un dataset static care mapează blocurile de IP-uri alocate către zone geografice. Îți dă țara corectă aproape de fiecare dată, și orașul corect destul de des, dar nu va găsi adresa fizică exactă a utilizatorului. Imaginează-ți un scenariu în care un vizitator ajunge pe site-ul tău de e-commerce. Vrei să îl redirecționezi automat către storefront-ul localizat pentru țara lui sau să pui ca default centrul unei hărți pe regiunea lui, bazându-te exclusiv pe adresa IPv4 sau IPv6 de intrare. GeoDjango oferă obiectul GeoIP2 special pentru a gestiona acest lookup offline. Înainte să poți scrie orice logică, ai nevoie de piesele potrivite la locul lor. În primul rând, instalezi librăria Python geoip2 în environment-ul tău. În al doilea rând, ai nevoie de datele propriu-zise. GeoIP2 se bazează pe dataset-uri MaxMind, de obicei bazele de date gratuite GeoLite2 City sau Country. Descarci aceste fișiere, care au o extensie mmdb, și le pui pe serverul tău. În cele din urmă, în setările Django, definești o variabilă numită GEOIP_PATH și o pointezi către directorul care conține acele fișiere. Django se așteaptă să găsească fișiere cu nume specifice, cum ar fi GeoLite2-City dot mmdb, în acel folder. Cu setup-ul complet, utilizarea tool-ului necesită doar câțiva pași. Imporți obiectul GeoIP2 din modulul django contrib gis geoip2 și îl instanțiezi. Extragi string-ul adresei IP de intrare din request headers și îl pasezi uneia dintre metodele de lookup. Dacă ai nevoie doar de un routing logic general, apelezi metoda country. Pasezi adresa IP, iar ea returnează un dictionary care conține codul și numele țării. Dacă ai nevoie de mai multă granularitate pentru a centra o hartă, apelezi în schimb metoda city. Aceasta returnează un dictionary mai bogat, care conține numele orașului, regiunea și valorile aproximative de longitudine și latitudine. Metoda city include și datele despre țară, așa că trebuie să faci un singur call. Dacă vrei pur și simplu coordonatele pentru a le pasa unei alte funcții, există metode dedicate, cum ar fi coords, care returnează un tuple de bază cu longitudinea și latitudinea. De asemenea, trebuie să gestionezi erorile elegant. Dacă pasezi o adresă IP invalidă, sau o adresă care pur și simplu nu este prezentă în baza de date MaxMind, GeoIP2 nu returnează un dictionary gol. Ridică o GeoIP2Exception. Trebuie să îți pui call-urile de lookup într-un try block și să oferi o fallback location default pentru storefront-ul tău atunci când lookup-ul eșuează. Iată ideea cheie. Codul în sine este, în esență, doar un file reader optimizat. Precizia geolocalizării depinde în întregime de cât de fresh este baza de date din directorul tău GEOIP_PATH. Alocările de IP-uri se schimbă constant. Dacă construiești un routing system în jurul GeoIP2, trebuie să automatizezi descărcarea regulată a noilor fișiere de bază de date, altfel redirect-urile tale localizate vor deveni încet și silențios incorecte. Asta e tot pentru acest episod. Ne auzim data viitoare!
14

Testarea aplicațiilor spațiale

4m 13s

Acest episod se concentrează pe testarea aplicațiilor spațiale în GeoDjango. Vei învăța cum să-ți configurezi suita de teste, să gestionezi bazele de date șablon PostGIS și să setezi privilegiile utilizatorilor.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 14 din 15. Testarea aplicațiilor spațiale are o particularitate unică: baza ta de date de teste automate trebuie să instaleze extensii spațiale complexe la nivel de C înainte ca măcar primul test să ruleze. Dacă pipeline-ul tău automat crapă instantaneu cu erori de permisiuni, probabil ăsta e motivul. Astăzi, ne uităm la Testarea Aplicațiilor Spațiale. Prima cerință ține strict de configurare. Când rulezi teste, Django creează o bază de date de test paralelă pentru a-ți păstra datele de producție în siguranță. Pentru GeoDjango, această bază de date de test trebuie să fie spațială. Asta înseamnă că setările bazei tale de date trebuie să folosească explicit un motor spațial, cum ar fi backend-ul PostGIS oferit de GeoDjango. Nu poți folosi backend-ul standard Postgres ca să adaugi pur și simplu câmpuri spațiale mai târziu. Backend-ul spațial este cel care îi spune test runner-ului din Django să caute și să inițializeze feature-urile spațiale necesare. Aici e ideea de bază. Test runner-ul standard din Django creează o bază de date fresh, îți rulează migrations și începe testarea. Dar pentru o aplicație GeoDjango, crearea unei baze de date fresh nu e de ajuns. Baza de date trebuie să încarce și extensia PostGIS. Asta nu e un tabel SQL standard. Este o extensie la nivel de sistem. By default, PostgreSQL restricționează cine poate crea extensii din motive de securitate. De obicei, necesită un user de bază de date cu privilegii de superuser. Exact aici pică adesea pipeline-urile de continuous integration. Pornești un container de Postgres, îi pasezi un user standard de bază de date și îi spui lui Django să ruleze testele. Django se conectează, încearcă să construiască baza de date de test, încearcă să ruleze comanda pentru a crea extensia PostGIS și se lovește de o eroare de permission denied. Ca să repari asta într-un pipeline automat, userul bazei de date care execută testele trebuie să aibă privilegiile necesare. Cea mai simplă abordare într-un mediu izolat, throwaway, este să-i acorzi temporar userului de test roluri de superuser. Dacă politicile tale de securitate interzic accesul de superuser chiar și într-un container temporar, trebuie să configurezi PostgreSQL astfel încât userul de test respectiv să fie un owner de încredere al bazei de date de test și să aibă permisiunea explicită de a crea extensia PostGIS. Odată ce baza de date este construită, GeoDjango trebuie să știe cu ce lucrează. Diferite versiuni de PostGIS suportă diferite funcții spațiale. În timpul operațiunilor normale, GeoDjango face un query în baza de date pentru a determina versiunea de PostGIS instalată. Totuși, într-un mediu de test, poți ocoli acest query definind o setare specifică numită PostGIS Version. O oferi sub forma unui tuple de trei numere, reprezentând versiunile major, minor și patch. Setarea explicită a acestei opțiuni poate accelera inițializarea testelor și acționează ca un fail-safe dacă conexiunea la baza de date are probleme în timpul verificării inițiale a versiunii. Rularea testelor spațiale nu înseamnă să scrii assertions diferite. Este în primul rând o provocare de infrastructură. Cea mai importantă idee de reținut e că, dacă userul bazei tale de date de test nu poate crea extensii on the fly, testele tale nici măcar nu vor începe. Rezolvă privilegiile userului de test pentru a face bootstrap la PostGIS, iar restul pipeline-ului tău se va comporta exact ca un test suite standard din Django. Mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
15

Deploy-ul aplicațiilor GeoDjango

4m 02s

Acest episod încheie seria discutând considerentele de deploy pentru aplicațiile GeoDjango. Vei învăța despre siguranța firelor de execuție în GDAL și cum să-ți configurezi procesele WSGI pentru a preveni blocajele.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. GeoDjango și PostGIS, episodul 15 din 15. Aplicația ta spațială rulează perfect pe laptop. Îi faci deploy pe un server de producție, traficul crește brusc și, dintr-o dată, aplicația dă crash în mod silențios. Niciun traceback Python standard, doar procese moarte. Problema este un clash de threads adânc în interiorul unei librării C. Să faci deploy la aplicații GeoDjango necesită să eviți exact această capcană. Deploy-ul unei aplicații web spațiale este aproape identic cu deploy-ul unui proiect Django standard. Routing-ul, conexiunile la baza de date și arhitectura serverului urmează exact aceleași reguli. Dar GeoDjango are o variabilă ascunsă. Această variabilă este Geospatial Data Abstraction Library, cunoscută în mod obișnuit sub numele de GDAL. GDAL este o librărie C masivă, extrem de optimizată, care duce greul pentru formatele de date geografice și transformările de coordonate. Iată ideea cheie. GDAL nu este thread-safe. Asta explică de ce codul tău funcționează local, dar dă crash pe server. Serverul local de development Django gestionează request-urile secvențial. Rareori declanșează acces concurent la librăria C. Serverele WSGI de producție sunt construite diferit. Pentru a gestiona eficient traficul ridicat, serverele precum Apache cu mod_wsgi pornesc de obicei mai multe threads într-un singur proces. Python se bazează de obicei pe Global Interpreter Lock pentru a împiedica threads-urile să intre în coliziune. Cu toate acestea, librăriile C își gestionează propria memorie complet în afara controlului Python. Dacă două threads WSGI încearcă să execute simultan o funcție GDAL, ele accesează același spațiu de memorie fără verificări de siguranță. Un thread corupe datele pe care le folosește celălalt thread. Pentru că asta se întâmplă la nivel de C, Python nu poate arunca o excepție standard. Rezultatul este un segmentation fault. Procesul serverului pică instantaneu, trăgând după el orice request-uri active ale utilizatorilor. Pentru a rezolva asta, trebuie să schimbi modul în care serverul tău WSGI gestionează concurența. Trebuie să te bazezi pe procese în loc de threads. Sistemele de operare izolează procesele unele de altele, oferind fiecărui proces propriul spațiu de memorie dedicat. Dacă faci deploy în producție la o aplicație geografică cu trafic intens folosind Apache și mod_wsgi, gestionezi asta în configurația daemon-ului. În loc să configurezi un număr mic de procese cu un pool mare de threads, restricționezi numărul de threads. Deschizi fișierul de configurare Apache și localizezi directiva WSGI daemon process. Pe lângă numele aplicației, adaugi un parametru care setează explicit threads la exact unu. Apoi scalezi aplicația prin creșterea numărului de procese pentru a gestiona load-ul așteptat. Aceeași logică se aplică dacă folosești un server precum Gunicorn. Trebuie să îi faci bind pe procese worker standard. Eviți orice worker class care introduce threading sau event loops asincrone, deoarece acestea vor declanșa inevitabil aceleași coliziuni GDAL. Forțarea serverului tău WSGI într-un model multi-proces, single-threaded, garantează că GDAL nu intră niciodată în coliziune cu el însuși. Cel mai crucial pas pentru a face o aplicație GeoDjango production-ready este izolarea librăriilor C de concurența threaded. Aici se încheie întreaga noastră serie despre GeoDjango și PostGIS. Cea mai bună modalitate de a consolida aceste concepte este să citești documentația oficială Django și să construiești ceva hands-on. Dacă ai idei despre ce tehnologie ar trebui să acoperim în continuare, vizitează devstories dot eu și sugerează un subiect. Mulțumesc pentru audiție. Aveți grijă de voi, tuturor.