Something

איך מוצאים אלו ישובים נמצאים ליד הגבול לפי מרחק?​

איך מוצאים אלו יישובים נמצאים ליד הגבול לפי מרחק?

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

עם הכניסה הקרקעית ללבנון, אנשים ביקשו להכיר מי הם הישובים הסמוכים לגבול בצד הלבנוני וכמה הם קרובים לגבול?
הממשלה הציעה תכנית למענק בבניית ממ"ד לישובים במרחק 1-5 ק"מ.

איך משיגים רשימה כזו של ישובים לפי מרחק?

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

 

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

ביקשו ממני להכין רשימה כזו, רצוי בכלים פשוטים.

צריך בשביל זה רק חשבון גוגל רגיל וקצת SQL.

הנה המתכון שלי, בתיאבון..

 

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

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

 

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

חברות הענן למיניהן (AWS,GCP, Azure) נותנות אפשרות לעבוד עם מוצרי Datawarehouse שלהם וגם מתחזקות מידע פתוח עולמי, חלקו גיאוגרפי.

[אני בחרתי להשתמש במנוע של גוגל, אבל זה אפשרי גם בעננים האחרים]

לגוגל יש את מנוע ה- Big query שכולל יכולות SQL ו-SQL Spatial ובנוסף כולל מידע פתוח עולמי, חלקו גיאוגרפי (overture maps, open street map) כבסיס נתונים לתישאול. במידע הפתוח יש גם מידע על גבולות וישובים. 

[המידע  הזה לא רשמי או מסחרי אבל מספיק טוב למשימה מסוג זה]

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

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

signpost with distances on sea front

מתכון לרשימת ישובים לפי מרחק מגבול לבנון

מצרכים:

  • חשבון גוגל סטנדרטי
  • פרויקט GCP
  • קורט SQL
  • תבלין Spatial SQL
  • תבנית אפיה של גוגל שיטס

אופן ההכנה:

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

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

לגוון קצת את המתכון;

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

את התוצאות, אם רוצים לנתח הלאה, אפשר לפתוח  בדשבוארד, ב-Looker Studio של גוגל ולשלב עם מידע אחר שיש לכם. אפשר גם בקלות לשנות את השאילתה לגבול אחר ומדינות אחרות.

*הטבלה שייצרתי של כל הישובים משני צדדי הגבול ישראל ולבנון במרחק 3 ק"מ, להורדה למטה למי שרוצה להוריד את הרשימה המוכנה.

הסבר מפורט

אחרי שפתחתם פרויקט ב-Google cloud-Big query פותחים שאילתה חדשה דרך הדשבוארד או על ידי לחיצה על ה + הכחול למעלה:

עכשיו, ייפתח טאב של שאילתה חדשה בשם "Untitled query".
העתיקו הדביקו שם את קוד ה-SQL שכתבתי  מטה (הסבר טכני בהערות בתוכו) ולחצו על כפתור RUN או ctrl+enter. ויש לכם רשימה מלאה עם כל התוספות (לינק למפה, ויקפדיה ועוד)

עכשיו אפשר לקחת את המידע ולהמשיך לעבוד איתו, על מפה, בסטודיו או לייצא לקובץ (פירוט בסוף פוסט קודם)

אני בחרתי בפיצ'ר החדש והממש מועיל: חיבור לגוגל שיטס. 

פשוט לבחור google sheets בתפריט save results מעל תוצאות הטבלה מימין:

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

בתיאבון! ושנדע ימים שקטים יותר בצפון ובכל הארץ

 

				
					--get ready the area of intrest from OSM maps (Isreal, Lebanon countries area)
with bound as (
SELECT (SELECT value FROM unnest(all_tags) WHERE key='name:en') as country,geometry as geom from `bigquery-public-data.geo_openstreetmap.planet_features`
        WHERE feature_type="multipolygons"
          AND (('name:en', 'Israel') in (SELECT (key, value) from unnest(all_tags)) or ('name:en', 'Lebanon') in (SELECT (key, value) from unnest(all_tags) ))
          AND ('boundary', 'administrative') in (SELECT (key, value) from unnest(all_tags))
          AND ('admin_level', '2') in (SELECT (key, value) from unnest(all_tags))
),
--get ready the places list from OSM maps that are inside the countries area above
places as
( 
SELECT osm_id,bound.country,
(SELECT value FROM unnest(all_tags) WHERE key='name:he') AS name,(SELECT value FROM unnest(all_tags) WHERE key='name:en') AS name_en,(SELECT value FROM unnest(all_tags) WHERE key='place')as place,(SELECT value FROM unnest(all_tags) WHERE key='population')as pop,(SELECT value FROM unnest(all_tags) WHERE key='wikidata')as wikidata,
geometry as WKT,st_x(geometry) as lon, st_y(geometry) as lat
 from `bigquery-public-data.geo_openstreetmap.planet_features` bs, bs.all_tags t ,bound
        WHERE feature_type="points"
          AND (t.key ='place') and t.value in('city' ,'town' ,'village')
          and ST_DWithin(bound.geom, bs.geometry,0)
),
--get the line boundary between the countries from OSM
LebanonBound as
(
 SELECT geometry as WKT
 from `bigquery-public-data.geo_openstreetmap.planet_features`
        WHERE feature_type="lines"
          AND ('name:en', 'Lebanon - Israel') in (SELECT (key, value) from unnest(all_tags))
          or ('name:en', 'Israel - Lebanon') in (SELECT (key, value) from unnest(all_tags))
          AND ('boundary', 'administrative') in (SELECT (key, value) from unnest(all_tags))
          AND ('admin_level', '2') in (SELECT (key, value) from unnest(all_tags))
)
--now for the real fun: compile the table we want with the columns we want by distance.
--Adding links to wikidata and creating hyperlinks to googlemaps
select max(places.country) as country,cast(min(st_distance(places.WKT, LebanonBound.WKT ,true))as int) as distance_border, min(places.name) as name_he,min(places.name_en) as name_en,max(places.place) as type, max(places.pop) pop
,'https://www.wikidata.org/wiki/'||max(wikidata) as wikidata,'http://maps.google.com/maps?t=k&q=loc:'||max(lat)||'+'||max(lon) as map_link
from places, LebanonBound
where cast(st_distance(places.WKT, LebanonBound.WKT ,true)as int) <3000 --<<set here the distance limit--->></3000>
group by places.osm_id
order by distance_border
				
			

שתפו מאמר

פייסבוק
טויטר
פינטרסט
לינקדין
וואטספ
טלגרם

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

דילוג לתוכן