יותר

משתמשים בשאילתת השכנים הקרובה ביותר ב- SpatiaLite?


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

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

אני חדש בתחום SpatialLite ומריץ שאילתות מרחביות ב- SQL. אני לא ממש מבין את מטרת המשפט הזה:היכן g1.OGC_FID <> g2.OGC_FID.

שיחקתי גם עם השורה הזו:AND ST_ מכיל (ST_Expand (g1.geometry, 50), g2.geometry)כמו גם הסרתי אותו ועדיין אין לי ערכי מרחק, למרות שאני מקבל תעודת זהות.

תהיתי אם זה יכול להיות בעיה של מערכת קואורדינטות אבל גם הנקודות וגם השורות נמצאות באותה מערכת. אני משתמש בתוסף QSpatiaLite ב- QGIS. מישהו יכול לתת הדרכה?


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

עדכן UgandaBikeTaxis_test SET dist = (SELECT ST_Distance (p.geometry, l.geometry) ו- p.ROWID IN (בחר ROWID מתוך SpatialIndex WHERE f_table_name = "ugandabiketaxis_test" AND search_frame = l.Geometry) FRO_steam_ AST_ AST_ AST_ ASTE .uniqueID = ugandabiketaxis_test.uniqueID ORDER BY ST_Distance (p.geometry, l.geometry) LIMIT 1);

אתה יכול לעשות זאת עם שתי הצהרות UPDATE, אחת למרחק, והשנייה עבור מזהה השורה, עם שאילתת משנה כדי לקבל את הערכים מטבלת השורות. והשתמש ב-

הזמנה לפי ST_Mistance (...) גבול 1

לבנות כדי לקבל רק את הקו הקרוב ביותר.

יש לי שכבת נקודת ערים ושכבת קו hiways. לכל אחד יש עמודת מפתח ראשית 'pk'. הוספתי לערים שתי עמודות: 'dist' ו- 'line_id' כדי להחזיק את הערכים עבור השורה הקרובה ביותר. להלן השאילתות:

UPDATE cities_il SET line_id = (SELECT l.pk FROM hiways_il AS l, cities_il AS p WHERE p.pk = cities_il.pk הזמנה לפי ST_Distance (p.geometry, l.geometry) LIMIT 1); UPDATE cities_il SET dist = (SELECT ST_Distance (p.geometry, l.geometry) FROM hiways_il AS l, cities_il AS p WHERE p.pk = cities_il.pk ORDER BY ST_Distance (p.geometry, l.geometry) LIMIT 1);

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

בדוגמה שלי היו לי רק 100 ערים בערך ו -10,000 הייווייס. וכל עדכון לקח דקה בערך. במקרה שלך, עם מיליון נקודות, בהחלט תצטרך להוסיף אינדקס מרחבי לשורות (אולי גם הנקודות), ולהשתמש בו בשאילתה שלך. אחרת זה כנראה ייקח שעות. תוכלו למצוא שפע דוגמאות לאינדקס מרחבי עם מרחבית, כגון: https://www.gaia-gis.it/fossil/libspatialite/wiki?name=SpatialIndex


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

בחר k.* מתוך knn k, נקודות p WHERE f_table_name = 'linestrings' AND ref_geometry = p.geometry ו- max_items = 1;


צפו בסרטון: spatialite gui (אוֹקְטוֹבֶּר 2021).