יותר

אשכולות מרחביים עם PostGIS?


אני מחפש אלגוריתם אשכולות מרחבי לשימוש בו בתוך בסיס נתונים תומך PostGIS עבור תכונות נקודה. אני אכתוב את הפונקציה plpgsql שלוקחת מרחק בין נקודות באותו אשכול כמו קלט. בפונקציית הפלט מחזירה מערך אשכולות. הפיתרון הברור ביותר הוא לבנות אזורי חיץ שמוגדרים מרחק סביב התכונה ולחפש תכונות למאגר זה. אם קיימות תכונות כאלה, המשך לבנות מאגר סביבן וכו '. אם תכונות כאלה אינן קיימות, משמע בניית אשכולות הושלמה. אולי יש כמה פתרונות חכמים?


ישנן לפחות שתי שיטות אשכולות טובות עבור PostGIS: kפירושו (דרךkmeans-postgresqlהרחבה) או גיאומטריות אשכולות במרחק סף (PostGIS 2.2)


1) kפירושו עםkmeans-postgresql

הַתקָנָה: עליך לקמפל ולהתקין זאת מקוד המקור, שקל יותר לעשות ב- * NIX מאשר ל- Windows (אני לא יודע מאיפה להתחיל). אם התקנת PostgreSQL מחבילות, וודא שיש לך גם את חבילות הפיתוח (למשל,postgresql-develעבור CentOS).

הורד, חילץ, בנה והתקן:

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

אפשר את התוסף במסד נתונים (באמצעות psql, pgAdmin וכו '):

יצירת אמצעי טווח קימור;

שימוש / דוגמה: צריכה להיות לך טבלת נקודות איפשהו (ציירתי חבורה של נקודות פסאודו אקראיות ב- QGIS). הנה דוגמא למה שעשיתי:

בחר קמעאנים, ספירה (*), ST_Centroid (ST_Collect (geom)) כ- geom FROM (SELECT kmeans (ARRAY [ST_X (geom), ST_Y (geom)], 5) OVER (), geom FROM rand_point) AS ksub GROUP BY kmeans סדר לפי אמצעי קימור;

ה5הבאתי את הטיעון השני שלקמניאניםפונקציית החלון היא ק מספר שלם לייצר חמישה אשכולות. אתה יכול לשנות את זה לכל מספר שלם שאתה רוצה.

להלן 31 נקודות פסאודו אקראיות שציירתי וחמשת המרכזיות עם התווית המציגה את הספירה בכל אשכול. זה נוצר באמצעות שאילתת SQL לעיל.


אתה יכול גם לנסות להמחיש היכן נמצאים האשכולות הללו עם ST_MinimumBoundingCircle:

SELECT ק"מ, ST_MinimumBoundingCircle (ST_Collect (geom)) AS מעגל FROM (SELECT kmeans (ARRAY [ST_X (geom), ST_Y (geom)], 5) OVER (), geom FROM rand_point) AS ksub קבוצה לפי מיילים סדר לפי ק"מ;


2) אשכולות במרחק סף עםST_Cluster בתוך

פונקציה מצטברת זו כלולה ב- PostGIS 2.2 ומחזירה מערך של GeometryCollections שכל הרכיבים נמצאים במרחק זה מזה.

להלן דוגמא לשימוש, כאשר המרחק של 100.0 הוא הסף המביא ל -5 אשכולות שונים:

בחר שורה_מספר () מעל () AS id, ST_NumGeometries (gc), gc AS geom_collection, ST_Centroid (gc) AS centroid, ST_MinimumBoundingCircle (gc) AS מעגל, sqrt (ST_Area (ST_MinimumBoundingCircle (gc)) / pi (radius)) (בחר בחר (ST_ClusterWithin (geom, 100)) gc FROM rand_point) f;

לאשכול האמצעי הגדול ביותר יש רדיוס מעגל סגור של 65.3 יחידות או כ -130, שהוא גדול מהסף. הסיבה לכך היא שהמרחקים האינדיבידואליים בין הגיאומטריות של החברים הם פחות מהסף, ולכן הוא קושר אותו יחד כאשכול אחד גדול יותר.


כתבתי פונקציה המחשבת אשכולות של תכונות על בסיס המרחק ביניהן ובונה גוף קמור על תכונות אלה:

צור או החלף פונקציה get_domains_n (lname varchar, geom varchar, gid varchar, radius numeric) מחזיר רשומת SETOF כ $$ $$ DECLARE lid_new שלם שלם; מספר שלם dmn_number: = 1; שיא outr; שיא innr; שיא r; התחל טפטוף אם קיים tmp; בצע 'צור טבלה זמנית tmp AS SELECT' || gid || ',' || geom || ' FROM '|| lname; ALTER TABLE tmp הוסף עמודה מספר שלם של dmn; טבלת משנה tmp הוסף עמודה chk בוליאני שגיאה שגויה; בצע 'עדכן tmp SET dmn =' || dmn_number || ', chk = FALSE WHERE' || gid || ' = (בחר MIN ('|| gid ||') מ- tmp) '; לולאת לולאה לביצוע בביצוע 'בחר' || gid || ' כמו gid, '|| geom ||' כמו geom FROM tmp WHERE dmn = '|| dmn_number ||' ולא chk 'לולאה עבור פנימים בביצוע' בחר '|| gid ||' כמו gid, '|| geom ||' כמו geom מ tmp איפה dmn הוא NULL 'LOOP IF ST_DWithin (ST_Transform (ST_SetSRID (outr.geom, 4326), 3785), ST_Transform (ST_SetSRID (innr.geom, 4326), 3785), רדיוס) ואז - אם ST_DWithin (outr .geom, innr.geom, radius) ואז בצע 'עדכן tmp SET dmn =' || dmn_number || ', chk = FALSE WHERE' || gid || ' = '|| innr.gid; END IF; לולאת סוף; בצע 'עדכן tmp SET chk = TRUE WHERE' || gid || ' = '|| outr.gid; לולאת סוף; בחר ל- r dmn מ- tmp איפה dmn = dmn_number ולא chk LIMIT 1; יציאה כשלא נמצא; לולאת סוף; בחר לתוך r dmn מ tmp היכן dmn הוא מגבלה 1; אם נמצא אז dmn_number: = dmn_number + 1; בצע 'עדכן tmp SET dmn =' || dmn_number || ', chk = FALSE WHERE' || gid || ' = (בחר MIN ('|| gid ||') מ- tmp היכן ש- dmn הוא מגבלה 1) '; יציאה אחרת; END IF; לולאת סוף; החזר ביצוע שאילתה 'בחר ST_ConvexHull (ST_Collect (' || geom || ')) מ- tmp GROUP מאת dmn'; לַחֲזוֹר; END $$ LANGUAGE plpgsql;

דוגמה לשימוש בפונקציה זו:

בחר * FROM get_domains_n ('poi', 'wkb_geometry', 'ogc_fid', 14000) AS g (gm geometry)

'פוי' - שם השכבה, 'wkb_geometry' - שם עמודת הגיאומטריה, 'ogc_fid' - המפתח הראשי של הטבלה, 14000 - מרחק אשכול.

התוצאה של שימוש בפונקציה זו:


עד כה, המבטיח ביותר שמצאתי הוא הרחבה זו עבור אשכולות K- כפונקציית חלון: http://pgxn.org/dist/kmeans/

עם זאת עדיין לא הצלחתי להתקין אותו בהצלחה.


אחרת, לצורך אשכולות רשת בסיסיים, תוכל להשתמש ב- SnapToGrid.

בחר 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;

באפשרותך להשתמש בפתרון Kmeans ביתר קלות בשיטת ST_ClusterKMeans הזמינה ב- postgis החל מ- 2.3 דוגמה:

בחר kmean, ספור (*), ST_SetSRID (ST_Extent (geom), 4326) כ bbox FROM (SELECT ST_ClusterKMeans (geom, 20) OVER () AS kmean, ST_Centroid (geom) כ geom FROM sls_product) tsub GROUP BY kmean;

תיבת התכונות המגבילה משמשת כגיאומטריה של אשכול בדוגמה לעיל. התמונה הראשונה מציגה את הגיאומטריות המקוריות והשנייה היא תוצאה של הבחירה לעיל.


פתרון אשכולות מלמטה למעלה מ- קבל אשכול בודד מענן של נקודות עם קוטר מקסימלי ב- postgis שאינו כרוך בשאילתות דינמיות.

CREATE TYPE pt AS (תו gid משתנה (32), הגיאומטריה של_geom (נקודה))

וסוג עם מזהה אשכול

צור סוג clustered_pt AS (תו gid משתנה (32), הגיאומטריה_geom (Point) cluster_id int)

לאחר מכן פונקציית האלגוריתם

צור או החלף פונקציה buc (נקודות pt [], רדיוס שלם) מחזיר SETOF clustered_pt AS $ BODY $ DECLARE srid int; joined_clusters int []; התחל - אם יש רק נקודה אחת, אל תטרח עם הלולאה. אם מערך_אורך (נקודות, 1) <2 ואז חזור לבחירת השאלה gid, the_geom, 1 FROM לא טוב (נקודות); לַחֲזוֹר; END IF; צור טבלה זמנית אם לא קיים נקודות 2 (כמו נקודה) בטיפות התחייבות; התחל נקודות לוח לשנות 2 הוסף עמודה סדרתי אשכול_יד; חריג כאשר עותק כפול_ ואז - אל תעשה כלום. יוצא מהכלל כאשר משתמשים בפונקציה זו מספר פעמים END; TRUNCATE נקודות 2; - הכנסת נקודות ל INSERT INTO נקודות 2 (gid, the_geom) (SELECT (לא טוב (נקודות)). *); - אחסן את ה- srid להחזרת נקודות אחריו, מניח שלכל הנקודות יש את ה- SRID זהה: = ST_SRID (the_geom) FROM נקודות 2 LIMIT 1; עדכן נקודות 2 - העברת נקודות למערכת קואורדינטות UTM כך שמרחקים יחושבו במטרים. הגדר the_geom = ST_TRANSFORM (the_geom, 26986); - הוספת אינדקס מרחבי CREATE INDEX points_index ON נקודות 2 באמצעות תמצית (the_geom); ניתוח נקודות 2; LOOP - אם המרחק המרבי הקטן ביותר בין שני אשכולות גדול מ- 2x מרדיוס האשכול הרצוי, אין יותר אשכולות שייווצרו IF (SELECT ST_MaxDistance (ST_Collect (a.the_geom), ST_Collect (b.the_geom)) FROM נקודות a, נקודות 2 ב WHERE a.cluster_id <> b.cluster_id GROUP BY a.cluster_id, b.cluster_id ORDER BY ST_MaxDistance (ST_Collect (a.the_geom), ST_Collect (b.the_geom)) LIMIT 1)> 2 * רדיוס ואז יציאה; END IF; joined_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 ORDER BY ST_MaxDistance (ST_Collect (a.the_geom), ST_Collect b.the_geom)) LIMIT 1; UPDATE נקודות 2 SET cluster_id = joined_clusters [1] WHERE cluster_id = joined_clusters [2]; - אם נותר רק אשכול אחד, צא לולאה אם ​​(בחר ספירה (DISTINCT cluster_id) מנקודות 2) <2 ואז צא; END IF; לולאת סוף; RETURN QUERY SELECT gid, ST_TRANSFORM (the_geom, srid) :: geometry (point), cluster_id FROM points2; סוֹף; $ BODY $ LANGUAGE plpgsql

נוֹהָג:

With subq AS (SELECT ARRAY_AGG ((gid, the_geom) :: pt) AS נקודות FROM data GROUP BY collection_id) SELECT (אשכולות). * FROM (SELECT buc (נקודות, רדיוס) AS אשכולות FROM subq) y;

משלים תשובת @MikeT ...

עבור Windows MS:

דרישות:

  • כל גרסת Visual C ++ Express כגון זו
  • מודול kmeans-postgresql.

מה תעשה:

  • כוונן את קוד המקור כדי לייצא את פונקציית ה- kmeans ל- DLL.
  • הידר את קוד המקור עםcl.exeמהדר ליצירת קובץ DLL איתוקמניאניםפוּנקצִיָה.
  • הכנס את ה- DLL שנוצר לתיקיית PostgreSQL lib.
  • אז אתה יכול "ליצור" (לקשר) את ה- UDF ל- PostgreSQL באמצעות פקודת SQL.

צעדים:

  1. הורד והתקן / חילץ דרישות.
  2. פתח את הkmeans.cבכל עורך:

    1. לאחר#לִכלוֹלקווים מגדירים את המאקרו DLLEXPORT עם:

      # אם מוגדר (_WIN32) #define DLLEXPORT __declspec (dllexport) #else #define DLLEXPORT #endif
    2. לָשִׂיםDLLEXPORTלפני כל אחת מהשורות האלה:

      PG_FUNCTION_INFO_V1 (kmeans_with_init); PG_FUNCTION_INFO_V1 (ק"מ); חיצוני Datum kmeans_with_init (PG_FUNCTION_ARGS); קילומטרים מקוונים חיצוניים (PG_FUNCTION_ARGS);
  3. פתח את שורת הפקודה Visual C ++.

  4. בשורת הפקודה:

    1. עבור לחילוץkmeans-postgresql.
    2. הגדר את POSTGRESPATH שלך, שלי למשל הוא:SET POSTGRESPATH = C: Program Files PostgreSQL 9.5
    3. לָרוּץ

      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. העתק אתkmeans.dllל% POSTGRESPATH% lib

  6. כעת הפעל את פקודת SQL במסד הנתונים שלך כדי "ליצור" את הפונקציה.

    CREATE FUNCTION kmeans (float [], int) RETURNS int AS '$ libdir / kmeans' LANGUAGE c חלון קשיח נדיף; CREATE FUNCTION kmeans (float [], int, float []) RETURNS int AS '$ libdir / kmeans', 'kmeans_with_init' LANGUAGE C IMMUTABLE WINDOW WINDOW;

הנה דרך להציג ב- QGIS את התוצאה של שאילתת PostGIS המופיעה בסעיף 2) במענה זה

מכיוון ש- QGIS אינו מטפל באוספי גיאומטריה ולא בסוגי נתונים שונים באותה עמודת גאומטריה, יצרתי שתי שכבות, אחת לאשכולות ואחת לנקודות מקובצות.

ראשית עבור אשכולות, אתה צריך רק מצולעים, תוצאות אחרות הן נקודות בודדות:

בחר id, countfeature, מעגל FROM (SELECT row_number () over () AS id, ST_NumGeometries (gc) as countfeature, ST_MinimumBoundingCircle (gc) AS circle FROM (SELECT unest (ST_ClusterWithin (the_geom, 100)) gc FROM rand_point) f) איפה ST_GeometryType (מעגל) = 'ST_Polygon'

ואז עבור נקודות מקובצות, עליך לשנות אוספים גיאומטריים בריבוי נקודות:

בחר שורה שורה () מעל () כ- id מזהה, ST_NumGeometries (gc) כ- countfeature, ST_CollectionExtract (gc, 1) AS multipoint FROM (SELECT unnest (ST_ClusterWithin (the_geom, 100)) gc FROM rand_point) f

נקודות מסוימות נמצאות באותן קואורדינטות כך שהתווית עלולה לבלבל.


PostGIS

PostGIS מוסיף תמיכה באובייקטים גיאוגרפיים למסד הנתונים PostgreSQL בנושא אובייקטים. למעשה, PostGIS & # 8220 מרחבי מאפשר & # 8221 את שרת PostgreSQL, ומאפשר להשתמש בו כמאגר מידע מרחבי של מערכות מידע גיאוגרפיות (GIS), בדומה ל- SRI של ESRI או ל- Extension Spatial של Oracle. PostGIS עוקב אחר מפרט התכונות הפשוטות של OpenGIS & # 8220 עבור SQL & # 8221.

1. התקנה באובונטו

הורד והתקן את החבילה הבאה באמצעות מנהל החבילות Synaptic:

1.1. פוסטגיס

אובייקטים גיאוגרפיים תומכים בקבצים נפוצים של PostgreSQL ו- # 8212. חבילה זו מכילה את הקבצים הבינאריים של PostGIS למשתמשים, קבצים נפוצים ותיעוד.

1.2. postgressql-8.4-postgis

תמיכה באובייקטים גיאוגרפיים עבור PostgreSQL 8.4. חבילה זו תומכת ב- PostgreSQL 8.4.

1.3. libpostgis-java

תמיכה באובייקטים גיאוגרפיים בתמיכה ב- PostgreSQL ו- # 8212 JDBC. חבילה זו מכילה תמיכה ב- JDBC עבור PostGIS.


שימוש ב- GeoDjango ו- PostGIS בג'נגו

נתונים מרחביים הם כל נתונים גיאוגרפיים המכילים מידע הקשור לכדור הארץ, כגון נהרות, גבולות, ערים או ציוני דרך טבעיים. הוא מתאר את קווי המתאר, הטופולוגיה, הגודל והצורה של תכונות אלה. מפות הן שיטה נפוצה לדמיין נתונים מרחביים, אשר מיוצגת בדרך כלל בצורה וקטורית או רסטרית.

במאמר זה אציג בפניכם נתונים מרחביים ב- PostgreSQL ובג'נגו. תראה כיצד להשתמש ב- PostGIS וב- GeoDjango כדי ליצור, לאחסן ולבצע מניפולציה של נתונים גיאוגרפיים (הן רסטר והן וקטור) ביישום אינטרנט של Python. בהמשך הדרך תראו כמה מקרי שימוש לנתונים מרחביים שאתם צפויים להיתקל בהם כמפתחים תוכנה.

נתוני וקטור לעומת נתוני רסטר

נתוני וקטור הוא ייצוג של כדור הארץ באמצעות נקודות, קווים ומצולעים. נקודה משמשת לייצוג אזורים קטנים ונפרדים באמצעות קואורדינטות "x" ו- "y". נקודות מחוברות יוצרות קווים המשמשים לתיאור כבישים, נחלים ורשתות. מצולעים נוצרים מחיבור קווים סגור ומייצגים תכונות עם אזור סגור כמו מבנים, איים וגבולות. סוגי נתונים וקטוריים נפוצים יותר במאגרי מידע יחסיים מאשר נתוני רסטר.

נתוני רסטר, לעומת זאת, הוא ייצוג של נתונים גיאוגרפיים בפיקסלים. זה בדרך כלל מתייחס לתמונות של כדור הארץ שנלקחו מלוויינים אוויריים. הם מאוחסנים בדרך כלל ברשת של שורות ועמודות עם מטא נתונים רלוונטיים, כגון מדידות ורזולוציה. נתוני רסטר מהירים יותר ויקרים יותר ליצירה מאשר סוגי נתונים וקטוריים.

נתונים מרחביים ב- Postgres עם PostGIS

בכל פעם שאתה צריך לענות על שאלות על הסביבה הגיאוגרפית שלך, כמו & quot כמה רחוק בית החולים ?, "" איפה החנות הקרובה ביותר ?, "" כמה גבוה גורד השחקים הזה ?, "או & quot מהו המסלול המהיר ביותר?" נתונים מרחביים עשויים להיכנס לשחק.

נתונים מרחביים הם גם משמש בסטטיסטיקה לניתוח דפוסים וקשרים בין אלמנטים. לדוגמא, כאשר מנתחים את התפשטות המחלה באזור גיאוגרפי, ניתן לזהות אזורים חמים ולהסגר אותם באמצעות נתונים מרחביים. ניתן להשתמש בנתונים אלה כדי לזהות את מקור ההתפרצות, את ייעוד הערים ועוד. מכיוון שיותר יישומי תוכנה תלויים במיקום, האופן שבו אתה מנהל ואוחסן נתונים מרחביים הוא קריטי מתמיד.

PostgreSQL, בפני עצמה, אינה מספקת תמיכה באחסון נתונים מרחביים. כאן נכנס PostGIS. PostGIS הוא סיומת קוד פתוח בחינם שמוסיפה יכולות נתונים מרחביים למסדי נתונים של PostgreSQL. PostGIS מאפשר לך לאחסן נתונים מרחביים ולהשתמש בספריית הפונקציות שלה לתמרן את זה. מסד נתונים עם PostGIS יכול לאחסן קואורדינטות, קווים וצורות גיאוגרפיות ולשאול אותם באמצעות פונקציות מרחביות.

אם אתה משתמש בספק מסד נתונים כשירות כגון Amazon RDS או Google Cloud SQL, סביר להניח כי PostGIS כבר מותקן. אם אתה מנהל שרת משלך, בדוק באתר PostGIS) לקבלת פרטים. לאחר ההתקנה, הפעלת PostGIS היא פשוטה כמו:

עכשיו, בואו & # x27 נראה כיצד אנו יכולים לעבוד עם נתונים גיאו-מרחביים בג'נגו.

שימוש ב- GeoDjango לנתונים מרחביים בג'נגו

GeoDjango הוא מודול של Django המשמש ליצירת יישומים גיאוגרפיים. ניתן להשתמש בו לניהול מסד נתונים מרחבי בפייתון. הוא מגיע משולב עם ג'נגו, אך יכול לשמש גם כמסגרת עצמאית. מטרתו להקל על האפשרות ליצור יישומי אינטרנט מבוססי מיקום.

בחלקים הבאים תראה ארבעה מקרי שימוש שונים עבור GeoDjango. אלה ימחישו כיצד ניתן ליצור, לאחסן ולאחזר נתונים מרחביים ביישום Django המגובה במסד נתונים של Postgres המשתמש ב- PostGIS. תוכלו גם לראות כיצד להשתמש בנתונים מרחביים לצורך פעולות נפוצות כמו מציאת המרחק בין שני מיקומים במרחב.

שמירת מצולעים באמצעות GEOSGeometry

מצולע הוא סוג של נתונים וקטוריים: חיבור של נקודות היוצרות צורה סגורה. ניתן להוסיף מצולע למסד נתונים מרחבי בג'נגו באמצעות GEOSGeometry.

שיעור GEOSGeometry מגיע מממשק ה- API של GEOS. נדרשים שני ארגומנטים, כאשר הארגומנט הראשון הוא קלט מחרוזת המייצג את הגיאומטריה הנשמרת, וארגומנט אופציונלי שני, מספר SRID (מזהה הפניה מרחבית). ה- SRID הוא מזהה ייחודי המגדיר באיזו מערכת קואורדינטות תרצה להשתמש ומתאר כיצד להמיר נתונים למיקומים בעולם האמיתי. בעת ביצוע פונקציות גיאו-מרחביות, כגון מציאת נתוני מרחק ושטח, חשוב להשתמש בנתונים עם אותו SRID כמו זה המשמש במסד הנתונים כדי להבטיח את התוצאה הנכונה.

כדי לשמור מצולע במסד נתונים מרחבי באמצעות GEOSGeometry, ודא שמוגדר שדה מצולע במודל שלך. נניח שיש לך מודל בנק המייצג את כל הבנקים במצב עם PolygonField (פולי) שמתאר את הגבול והצורה הפיזיים של החיים האמיתיים של סניף בנק מסוים:

כדי לאחסן נתונים בשדה כזה באמצעות GEOSGeometry, אתה יכול להפעיל את הדברים הבאים:

באמצעות הכיתה GEOSGeometry, יצרת אובייקט מצולע המייצג מתאר של בנק Suntrust מסוים בסן אנטוניו, טקסס. כל קואורדינטות הניתנות לפרמטר POLYGON מגדירות "פינה" של מתווה הבניין.

שמירת דגמים עם שדות רסטר באמצעות GDALRaster

כשאתה עובד עם נתוני רסטר, אתה צריך את השדה המשמש לאחסון רסטר (נקרא RasterField). פונקציונליות הרסטר תמיד הייתה חלק מ- PostGIS, אך החל מ- PostGIS 3.0, סיומת הרסטר נשברה לתוסף נפרד. לאחר ההתקנה, ודא שהסיומת מופעלת במסד הנתונים שלך על ידי הפעלה:

עכשיו, נניח שיש לך דגם בשם Elevation עם שדה רסטר. מודל הגובה מייצג את המימד האנכי והאופקי של משטחים שונים, ו- RasterField עליו (רסט, כפי שנראה למטה) יהיה שדה שלוקח אובייקט רסטר מופשט המתאר את הגובה. לדוגמה, זו יכולה להיות מיפוי לוויני של שטח הגבעה:

ה- RasterField מאחסן אובייקט GDALRaster. GDALRaster הוא אובייקט התומך בקריאה של פורמטים של קבצים מרחביים כגון קבצי סריקה. אפשר לייצר את זה עם שתי כניסות. הפרמטר הראשון יכול להיות או מחרוזת המייצגת נתיב קובץ או מילון או אובייקט בתים המייצג את הרסטר. הפרמטר השני מציין אם יש לפתוח את הרסטר במצב "כתיבה". אם אינך משתמש במצב כתיבה, אינך יכול לשנות את נתוני הרסטר.

למטה, GDALRaster לוקח את הקובץ raster.tif, קורא אותו כאובייקט קובץ וממצה אותו לאובייקט GDALRaster שניתן לאחסן ב- RasterField של הדגם:

באופן זה, תוכלו לאחסן קובץ תמונה .tif של רסטר המייצג את השטח של הר פוג'י.

ניתן ליצור רסטר חדש גם באמצעות נתונים גולמיים ממילון פייתון המכיל את קנה המידה של הפרמטרים, הגודל, המקור וה- srid. להלן תוכלו לראות כיצד להגדיר רסטר חדש המתאר קניון ברוחב ובגובה של 10 פיקסלים ורצועות המייצגות שכבה אחת של נתונים ברסטר:

חיפוש נקודות בחלל באמצעות בדיקות גיאומטריה

בדיקות גיאומטריה עוזרות לך למצוא נקודות, קווים ומצולעים בגיאומטריה אחרת. לדוגמה, אתה יכול להשתמש בחיפושי גיאומטריה כדי לקבוע אם נקודה נמצאת בתוך משטח מצולע & # x27s.

ראשית, צור מודל מדינה המוגדר כדלקמן:

מדינה מייצגת טבלה המאחסנת את גבולות מדינות העולם. לאחר מכן, תוכל להשתמש ב- GeoDjango כדי לבדוק אם קואורדינטת נקודה מסוימת מאוחסנת בשדה mpoly באחת המדינות במסד הנתונים:

אתה יכול גם לבצע בדיקה מרחבית כדי לקבוע אם נקודה נמצאת בתוך מדינה מסוימת. הפעל את הקוד שלמטה כדי להגדיר אובייקט נקודה המייצג מיקום ב Valdagrone, סן מרינו. לאחר מכן תוכל לחפש נקודה זו בשיטת המכיל:

חישוב המרחק בין נקודות

לבסוף, בעזרת GeoDjango ניתן לחשב את המרחק בין שתי נקודות. בהנחה שאתה מכיר שתי קואורדינטות נקודה ותרצה למצוא את המרחק ביניהן, תוכל להריץ את הדברים הבאים במעטפת הפייתון שלך:

דוגמה זו משתמשת בשיטת הטרנספורמציה כדי להמיר את קואורדינטות הנקודה ממעלות עשרוניות רוחב / אורך למרחק מטרי.

כדי להמחיש דוגמה ספציפית יותר לג'נגו, תוכל ליצור מודל לערים בארצות הברית שנראה כך:

לחישוב המרחק בין הערים נקודת תקווה ו נקודה הנחה, אתה יכול להשתמש בדגמים כאלה:

GeoDjango מספק גם כמה פונקציות לחיפוש מרחק כגון distance_lt, distance_lte, distance_gt, distance_gte ו- dwithin. לדוגמה:

באופן זה, אתה יכול להשתמש ב- GeoDjango כדי למצוא את המרחק בין שני מודלים עם נקודות מיקום או שני אובייקטים נקודתיים גולמיים. בשילוב שיטה זו עם נתוני וקטור או רסטר אודות כבישים, תוכל לבנות חישובי מרחק מורכבים לנהיגה, הליכה או רכיבה על אופניים ביישום שלך.

לנתונים מרחביים יש מקרי שימוש חשובים רבים בעולם האמיתי. בפוסט זה ראית כיצד PostGIS ו- GeoDjango יכולים לעזור לך להשתמש בנתונים מרחביים לבניית יישומי אינטרנט מודעים למיקום, אך עדיין יש עוד הרבה מה ללמוד על הנושא. הקפד לבדוק את תיעוד המבוא של PostGIS ואת ה- API של GeoDjango למידע נוסף ודוגמאות.

שתף את המאמר הזה: אם אהבתם את המאמר הזה, כדאי לכם לצייץ אותו לעמיתיכם.


אשכולות מרחביים עם PostGIS? - מערכות מידע גיאוגרפיות

מזלג עבודה של פרויקט PostGIS svn (http://svn.osgeo.org/postgis/)

השתמש ב- Git או בקופה עם SVN באמצעות כתובת ה- URL.

עבוד מהר עם ה- CLI הרשמי שלנו. למד עוד.

משיק את GitHub Desktop

אם שום דבר לא קורה, הורד את GitHub Desktop ונסה שוב.

משיק את GitHub Desktop

אם שום דבר לא קורה, הורד את GitHub Desktop ונסה שוב.

השקת Xcode

אם שום דבר לא קורה, הורד את Xcode ונסה שוב.

השקת קוד Visual Studio

מרחב הקודים שלך ייפתח ברגע שמוכן.

הייתה בעיה בהכנת מרחב הקודים שלך, נסה שוב.


מתווה קורס

יום 1

  1. ברוך הבא
  2. מבוא
    • רקע והיסטוריה של מאגרי מידע מרחביים, PostgreSQL ו- PostGIS
    • הסבר על מערכות ניהול מסדי נתונים יחסיים
    • יתרון של מסד נתונים על פני קבצים כגון צורות טופס
    • יישומים התומכים ב- PostGIS
    • יישומים בעולם האמיתי של PostGIS
    • השוואה לפתרונות קנייניים של מאגרי מידע
  3. התקנת PostgreSQL, pgAdmin, PostGIS ו- QGIS
    • ב- Windows, Linux או OS X
  4. יצירת מסד נתונים מרחבי
    • צור מסד נתונים חדש והפעל אותו באופן מרחבי באמצעות PostGIS
  5. טוען נתונים מרחביים
    • כלי הטעינה של צורת הצורה של PostGIS
    • QGIS DBManager
    • כלים אחרים
  6. סקירה כללית של נתוני התרגיל
  7. SQL פשוט
    • הכל ב- PostGIS נעשה עם SQL (שפת שאילתות מובנית), כך שאם אינך יודע דבר זה ייתן לך את היסודות. כל מסדי הנתונים משתמשים ב- SQL ולכן זו מיומנות קריטית
  8. תרגילי SQL פשוטים
    • תרגול SQL בסיסי
  9. גיאומטריות
    • הבנת גיאומטריות תכונות פשוטות של OGC וכיצד לאחסן אותן ולבצע בהן מסד נתונים
  10. תרגילי גיאומטריה
    • תרגול פונקציות גיאומטריה
  11. יחסים מרחביים
    • פונקציות לבדיקה ותיאור מערכות יחסים, כמו שווה, פסיכולוג, בתוך וכו '. אם ביצעת GIS אתה יודע כיצד לעשות זאת ב- GIS שולחני - עשה אותם כעת במסד נתונים!
  12. תרגילי יחסים מרחביים
    • תרגול פונקציות של מערכות יחסים מרחביות
  13. הצטרפות מרחבית
    • אחת מיכולות הליבה ב- GIS, ביצוע הצטרפות מרחבית למסד נתונים הוא גמיש ועוצמתי להפליא.
  14. מרחב מצטרף לתרגילים
    • תרגול הצטרפות מרחבית
  15. אינדקס מרחבי
    • אינדקס מרחבי מזרז שאילתות של נתונים מרחביים

יום 2

  1. מקרין נתונים
    • שינוי גיאומטריות בין מערכות התייחסות שונות לקואורדינטות.
  2. תרגילי הקרנה
  3. גֵאוֹגרַפיָה
    • אחסן את הנתונים שלך כארוך-לאט (לא מוקרן) ועם זאת בצע פעולות מרחביות מדויקות מאוד תוך שימוש בגיאומטריה כדורית (בספרואיד WGS84)
  4. פונקציות לבניית גיאומטריה
    • פונקציות המביאות לגיאומטריות חדשות, למשל.
    • בַּלָם
    • Centroid
    • הִצטַלְבוּת
    • איחוד (aka להתמוסס או להתמזג)
  5. הצטרפות מרחבית יותר
    • מבט מעמיק יותר על צירופים מרחביים, תוך שילוב פונקציות אחרות המכוסות מאז סעיף ההצטרפות המרחבית הראשון
    • טעינה וביצוע מצטרף לטבלאות שאינן מרחביות
  6. תוֹקֶף
    • בדיקת תקפות הגיאומטריות
  7. שוויון
    • מבט מעמיק יותר על משמעות שוויון בין גיאומטריות
  8. הפניה לינארית
    • תכונות התייחסות המבוססות על מיקומן לאורך קו במקום שימוש בקואורדינטות x, y או קוטביות.
  9. מודל 9-צומת מורחב באופן ממדי
    • הבנה, בדיקה וניצול כל היחסים האפשריים בין גיאומטריות
  10. מקבץ על מדדים
    • אשכול בסיסי נתונים הוא כלי לשיפור ביצועים שמציב פיזית נתונים קשורים זה לזה בדיסק
  11. 3-D
    • עבודה עם גיאומטריות תלת ממדיות ב- PostGIS
  12. השכן הקרוב ביותר מחפש
    • לא משנה מה המרחק, מה הכי קרוב? יותר מסובך ממה שאתה חושב. PostGIS פותר את זה בצורה מסודרת
  13. מעקב אחר היסטוריית עריכה באמצעות טריגרים
    • השתמש בטריגרים רגילים של PostgreSQL כדי לשמור תיעוד של מי יצר / ערך / מחק רשומה
  14. קונסטרוקציות גיאומטריה מתקדמות
    • ללמוד כמה פונקציות וגישות SQL מתקדמות לפתרון בעיות מסובכות
  15. כוונון PostgreSQL למרחב
    • PostgreSQL כ- RDBMS יכול להיות ומשמש לאחסון כל דבר ולכן תצורת ברירת המחדל שלה מיועדת לביצועים כלליים. נתונים מרחביים מציבים אתגרים ייחודיים - למד כיצד להגדיר את מסד הנתונים לביצועים מיטביים
  16. אבטחה PostgreSQL
    • כיצד להגן על שלמות וביטחון הנתונים והמאגר שלך
    • אימות ותפקידים
    • חיבורי בסיס נתונים
    • הצפנה
  17. תוכניות PostgreSQL
    • סכמות הן כמו תיקיות - כיצד ומדוע להשתמש בסכמות
  18. גיבוי ושחזור של PostgreSQL
    • חשוב מאוד!
  19. שדרוגי תוכנה
    • כיצד לטפל בשדרוגים של PostgreSQL או PostGIS

ההערכה מבוססת על השלמה מוצלחת של התרגילים המשתלבים בין מודולי ההוראה.

נעשה שימוש נרחב ב- QGIS לאורך כל הקורס לצורך הדמיית תוצאות, כלקוח SQL (דרך מנהל DB) וכדי לטעון נתונים ל- PostGIS. מוצגים גם pgAdmin ולקוחות אחרים. פקודות SQL שנכתבו במהלך הקורס נשמרות על ידי התלמיד כהפניה וכך הם יכולים לסקור או להשתמש מחדש בשאילתות בבית או בעבודה.

אנו ממליצים לתלמידים להביא נתונים משלהם, כך שאם יש להם זמן ויכולת במהלך הקורס, הם יכולים ליישם על הנתונים שלהם את הכישורים שהם לומדים בקורס ואפילו לחזור למשרד עם בסיס נתונים מרחבי מוכן לשימוש. .


BuntDB - בסיס נתונים למפתח / ערך זיכרון המוטמע להטמעה עבור Go עם אינדקס מותאם אישית ותמיכה גיאו-מרחבית

BuntDB הוא חנות מפתח / ערך ברמה נמוכה, בזיכרון, ב- Go טהור. הוא נמשך לדיסק, תואם ל- ACID ומשתמש בנעילה למספר קוראים ולכותב יחיד. הוא תומך באינדקסים מותאמים אישית ובנתונים גיאו-מרחביים. זה אידיאלי לפרויקטים הזקוקים למסד נתונים אמין ומעדיפים מהירות על פני גודל הנתונים. הרצון ליצור BuntDB נובע מהצורך במסד נתונים חדש להטמעה עבור Tile38 ו- SummitDB.


ניתוח נתוני SSURGO ב- PostGIS: סקירה כללית

חֲדָשׁוֹת
נראה כי ה- NCSS בנה ממשק SQL מבוסס אינטרנט למסד הנתונים הראשי שלהם. כלי חדש זה הודגש בגיליון 40 של עלון NCSS ונראה כמו כלי חדש ומבטיח עם תיעוד טוב. דף זה מציג רשימה של "שירותי אינטרנט" המוצעים על ידי ה- NCSS.

סקירה כללית
הניתוח של נתוני SSURGO מסובך על ידי סדרה של יחסים טבלאיים היררכיים, בין רבים לנתונים מרחביים ותכונות. הבנת מבנה מסד הנתונים של SSURGO היא קריטית לפרשנות ולצבירה נכונה של מאפייני הקרקע. לפני שתבצע ניתוח מבוסס SSURGO, אנא הקדש זמן להתפרסם עם הפרטים על המוצר, כולל שימושים ייעודיים, גודל מינימלי של יחידות מיפוי ופרטים חשובים אחרים. בנוסף, להיות מוכר עם מטא הנתונים של SSURGO הוא חובה. עמוד המטא-נתונים כולל תיאורים מפורטים של מבנה הטבלה, שמות העמודות והיחידות, וכן מידע חשוב על מקורות הנתונים הרבים הנכללים במסד נתונים של SSURGO.

ניתן להוריד את נתוני SSURGO לפי אזור הסקר מ- The Soil Datamart, עם נתונים מרחביים המועברים בפורמט טופס צורה ונתוני תכונות מועברים כטקסט רגיל. למרבה הצער, מ.ס. תבנית מסד נתונים לגישה נדרשת כדי להשתמש בנתוני תכונות SSURGO כפי שנמסרו ממערכת Soil Datamart. לקבלת סיוע בהליך זה אנא עיינו בדף NRCS SSURGO. בעזרת גישה זו, רוב הניתוחים של SSURGO חייבים להיעשות בסקר אחר סקר בסביבת GIS. להוראות כלליות עיין במסמך זה.

מספר יישומים מקוונים מאפשרים אינטראקציה פשוטה עם מסד הנתונים SSURGO ללא צורך בידע GIS או RDBMS. כמה דוגמאות כוללות:

    הממשק המקוון שלנו לנתוני קרקעות CA, AZ ו- NV. דוגמא לאינטראקציה כאן, כאן וכאן. מסופק על ידי יישום NRCS

גישה קוד פתוח ל- SSURGO
פיתחנו גישה חלופית לעבודה עם נתוני SSURGO באמצעות PostGIS, גרסה המותאמת מרחבית של מערכת ניהול מסדי הנתונים היחסית הפופולרית והפתוחה Postgresql, לאחסון כל הנתונים המרחבי והטבלאי עבור 138 אזורי סקר. גישה זו מקלה על גישה מהירה, ניתוח וצבירה של למעלה מחצי מיליון מצולעי קרקע. SQL (שפת שאילתות מובנית) משמש לאינטראקציה ישירה עם נתוני מרחב אדמה ותכונות. אם מייבאים אל PostGIS צורות אחרות של נתונים מרחביים (כגון כיסוי נוח, נתונים אקלימיים וכו '), כמעט כל ניתוח מרחבי ותכונות יכול להיעשות כולו מ- PostGIS. סדרת דוגמאות הממחישות משימות נפוצות תוצג בדפים הבאים.

גישה כללית לעבודה עם SSURGO (מתואר גם במסמך זה) (רעיונות נוספים בנושא הרכב יחידות המפה)

  1. זהה את מאפייני הקרקע שיש לכלול בניתוח כלשהו
  2. החליטו על צורת הצבירה המתאימה לשמש לסיכום אופקים
    • משוקלל עומק (כלומר לחשב אחוז חימר ממוצע דרך אופקים)
    • 1 מטר עליון (כלומר לסיכום יכולת התכווצות-התנפחות של הקרקע העליונה)
    • אופק עליון (כלומר לסיכום פחמן אורגני על פני השטח)
    • סכום פרופיל (כלומר לחשב את יכולת החזקת המים הכוללת)
    • המגביל ביותר (כלומר לחשב את המוליכות ההידראולית המגבילה ביותר בתוך פרופיל הקרקע)
  3. נתוני אופק מצטברים: לאחר סינון ערכי ומשקולות NULL
  4. החלט על צורת הצבירה המתאימה לשמש לסיכום רכיבים
    • משוקלל אחוז רכיב (כלומר זה יכלול מידע מכל רכיב, משוקלל באחוזם המשוער של כל יחידת המפה)
    • הרכיב הגדול ביותר (כלומר בדרך כלל זה מוביל לבחירת הרכיב 'הדומיננטי', אולם כאשר ישנם רכיבים מרובי-זוגות עם קשרים משוערים זהים לאחוזים)
    • גדול דגל רכיב (כלומר רכיבים שסומנו כ'רכיב עיקרי 'על ידי ה- NRCS מייצגים סוגי אדמה דומיננטיים בתוך יחידת מפות. שים לב שלעיתים ישנם מספר רכיבים המסומנים כ'רכיבים עיקריים '.)
    • מצב דומיננטי (כלומר זה משמש בדרך כלל לנתונים קטגוריים כמו תנאים הידריים. הצבירה מתבצעת על ידי בחירת המצב השכיח ביותר ביחידת מפה)
  5. צבירת נתוני רכיבים: לאחר סינון ערכי ומשקולות NULL
  6. join the above aggregated data (2x aggregation process for horizon data) to the map unit polygons
  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:

בחר superhero.name

מ city, superhero

איפה 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?

Congratulations! 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.


צפו בסרטון: Postgresql: Create Postgis database and import shapefiles. (אוֹקְטוֹבֶּר 2021).