אמ;לק- בסוף הפוסט יש קובץ הורדה לכלי ל arcmap להורדת Web Map Services

לא פעם נשאלת השאלה איך אפשר להוריד נתונים של web map service  לעבודה ב arcmap

המדריך שלפניכם לא מושלם, טיפה מורכב אבל עובד ברוב הפעמים

הקדמה

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

הקובץ מכיל

  • ArcToolBox  שבתוכו יש 2 סקריפטים (אחד ישן אבל לפעמים נעדיף להשתמש בו)
  • קובץ – RestCacheClass.py שמבצע את הפעולה של ההורדה
  • קבצי – add_serviceV2.py , add_service.py שהם הסקריפטים שהכלי משתמש בהם והם מפנים לקובץ RestCacheClass

 

הסקריפט RestCacheClass.py משתמש בספריות הבאות

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

import arcpy, os, sys, urllib2, urllib, ijson, re, datetime, httplib, time, json

הפעלת הכלי

  • תראו ב arcmap שאתם מחוברים לתיקייה של הכלי
  • בחלונית הכלי נכניס את ה URL , את ה GDB אליו נוריד ושם הקובץ

 מספר היישויות בשכבה

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

  • בסיום ההרצה הקובץ/ הקבצים יעלו למפה
סרוויס עם פחות מאלף יישויות
סרוויס עם יותר מאלף יישויות

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

איך עובד הסקריפט?

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

ייבוא ספריות והכנסת פרמטרים
import RestCacheClass

import arcpy
import urllib2, urllib

mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
service= arcpy.GetParameterAsText(0)
gdb=arcpy.GetParameterAsText(1)
featureClass=arcpy.GetParameterAsText(2)

הגדרת ה query בURL

את הפרמטר הזה נוסיף בעצם ל URL המקורי כדי לדעת כמה יישויות יש לנו בשכבה

que="/query?where=1%3D1&text=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=&returnGeometry=true&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&returnIdsOnly=false&returnCountOnly=true&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&resultOffset=&resultRecordCount=&queryByDistance=&returnExtentsOnly=false&datumTransformation=&parameterValues=&rangeValues=&f=html"

חילוץ מספר הישויות בסרוויס

num='0','1','2','3','4','5','6','7','8','9'
def isnum(str):
 inum=""
 for a in str:
 if a in num:
 #print a
 inum=inum+a
 else:
 pass

return int(inum)


url =service+que
a=urllib2.urlopen(url).read()
c=a.split("Count:")
d=c[-1].split(" ")
#arcpy.AddMessage(d)
#e=int(d[1].split("\r\n")[0])
e=isnum(d[1])

הפעלת הכלי על הסוגים השונים של השכבות

if e< 1000:
 arcpy.AddMessage(e) 
 lyer = RestCacheClass.RestCache(service)
 lyerData = lyer.createFeatureClass(gdb, featureClass)
 query=["1=1"]
 lyer.updateFeatureClass(lyerData, query)
 Layer =gdb+"/"+featureClass
 addLayer = arcpy.mapping.Layer(Layer)
 arcpy.mapping.AddLayer(df, addLayer, "TOP")
 arcpy.RefreshTOC()
 arcpy.RefreshActiveView()
else:
 count=e//1000
 arcpy.AddMessage("More than 1000 ")
 arcpy.AddMessage(count+1)
 for i in range(0,count+1):
 nfeatureClass=featureClass+str(i)
 fro = i * 1000
 to = i * 1000 + 999
 #que="OBJECTID >= " + str(fro) + " and OBJECTID = " + str(fro) + " and OBJECTID <=" + str(to)
 que="OBJECTID >= " + str(fro) + " and OBJECTID <=" + str(to)
 lyer = RestCacheClass.RestCache(service)
 lyerData = lyer.createFeatureClass(gdb, nfeatureClass)
 query=[que]
 arcpy.AddMessage(query)
 #query=["OBJECTID<1000"]
 lyer.updateFeatureClass(lyerData, query)
 Layer =gdb+"/"+nfeatureClass
 addLayer = arcpy.mapping.Layer(Layer)
 arcpy.mapping.AddLayer(df, addLayer, "TOP")
 arcpy.RefreshTOC()
 arcpy.RefreshActiveView()

 

הורדת הכלי כאן

[elementor-template id="1652"]