Více

Prostorové shlukování s PostGIS?

Prostorové shlukování s PostGIS?


Hledám prostorový shlukovací algoritmus pro jeho použití v databázi s podporou PostGIS pro bodové funkce. Budu psát funkci plpgsql, která bere vzdálenost mezi body ve stejném clusteru jako vstup. Na výstupní funkci vrátí pole shluků. Nejviditelnějším řešením je vybudování vyrovnávacích zón určených vzdáleností kolem prvku a hledání prvků do této vyrovnávací paměti. Pokud takové funkce existují, pokračujte v budování vyrovnávací paměti kolem nich atd. Pokud takové funkce neexistují, znamená to, že je stavba clusteru dokončena. Možná existují nějaká chytrá řešení?


Pro PostGIS existují alespoň dvě dobré metody shlukování: k- znamená (prostřednictvímkmeans-postgresqlrozšíření) nebo shlukové geometrie v prahové vzdálenosti (PostGIS 2.2)


1) k- znamená skmeans-postgresql

Instalace: Musíte to zkompilovat a nainstalovat ze zdrojového kódu, což je na * NIXu snadnější než na Windows (nevím, kde začít). Pokud máte PostgreSQL nainstalovaný z balíčků, ujistěte se, že máte také vývojové balíčky (např.postgresql-develpro CentOS).

Stahujte, extrahujte, sestavujte a instalujte:

wget http://api.pgxn.org/dist/kmeans/1.1.0/kmeans-1.1.0.zip rozbalte kmeans-1.1.0.zip cd kmeans-1.1.0 / make USE_PGXS = 1 sudo make install

Povolte příponu v databázi (pomocí psql, pgAdmin atd.):

VYTVOŘIT ROZŠÍŘENÍ kmeans;

Použití / příklad: Někde byste měli mít tabulku bodů (v QGIS jsem nakreslil spoustu pseudonáhodných bodů). Zde je příklad toho, co jsem udělal:

SELECT kmeans, count (*), ST_Centroid (ST_Collect (geom)) AS geom FROM (SELECT kmeans (ARRAY [ST_X (geom), ST_Y (geom)], 5) OVER (), geom FROM rand_point) AS ksub GROUP BY kmeans OBJEDNÁVKA podle kmeans;

the5Uvedl jsem ve druhém argumentukmeansfunkcí okna je K. celé číslo k vytvoření pěti klastrů. Můžete to změnit na jakékoli celé číslo, které chcete.

Níže je 31 pseudonáhodných bodů, které jsem nakreslil, a pět centroidů se štítkem, který ukazuje počet v každém klastru. To bylo vytvořeno pomocí výše uvedeného dotazu SQL.


Můžete se také pokusit ilustrovat, kde jsou tyto klastry pomocí ST_MinimumBoundingCircle:

SELECT kmeans, ST_MinimumBoundingCircle (ST_Collect (geom)) AS circle FROM (SELECT kmeans (ARRAY [ST_X (geom), ST_Y (geom)], 5) OVER (), geom FROM rand_point) AS ksub GROUP BY kmeans ORDER BY kmeans;


2) Shlukování v prahové vzdálenosti sST_ClusterWithin

Tato agregační funkce je součástí PostGIS 2.2 a vrací pole GeometryCollections, kde jsou všechny komponenty ve vzájemné vzdálenosti.

Zde je příklad použití, kde vzdálenost 100,0 je prahová hodnota, která má za následek 5 různých klastrů:

SELECT row_number () over () AS id, ST_NumGeometries (gc), gc AS geom_collection, ST_Centroid (gc) AS centroid, ST_MinimumBoundingCircle (gc) AS circle, sqrt (ST_Area (ST_MinimumBoundingCircle (gc)) / pi ()) AS radius (SELECT unnest (ST_ClusterWithin (geom, 100)) gc FROM rand_point) f;

Největší střední klastr má poloměr uzavírajícího kruhu 65,3 jednotek nebo přibližně 130, což je větší než prahová hodnota. Je to proto, že jednotlivé vzdálenosti mezi geometrií prutů jsou menší než prahová hodnota, takže ji spojuje dohromady jako jeden větší shluk.


Napsal jsem funkci, která vypočítává shluky funkcí na základě vzdálenosti mezi nimi a nad těmito vlastnostmi vytváří konvexní trup:

VYTVOŘIT NEBO VYMĚNIT FUNKCI get_domains_n (lname varchar, geom varchar, gid varchar, radius numeric) VRÁCÍ NASTAVENÝ záznam AS $$ DECLARE lid_new integer; celé číslo dmn_number: = 1; outr záznam; Innr záznam; r záznam; ZAČNĚTE TABULKU SNÍŽENÍ POKUD EXISTUJE tmp; PROVÉST 'VYTVOŘIT DOČASNOU TABULKU tmp AS SELECT' || gid || ',' || geom || ' FROM '|| jméno; ALTER TABLE tmp ADD COLUMN dmn integer; ALTER TABLE tmp PŘIDAT SLOUPEK chk boolean DEFAULT FALSE; PROVÉST 'UPDATE tmp SET dmn =' || dmn_number || ', chk = FALSE WHERE' || gid || ' = (SELECT MIN ('|| gid ||') FROM tmp) '; LOOP LOOP FOR outr IN EXECUTE 'SELECT' || gid || ' AS gid, '|| geom ||' AS geom FROM tmp WHERE dmn = '|| dmn_number ||' AND NOT chk 'LOOP FOR innr IN EXECUTE' SELECT '|| gid ||' AS gid, '|| geom ||' AS geom FROM tmp WHERE dmn IS NULL 'LOOP IF ST_DWithin (ST_Transform (ST_SetSRID (outr.geom, 4326), 3785), ST_Transform (ST_SetSRID (innr.geom, 4326), 3785), radius) POTOM --IF ST_DWithin (outr .geom, innr.geom, radius) POTOM VYKONAT 'UPDATE tmp SET dmn =' || dmn_number || ', chk = FALSE WHERE' || gid || ' = '|| innr.gid; END IF; END LOOP; PROVÉST 'UPDATE tmp SET chk = PRAVDA KDE' || gid || ' = '|| outr.gid; END LOOP; VYBERTE DO r dmn Z tmp KDE dmn = dmn_number A NE chk LIMIT 1; ODCHOD, KDYŽ NENJDE; END LOOP; VYBERTE DO r dmn Z tmp KDE dmn JE NULL LIMIT 1; KDYŽ JSEM NALEZEN, pak dmn_number: = dmn_number + 1; PROVÉST 'UPDATE tmp SET dmn =' || dmn_number || ', chk = FALSE WHERE' || gid || ' = (SELECT MIN ('|| gid ||') Z tmp KDE dmn JE NULL LIMIT 1) '; JINÝ VÝCHOD; END IF; END LOOP; RETURN QUERY EXECUTE 'SELECT ST_ConvexHull (ST_Collect (' || geom || ')) FROM tmp GROUP by dmn'; VRÁTIT SE; KONEC $$ JAZYK plpgsql;

Příklad použití této funkce:

SELECT * FROM get_domains_n ('poi', 'wkb_geometry', 'ogc_fid', 14000) AS g (gm geometry)

'poi' - název vrstvy, 'wkb_geometry' - název sloupce geometrie, 'ogc_fid' - primární klíč tabulky, 14000 - vzdálenost klastru.

Výsledek použití této funkce:


Nejslibnější, co jsem zatím našel, je toto rozšíření pro shlukování K-means jako funkci okna: http://pgxn.org/dist/kmeans/

Zatím jsem jej však nebyl schopen úspěšně nainstalovat.


Jinak můžete pro základní shlukování mřížek použít SnapToGrid.

SELECT array_agg (id) AS ids, COUNT (position) AS count, ST_AsText (ST_Centroid (ST_Collect (position))) AS center, FROM mytable GROUP BY ST_SnapToGrid (ST_SetSRID (position, 4326), 22.25, 11.125) ORDER BY count DESC;

Řešení Kmeans můžete použít snadněji pomocí metody ST_ClusterKMeans, která je dostupná v postgisu od 2.3 Příklad:

SELECT kmean, count (*), ST_SetSRID (ST_Extent (geom), 4326) jako bbox FROM (SELECT ST_ClusterKMeans (geom, 20) OVER () AS kmean, ST_Centroid (geom) jako geom FROM sls_product) tsub GROUP BY kmean;

Ohraničující rámeček prvků se ve výše uvedeném příkladu používá jako geometrie clusteru. První obrázek ukazuje původní geometrie a druhý je výsledkem výběru výše.


Klastrové řešení zdola nahoru od Získejte jeden klastr z oblaku bodů s maximálním průměrem v postgisu, který nevyžaduje žádné dynamické dotazy.

CREATE TYPE pt AS (gid character varying (32), the_geom geometry (Point))

a typ s ID klastru

CREATE TYPE clustered_pt AS (gid character varying (32), the_geom geometry (Point) cluster_id int)

Dále funkce algoritmu

VYTVOŘIT NEBO VYMĚNIT FUNKCI buc (body pt [], rádius celé číslo) VRÁCÍ NASTAVENÍ clustered_pt AS $ BODY $ DECLARE srid int; join_clusters int []; ZAČNĚTE - Pokud je pouze 1 bod, neobtěžujte se smyčkou. IF array_length (points, 1) <2 THEN RETURN QUERY SELECT gid, the_geom, 1 FROM unnest (points); VRÁTIT SE; END IF; VYTVOŘIT DOČASNOU TABULKU, POKUD NENÍ EXISTUJE points2 (LIKE pt) NA POVOLENÍ KAPITOLY; BEGIN ALTER TABLE points2 ADD COLUMN cluster_id serial; VÝJIMKA KDYŽ duplikát_sloupec POTOM - nedělat nic. Při použití této funkce vícekrát KONEC se objeví výjimka; ZKRÁCIT body2; - vložení bodů do INSERT INTO points2 (gid, the_geom) (SELECT (unnest (points)). *); --Uložte srid, aby se body znovu převedly, předpokládá se, že všechny body mají stejný SRID srid: = ST_SRID (the_geom) FROM points2 LIMIT 1; UPDATE points2 - transformace bodů do souřadnicového systému UTM, takže vzdálenosti budou počítány v metrech. SET the_geom = ST_TRANSFORM (the_geom, 26986); --Přidání prostorového indexu CREATE INDEX points_index ON points2 USING gist (the_geom); ANALYZOVAT body2; LOOP - Pokud je nejmenší maximální vzdálenost mezi dvěma klastry větší než dvojnásobek požadovaného poloměru klastru, pak již neexistují žádné další klastry, které se mají vytvořit IF (SELECT ST_MaxDistance (ST_Collect (a.the_geom), ST_Collect (b.the_geom)) FROM points2 a, points2 b KDE a.cluster_id <> b.cluster_id GROUP BY a.cluster_id, b.cluster_id OBJEDNAT ST_MaxDistance (ST_Collect (a.the_geom), ST_Collect (b.the_geom)) LIMIT 1)> 2 * poloměr PAK VÝCHOD; END IF; join_clusters: = ARRAY [a.cluster_id, b.cluster_id] FROM points2 a, points2 b WHERE a.cluster_id <> b.cluster_id GROUP BY a.cluster_id, b.cluster_id OBJEDNÁVKA ST_MaxDistance (ST_Collect (a.the_geom), ST_Collect ( b.the_geom)) LIMIT 1; UPDATE points2 SET cluster_id = join_clusters [1] WHERE cluster_id = join_clusters [2]; --Pokud zbývá pouze 1 klastr, opusťte smyčku IF (VYBERTE POČET (DISTINCT cluster_id) Z BODŮ2) <2 POTOM KONEC; END IF; END LOOP; RETURN QUERY SELECT gid, ST_TRANSFORM (the_geom, srid) :: geometry (point), cluster_id FROM points2; KONEC; $ BODY $ LANGUAGE plpgsql

Používání:

WITH subq AS (SELECT ARRAY_AGG ((gid, the_geom) :: pt) AS points FROM data GROUP BY collection_id) SELECT (clusters). * FROM (SELECT buc (points, radius) AS clusters FROM subq) y;

Doplnění odpovědi @MikeT…

Pro MS Windows:

Požadavky:

  • Libovolná verze Visual C ++ Express, jako je tato
  • Modul kmeans-postgresql.

Co uděláš:

  • Vylepšením zdrojového kódu exportujte funkci kmeans do knihovny DLL.
  • Zkompilujte zdrojový kód pomocícl.exepřekladač pro generování DLL skmeansfunkce.
  • Vložte vygenerovanou DLL do složky PostgreSQL lib.
  • Pak můžete "vytvořit" (propojit) UDF do PostgreSQL pomocí příkazu SQL.

Kroky:

  1. Stahujte a instalujte / extrahujte požadavky.
  2. Otevřikmeans.cv libovolném editoru:

    1. Po#zahrnoutřádky definují makro DLLEXPORT s:

      #if defined (_WIN32) #define DLLEXPORT __declspec (dllexport) #else #define DLLEXPORT #endif
    2. DátDLLEXPORTpřed každým z těchto řádků:

      PG_FUNCTION_INFO_V1 (kmeans_with_init); PG_FUNCTION_INFO_V1 (kmeans); extern Datum kmeans_with_init (PG_FUNCTION_ARGS); vnější referenční kmeans (PG_FUNCTION_ARGS);
  3. Otevřete příkazový řádek Visual C ++.

  4. V příkazovém řádku:

    1. Přejít na extrahovanýkmeans-postgresql.
    2. Nastavte si POSTGRESPATH, moje je například:SET POSTGRESPATH = C: Program Files PostgreSQL 9.5
    3. Běh

      cl.exe / I "% POSTGRESPATH%  include" / I "% POSTGRESPATH%  include  server" / I "% POSTGRESPATH%  include  server  port  win32" / I "% POSTGRESPATH%  include  server  port  win32_msvc "/ I" C:  Program Files (x86)  Microsoft SDKs  Windows  v7.1A  Include "/ LD kmeans.c"% POSTGRESPATH%  lib  postgres.lib "
  5. Zkopírujtekmeans.dllna% POSTGRESPATH% lib

  6. Nyní spusťte příkaz SQL ve vaší databázi a funkci „VYTVOŘTE“.

    VYTVOŘIT FUNKCI kmeans (float [], int) NÁVRATNOSTI JAKO '$ libdir / kmeans' JAZYK c VOLATILE STRICT WINDOW; CREATE FUNCTION kmeans (float [], int, float []) RETURNS int AS '$ libdir / kmeans', 'kmeans_with_init' LANGUAGE C IMMUTABLE STRICT WINDOW;

Zde je způsob, jak zobrazit v QGIS výsledek dotazu PostGIS uvedeného v bodě 2) v tomto anwseru

Jelikož QGIS nezpracovává ani geometrycollections, ani různé datové typy ve stejném sloupci geometrie, vytvořil jsem dvě vrstvy, jednu pro shluky a jednu pro shlukované body.

Nejprve pro shluky potřebujete pouze polygony, další výsledky jsou osamělé body:

SELECT id, countfeature, circle FROM (SELECT row_number () over () AS id, ST_NumGeometries (gc) as countfeature, ST_MinimumBoundingCircle (gc) AS circle FROM (SELECT unnest (ST_ClusterWithin (the_geom, 100)) gc FROM rand_point) f) a WHERE ST_GeometryType (circle) = 'ST_Polygon'

Pak pro seskupené body musíte transformovat geometrické sbírky ve více bodech:

SELECT row_number () over () AS id, ST_NumGeometries (gc) as countfeature, ST_CollectionExtract (gc, 1) AS multipoint FROM (SELECT unnest (ST_ClusterWithin (the_geom, 100)) gc FROM rand_point) f

Některé body jsou na stejných souřadnicích, takže štítek může být matoucí.


PostGIS

PostGIS přidává podporu pro geografické objekty do objektově relační databáze PostgreSQL. Ve skutečnosti PostGIS & # 8220spatially umožňuje & # 8221 server PostgreSQL, což umožňuje jeho použití jako back-endové prostorové databáze pro geografické informační systémy (GIS), podobně jako rozšíření ESRI & # 8217s SDE nebo Oracle & # 8217s Spatial. PostGIS se řídí specifikací OpenGIS & # 8220Simple Features pro SQL & # 8221.

1. Instalace na Ubuntu

stáhněte a nainstalujte následující balíček pomocí Synaptic Package Manager:

1.1. postgis

Podpora geografických objektů pro běžné soubory PostgreSQL & # 8212. Tento balíček obsahuje binární soubory uživatelských účtů PostGIS, běžné soubory a dokumentaci.

1.2. postgressql-8.4-postgis

Podpora geografických objektů pro PostgreSQL 8.4. Tento balíček podporuje PostgreSQL 8.4.

1.3. libpostgis-java

Podpora geografických objektů pro podporu JDBC PostgreSQL & # 8212. Tento balíček obsahuje podporu JDBC pro PostGIS.


Používání GeoDjango a PostGIS v Django

Prostorová data jsou jakákoli geografická data, která obsahují informace týkající se Země, jako jsou řeky, hranice, města nebo přírodní památky. Popisuje obrysy, topologii, velikost a tvar těchto prvků. Mapy jsou běžnou metodou vizualizace prostorových dat, která jsou obvykle znázorněna ve vektorové nebo rastrové podobě.

V tomto článku vám představím prostorová data v PostgreSQL a Django. Uvidíte, jak používat PostGIS a GeoDjango k vytváření, ukládání a manipulaci s geografickými daty (jak rastrovými, tak vektorovými) ve webové aplikaci Pythonu. Po cestě uvidíte několik případů použití prostorových dat, s nimiž se jako vývojář softwaru pravděpodobně setkáte.

Vektorová data vs. rastrová data

Vektorové údaje je znázornění Země pomocí bodů, linií a mnohoúhelníků. Bod se používá k vyjádření malých, diskrétních oblastí pomocí souřadnic „x“ a „y“. Propojené body vytvářejí čáry, které lze použít k popisu silnic, potoků a sítí. Mnohoúhelníky jsou tvořeny z uzavřeného spojení čar a představují prvky s uzavřeným prostorem, jako jsou budovy, ostrovy a hranice. Vektorové datové typy jsou v relačních databázích běžnější než rastrová data.

Rastrová data, na druhé straně, je reprezentace geografických dat v pixelech. Obvykle se jedná o snímky Země pořízené ze vzdušných satelitů. Obvykle jsou uloženy v mřížce řádků a sloupců s příslušnými metadaty, jako jsou měření a rozlišení. Rastrová data se vytvářejí rychleji a levněji než vektorové datové typy.

Prostorová data v Postgresu s PostGIS

Kdykoli potřebujete odpovědět na otázky týkající se vašeho geografického prostředí, například „Jak daleko je nemocnice?“ „Kde je nejbližší obchod?“ „Jak vysoký je ten mrakodrap?“ Nebo „Jaká je nejrychlejší trasa?“ prostorová data pravděpodobně vstoupí do hry.

Prostorová data jsou také používá se ve statistikách pro analýzu vzorů a vztahů mezi prvky. Například při analýze šíření choroby v zeměpisné oblasti lze horké zóny identifikovat a umístit do karantény pomocí prostorových dat. Tyto údaje lze použít k identifikaci zdroje ohniska, územního členění měst a mnohem více. Protože více softwarových aplikací závisí na umístění, způsob, jakým spravujete a ukládáte prostorová data, je důležitější než kdy dříve.

PostgreSQL sám o sobě neposkytuje podporu pro ukládání prostorových dat. To je místo, kde přichází PostGIS. PostGIS je bezplatné rozšíření s otevřeným zdrojovým kódem, které přidává funkce prostorových dat do databází PostgreSQL. PostGIS vám to umožňuje ukládat prostorová data a používat jejich knihovnu funkcí manipulovat s tím. Databáze s PostGIS může ukládat zeměpisné souřadnice, čáry a tvary a dotazovat se jich pomocí prostorových funkcí.

Pokud používáte poskytovatele databáze jako službu, jako je Amazon RDS nebo Google Cloud SQL, je pravděpodobné, že PostGIS již bude nainstalován. Pokud provozujete vlastní server, podívejte se na web PostGIS), kde najdete podrobnosti. Po instalaci je povolení PostGIS stejně jednoduché jako:

Nyní se podívejme, jak můžeme pracovat s geoprostorovými daty v Django.

Používání GeoDjango pro prostorová data v Django

GeoDjango je modul Django používaný k vytváření geografických aplikací. Lze jej použít ke správě prostorové databáze v Pythonu. Dodává se integrovaný s Django, ale lze jej použít také jako samostatný rámec. Jeho cílem je co nejvíce usnadnit vytváření webových aplikací založených na poloze.

V následujících částech uvidíte čtyři různé případy použití pro GeoDjango. Tyto budou ilustrovat, jak můžete vytvářet, ukládat a načítat prostorová data v aplikaci Django zálohované databází Postgres, která používá PostGIS. Uvidíte také, jak použít prostorová data pro běžné operace, jako je zjištění vzdálenosti mezi dvěma místy ve vesmíru.

Ukládání polygonů pomocí GEOSGeometry

Mnohoúhelník je typ vektorových dat: spojení bodů, které tvoří uzavřený tvar. Polygon můžete přidat do prostorové databáze v Django pomocí GEOSGeometry.

Třída GEOSGeometry pochází z rozhraní API GEOS. Trvá dva argumenty, přičemž první argument je vstup řetězce, který představuje uloženou geometrii, a druhý volitelný argument, číslo SRID (identifikátor prostorového odkazu). SRID je jedinečný identifikátor, který definuje, jaký souřadnicový systém byste chtěli použít, a popisuje, jak převádět data do reálných umístění. Při provádění geoprostorových funkcí, jako je hledání dat o vzdálenosti a ploše, je důležité použít data se stejným SRID, jaký je použit v databázi, aby byl zajištěn správný výsledek.

Chcete-li uložit Polygon do prostorové databáze pomocí GEOSGeometry, ujistěte se, že je na vašem modelu definováno pole Polygon. Předpokládejme, že máte model banky, který představuje všechny banky ve stavu s PolygonField (poly), který popisuje fyzickou hranici a tvar konkrétní pobočky banky v reálném životě:

Chcete-li ukládat data do takového pole pomocí GEOSGeometry, můžete spustit následující:

Pomocí třídy GEOSGeometry jste vytvořili objekt Polygon, který představuje obrys určité banky Suntrust v San Antoniu v Texasu. Každá souřadnice zadaná parametru POLYGON definuje „roh“ obrysu budovy.

Ukládání modelů s rastrovými poli pomocí GDALRaster

Při práci s rastrovými daty potřebujete pole použité pro uložení rastru (tzv. RasterField). Funkce rastru byla vždy součástí PostGIS, ale od PostGIS 3.0 byla přípona rastru rozdělena na samostatnou příponu. Po instalaci se ujistěte, že je rozšíření povoleno ve vaší databázi spuštěním:

Nyní předpokládejme, že máte model nazvaný Elevation, na kterém je rastrové pole. Model výšky by představoval vertikální a horizontální rozměr různých povrchů a RasterField na něm (rast, jak je vidět níže) by bylo pole, které přijímá abstrahovaný rastrový objekt popisující výšku. Může to být například satelitní mapování terénu kopce:

RasterField ukládá GDALRaster objekt. GDALRaster je objekt, který podporuje čtení formátů prostorových souborů, jako jsou rastrové soubory. Lze jej vytvořit instanci s dva vstupy. První parametr může být buď řetězec představující cestu k souboru nebo slovník, nebo bajtový objekt představující rastr. Druhý parametr určuje, zda má být rastr otevřen v „režimu zápisu“. Pokud nepoužíváte režim zápisu, nemůžete rastrová data upravit.

Níže GDALRaster převezme soubor raster.tif, načte jej jako objekt souboru a odebere jej do objektu GDALRaster, který lze uložit do modelu RasterField:

Tímto způsobem můžete uložit rastrový obrazový soubor .tif představující terén Mount Fuji.

Nový rastr lze také vytvořit pomocí nezpracovaných dat ze slovníku Pythonu obsahujícího parametry scale, size, origin a srid. Níže vidíte, jak definovat nový rastr, který popisuje kaňon se šířkou a výškou 10 pixelů a pásy, které představují jednu vrstvu dat v rastru:

Hledání bodů ve vesmíru pomocí vyhledávání geometrie

Vyhledávání geometrie vám pomůže najít body, čáry a mnohoúhelníky v jiné geometrii. Například můžete použít vyhledání geometrie k určení, zda bod leží v povrchu mnohoúhelníku & # x27s.

Nejprve vytvořte Country model definovaný takto:

Země představuje tabulku, která ukládá hranice zemí světa. Dále můžete pomocí GeoDjango zkontrolovat, zda je konkrétní souřadnice bodu uložena v poli mpoly v jedné ze zemí v databázi:

Můžete také provést prostorové vyhledávání a určit, zda je bod uvnitř konkrétní země. Spuštěním níže uvedeného kódu definujte Point objekt, který představuje umístění ve Valdagrone v San Marinu. Poté můžete tento bod vyhledat pomocí metody contains:

Výpočet vzdálenosti mezi body

Nakonec lze GeoDjango použít k výpočtu vzdálenosti mezi dvěma body. Za předpokladu, že znáte souřadnice dvou bodů a chcete zjistit vzdálenost mezi nimi, můžete ve svém prostředí Pythonu spustit následující:

Tento příklad používá metodu transformace k převodu souřadnic bodu z desetinných stupňů zeměpisné šířky a délky na metrickou vzdálenost.

Pro ilustraci konkrétnějšího příkladu pro Django můžete vytvořit model pro města ve Spojených státech, který vypadá takto:

Pro výpočet vzdálenosti mezi městy Point Hope a Point Lay, můžete použít tyto modely:

GeoDjango také poskytuje některé funkce vyhledávání vzdáleností, jako je distance_lt, distance_lte, distance_gt, distance_gte a dwithin. Například:

Tímto způsobem můžete použít GeoDjango k vyhledání vzdálenosti mezi dvěma modely s místními body nebo dvěma objekty surového bodu. Kombinací této metody s vektorovými nebo rastrovými daty o silnicích můžete do své aplikace zabudovat složité výpočty vzdálenosti pro řízení, chůzi nebo cyklistiku.

Prostorová data mají mnoho důležitých případů použití v reálném světě. V tomto příspěvku jste viděli, jak vám PostGIS a GeoDjango mohou pomoci využívat prostorová data k vytváření webových aplikací založených na poloze, ale stále se toho můžete dozvědět mnohem více. Nezapomeňte se podívat na úvodní dokumentaci PostGIS a GeoDjango API, kde najdete další informace a příklady.

Sdílet tento článek: Pokud se vám tento článek líbil, možná ho budete chtít tweetnout svým kolegům.


Prostorové shlukování s PostGIS? - Geografické informační systémy

Pracovní vidlice projektu PostGIS svn (http://svn.osgeo.org/postgis/)

Použijte Git nebo pokladnu s SVN pomocí webové adresy URL.

Pracujte rychle s naším oficiálním CLI. Zjistit více.

Spuštění GitHub Desktop

Pokud se nic nestane, stáhněte si GitHub Desktop a zkuste to znovu.

Spuštění GitHub Desktop

Pokud se nic nestane, stáhněte si GitHub Desktop a zkuste to znovu.

Spouštění Xcode

Pokud se nic nestane, stáhněte si Xcode a zkuste to znovu.

Spuštění kódu Visual Studio

Váš kódový prostor se otevře, jakmile budete připraveni.

Při přípravě vašeho kódového prostoru došlo k problému, zkuste to znovu.


Osnova kurzu

Den 1

  1. Vítejte
  2. Úvod
    • Pozadí a historie prostorových databází, PostgreSQL a PostGIS
    • Vysvětlení systémů správy relačních databází
    • výhodou databáze oproti souborům, jako jsou soubory obrazců
    • aplikace podporující PostGIS
    • skutečné implementace PostGIS
    • srovnání s proprietárními řešeními prostorové databáze
  3. Instalace PostgreSQL, pgAdmin, PostGIS a QGIS
    • na Windows, Linux nebo OS X
  4. Vytvoření prostorové databáze
    • vytvořte novou databázi a prostorově ji povolte pomocí PostGIS
  5. Načítání prostorových dat
    • Nástroj pro načítání tvarových souborů PostGIS
    • QGIS DBManager
    • další nástroje
  6. Přehled údajů o cvičení
  7. Jednoduchý SQL
    • Všechno v PostGIS se děje pomocí SQL (jazyk strukturovaného dotazu), takže pokud žádné neznáte, získáte základní informace. Všechny databáze používají SQL, takže jde o kritickou dovednost
  8. Jednoduchá cvičení SQL
    • Procvičování základního SQL
  9. Geometrie
    • Porozumění geometriím jednoduchých funkcí OGC a způsobu jejich ukládání a manipulace s nimi v databázi
  10. Geometrická cvičení
    • Procvičování geometrických funkcí
  11. Prostorové vztahy
    • Funkce pro testování a popis vztahů, jako jsou Equals, Intertersects, Within atd. Pokud jste vytvořili GIS, víte, jak to udělat v desktopovém GIS - nyní je proveďte v databázi!
  12. Cvičení prostorových vztahů
    • Procvičování funkcí prostorových vztahů
  13. Prostorové spojení
    • jedna z hlavních schopností v GIS, vytváření prostorových spojení v databázi je neuvěřitelně flexibilní a výkonné.
  14. Cvičení pro prostorové připojení
    • Procvičování prostorových spojení
  15. Prostorové indexování
    • prostorové indexování zrychluje dotazy na prostorová data

Den 2

  1. Promítání dat
    • Transformace geometrií mezi různými referenčními systémy souřadnic.
  2. Projekční cvičení
  3. Zeměpis
    • ukládejte svá data jako long-lat (neprojektovaná) a přitom provádějte velmi přesné prostorové operace pomocí sférické geometrie (na sféroidu WGS84)
  4. Geometrické konstrukční funkce
    • Funkce, jejichž výsledkem jsou nové geometrie, např.
    • Buffer
    • Těžiště
    • Průsečík
    • Union (aka rozpuštění nebo sloučení)
  5. Více prostorových spojení
    • podrobnější pohled na prostorová spojení, začlenění dalších funkcí zahrnutých od první části prostorového spojení
    • načítání a provádění spojení s neprostorovými tabulkami
  6. Doba platnosti
    • Testování platnosti geometrií
  7. Rovnost
    • podrobnější pohled na to, co znamená rovnost mezi geometriemi
  8. Lineární odkazování
    • referenční prvky založené na jejich poloze podél čáry namísto použití x, y nebo polárních souřadnic.
  9. Rozměrově rozšířený 9-průnikový model
    • porozumění, testování a využití všech možných vztahů mezi geometriemi
  10. Shlukování na indexech
    • clustering databází je nástroj zvyšující výkon, který fyzicky spojuje související data na disku
  11. 3-D
    • práce s 3D geometrií v PostGIS
  12. Hledání nejbližšího souseda
    • nevadí vzdálenost, jaká je nejbližší? Složitější, než si myslíte. PostGIS to řeší úhledně
  13. Sledování historie úprav pomocí spouštěčů
    • používat standardní spouštěče PostgreSQL k vedení záznamu o tom, kdo vytvořil / upravil / odstranil záznam
  14. Pokročilé geometrické konstrukce
    • naučit se některé pokročilé funkce a přístupy SQL k řešení některých záludných problémů
  15. Ladění PostgreSQL pro prostorové
    • PostgreSQL jako RDBMS může být a používá se k ukládání čehokoli, proto je jeho výchozí konfigurace pro obecný výkon. Prostorová data představují jedinečné výzvy - zjistěte, jak konfigurovat databázi pro optimální výkon
  16. Zabezpečení PostgreSQL
    • Jak chránit integritu a zabezpečení vašich dat a databáze
    • autentizace a role
    • připojení k databázi
    • šifrování
  17. Schémata PostgreSQL
    • schémata jsou jako složky - jak a proč používat schémata
  18. Zálohování a obnovení PostgreSQL
    • velmi důležité!
  19. Aktualizace softwaru
    • Jak zacházet s upgradem PostgreSQL nebo PostGIS

Hodnocení je založeno na úspěšném absolvování cvičení proložených mezi výukovými moduly.

QGIS se v celém kurzu intenzivně používá k vizualizaci výsledků, jako klient SQL (prostřednictvím správce DB) a k načítání dat do PostGIS. Představen je také pgAdmin a další klienti. Příkazy SQL napsané v průběhu kurzu student uloží jako referenci, aby mohli zkontrolovat nebo znovu použít dotazy doma nebo v práci.

Doporučujeme studentům, aby si přinesli svá vlastní data, aby pokud měli během kurzu čas a schopnosti, mohli na svých vlastních datech implementovat dovednosti, které se naučí v kurzu, a dokonce se vrátit do kanceláře s prostorovou databází připravenou k použití .


BuntDB - integrovatelná databáze klíčů / hodnot v paměti pro Go s vlastní indexací a geoprostorovou podporou

BuntDB je úložiště klíč / hodnota na nízké úrovni v paměti v čistém Go. Přetrvává na disku, je kompatibilní s ACID a používá uzamčení pro více čteček a jeden zapisovač. Podporuje vlastní indexy a geoprostorová data. Je ideální pro projekty, které potřebují spolehlivou databázi a upřednostňují rychlost nad velikostí dat. Touha vytvořit BuntDB vychází z potřeby nové zabudovatelné databáze pro Tile38 a SummitDB.


Analýza dat SSURGO v PostGIS: Přehled

Zprávy
Vypadá to, že NCSS vytvořilo webové rozhraní SQL pro svou hlavní databázi. Tento nový nástroj byl nedávno zvýrazněn v čísle 40 zpravodaje NCSS a vypadá jako slibný nový nástroj s dobrou dokumentací. Na této stránce je uveden seznam „webových služeb“ nabízených NCSS.

Přehled
Analýza dat SSURGO je komplikována řadou hierarchických, tabulkových vztahů jedna k mnoha mezi prostorovými a atributovými daty. Pochopení struktury databáze SSURGO je zásadní pro správnou interpretaci a agregaci vlastností půdy. Než provedete jakoukoli analýzu založenou na SSURGO, věnujte prosím nějaký čas seznámení s podrobnostmi o produktu, včetně zamýšleného použití, minimálních velikostí mapovacích jednotek a dalších důležitých podrobností. Kromě toho je nutností seznámit se s metadaty SSURGO. Stránka metadat obsahuje podrobné popisy struktury tabulky, názvů sloupců a jednotek a také důležité informace o zdrojích velké části tabulkových dat obsažených v databázi SSURGO.

Data SSURGO lze stáhnout podle oblasti průzkumu z The Soil Datamart, s prostorovými daty dodávanými ve formátu shapefile a daty atributů dodávanými jako prostý text. Bohužel, M.S. Pro využití dat atributu SSURGO dodaných ze Soil Datamart je vyžadována šablona databáze Access. Pomoc s tímto postupem naleznete na stránce NRCS SSURGO. Při použití tohoto přístupu musí být většina analýz SSURGO provedena průzkumem po průzkumu v prostředí GIS. Obecné pokyny naleznete v tomto dokumentu.

Několik online aplikací umožňuje jednoduchou interakci s databází SSURGO bez nutnosti znalosti GIS nebo RDBMS. Některé příklady zahrnují:

    naše online rozhraní k datům znečištění CA, AZ a NV. Příklad interakce zde, zde a zde. poskytované aplikací NRCS

Otevřený zdrojový přístup k SSURGO
Vyvinuli jsme alternativní přístup k práci s daty SSURGO pomocí PostGIS, prostorově podporované verze populárního a otevřeného systému správy relačních databází Postgresql, pro ukládání všech prostorových a tabulkových dat pro 138 oblastí průzkumu. Tento přístup usnadňuje rychlý přístup, analýzu a agregaci více než půl milionu půdních polygonů. SQL (strukturovaný dotazovací jazyk) se používá k přímé interakci s prostorovými i atributovými daty půdy. Pokud se do PostGIS importují jiné formy prostorových dat (jako je pevnina, klimatické údaje atd.), Lze téměř veškerou prostorovou a atributovou analýzu provést úplně z PostGIS. Na následujících stranách bude uvedena řada příkladů ilustrujících běžné úkoly.

Obecný přístup k práci se SSURGO (také uvedeno v tomto dokumentu) (více nápadů na složení mapové jednotky)

  1. Určete vlastnosti půdy, které mají být zahrnuty do nějaké analýzy
  2. Rozhodněte se o vhodné formě agregace, která má být použita k shrnutí horizontů
    • hloubka vážená (tj. vypočítat průměrné procento jílu v horizontech)
    • horní 1 m (tj. shrnout kapacitu smršťování a zvětšování ornice)
    • horní horizont (tj. shrnout povrchový organický uhlík)
    • součet profilu (tj. vypočítat celkovou kapacitu zadržování vody)
    • nejvíce omezující (tj. vypočítat nejvíce omezující hydraulickou vodivost v půdním profilu)
  3. Souhrnná data horizontu: po filtrování NULL hodnot a vah
  4. Rozhodněte se o vhodné formě agregace, která se má použít k shrnutí komponent
    • vážené procento složky (tj. to bude zahrnovat informace z každé komponenty vážené jejich odhadovaným procentem z celé mapové jednotky)
    • největší složka (tj. obvykle to vede k výběru „dominantní“ složky, ale pokud dojde k vícečetným složkám se stejnými odhadovanými procentními vazbami)
    • hlavní, důležitý příznak komponenty (tj. komponenty označené jako „hlavní komponenta“ NRCS představují dominantní typy půdy v mapové jednotce. Všimněte si, že někdy existuje několik komponent označených jako „hlavní komponenty“.)
    • dominantní stav (to se obvykle používá pro kategorická data, jako jsou vodní podmínky. agregace se provádí výběrem nejčastějšího stavu v mapové jednotce)
  5. Agregace dat komponent: po filtrování NULL hodnot a vah
  6. připojte výše uvedená agregovaná data (2x proces agregace pro data horizontu) k polygonům mapové jednotky
  7. See the diagram at the bottom of this page for a graphical summary

Notes on the Format of SSURGO


PostGIS

The primary spatial-data extension is PostGIS. PostGIS (Geographic Information Systems) is an open-source extension of the PostgreSQL database that lets you work with geographic objects that integrate directly with your database. With PostGIS, geographic and spatial data can be treated as first-class objects in your database.

By adding the PostGIS extension to your PostgreSQL database, you can work seamlessly with geospatial data without having to convert that data from the format that the rest of your application is working with to use with your database. You can also determine relationships between that spatial data with the extension, such as the distance between two objects in your database. You can also use PostGIS to render visualizations of this data.

Working with data such as cities and geometry data is as simple as something like:

SELECT superhero.name

FROM city, superhero

WHERE ST_Contains(city.geom, superhero.geom)

AND city.name = 'Gotham'

PostGIS includes:

The hierarchy of these spatial-focused type (from Introduction to PostGIS) is below:

  • Spatial-Indexing
  • Efficiently index spatial relationships
  • Spatial-Functions
  • For querying spatial properties, and the relationships between them
  • Functions for analyzing geometric components, determining spatial relationships, and manipulating geometries

In most databases, data is stored in rows and columns. With PostGIS, you can actually store data in a geometry column. This column stores data in a spatial coordinate system that’s defined by an SRID (Spatial Reference Identifier). This allows your database structure to reflect the spatial data that’s stored in the database.


Movement data in GIS: issues & ideas

Since I’ve started working, transport and movement data have been at the core of many of my projects. The spatial nature of movement data makes it interesting for GIScience but typical GIS tools are not a particularly good match.

Dealing with the temporal dynamics of geographic processes is one of the grand challenges for Geographic Information Science. Geographic Information Systems (GIS) and related spatial analysis methods are quite adept at handling spatial dimensions of patterns and processes, but the temporal and coupled space-time attributes of phenomena are difficult to represent and examine with contemporary GIS. (Dr. Paul M. Torrens, Center for Urban Science + Progress, New York University)

It’s still a hot topic right now, as the variety of related publications and events illustrates. For example, just this month, there is an Animove two-week professional training course (18–30 September 2016, Max-Planck Institute for Ornithology, Lake Konstanz) as well as the GIScience 2016 Workshop on Analysis of Movement Data (27 September 2016, Montreal, Canada).

Space-time cubes and animations are classics when it comes to visualizing movement data in GIS. They can be used for some visual analysis but have their limitations, particularly when it comes to working with and trying to understand lots of data. Visualization and analysis of spatio-temporal data in GIS is further complicated by the fact that the temporal information is not standardized in most GIS data formats. (Some notable exceptions of formats that do support time by design are GPX and NetCDF but those aren’t really first-class citizens in current desktop GIS.)

Most commonly, movement data is modeled as points (x,y, and optionally z) with a timestamp, object or tracker id, and potential additional info, such as speed, status, heading, and so on. With this data model, even simple questions like “Find all tracks that start in area A and end in area B” can become a real pain in “vanilla” desktop GIS. Even if the points come with a sequence number, which makes it easy to identify the start point, getting the end point is tricky without some custom code or queries. That’s why I have been storing the points in databases in order to at least have the powers of SQL to deal with the data. Even so, most queries were still painfully complex and performance unsatisfactory.

So I reached out to the Twitterverse asking for pointers towards moving objects database extensions for PostGIS and @bitnerd, @pwramsey, @hruske, and others replied. Amongst other useful tips, they pointed me towards the new temporal support, which ships with PostGIS 2.2. It includes the following neat functions:

  • ST_IsValidTrajectory — Returns true if the geometry is a valid trajectory.
  • ST_ClosestPointOfApproach — Returns the measure at which points interpolated along two lines are closest.
  • ST_DistanceCPA — Returns the distance between closest points of approach in two trajectories.
  • ST_CPAWithin — Returns true if the trajectories’ closest points of approach are within the specified distance.

Instead of points, these functions expect trajectories that are stored as LinestringM (or LinestringZM) where M is the time dimension. This approach makes many analyses considerably easier to handle. For example, clustering trajectory start and end locations and identifying the most common connections:


What Happens Next?

Gratulujeme! You’ve just loaded spatial data into a PostGIS database! Here’s a tip to spin up a PostGIS database much faster: try uploading your shapefiles to CartoDB. CartoDB is a mapping and analysis platform that uses PostGIS, and any data uploaded goes into a database. There are advantages to using your own database, but it’s hard to beat the ease of uploading data to CartoDB and watching your shapefile (or spreadsheet) get loaded into PostGIS in seconds.

In the next post in this series we’ll show you some spatial queries you can perform with PostGIS (either in your PostGIS database or CartoDB) to examine the distribution of trees in Edmonton.


Podívejte se na video: GRADA GLADAN - Vlaho Bupić