יותר

הימנעות מכשלים מ- ArcObjects geoprocessing עם .NET?


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

התוכנה שלי פועלת בתוך ArcMap, אז אין צורך לבצע AoInitialize שוב, נכון?

public void Execute () {InitializeProduct (); נסה {Geoprocessor gp = Geoprocessor חדש (); gp.OverwriteOutput = true; FeatureToPoint featureToPoint = FeatureToPoint חדש (); string outputPathName = CurrentWorkspace.PathName + " teste_centroide"; featureToPoint.in_features = InputFeatureClass; featureToPoint.out_feature_class = outputPathName; featureToPoint.point_location = "בפנים"; תוצאה IGeoProcessorResult = (IGeoProcessorResult) gp.Execute (featureToPoint, null); if (result == null) {for (int i = 0; i <= gp.MessageCount - 1; i ++) {Console.WriteLine (gp.GetMessage (i)); }} IGPUtilities gpUtils = GPUtilitiesClass חדש (); this.OutputFeatureClass = gpUtils.OpenFeatureClassFromString (outputPathName); } catch (יוצא מן הכלל) {MessageBox.Show (ex.Message + " r  n"); }

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

הקוד הזה פשוט נותן לי שגיאה. האם זה בגלל החתימה?

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

מישהו יכול להפנות לי פתרון "יותר נחמד"? אני צריך להריץ מספר תהליכים שכבר בנויים ב- ArcToolbox שאני ממש לא רוצה לשכפל.


בקוד למטה, הפונקציה multi2single עובדת בשבילי ב- 10.0. לא יכולתי לבדוק Feature2Point מכיוון שאין לי רישיון ArcInfo, נכון?

מבחן ברמה הציבורית {public static void TestGP (אפליקציית IApplication) {IMxDocument mxDoc = (IMxDocument) app.Document; //Feat2Point((IFeatureLayer)mxDoc.FocusMap.get_Layer(0), @"D:  Projects  AmberGIS  Forums  forumtest.gdb  f2p"); Multi2Single ((IFeatureLayer) mxDoc.FocusMap.get_Layer (0), @"D:  Projects  AmberGIS  Forums  forumtest.gdb  m2s"); } חלל סטטי ציבורי Multi2Single (IFeatureLayer inLayer, string outPath) {MultipartToSinglepart m2s = MultipartToSinglepart חדש (); m2s.in_features = inLayer.FeatureClass; m2s.out_feature_class = outPath; ביצוע (מ"ר); } חלל סטטי ציבורי Feat2Point (IFeatureLayer inLayer, string outPath) {FeatureToPoint f2p = חדש FeatureToPoint (); f2p.in_features = inLayer.FeatureClass; f2p.out_feature_class = outPath; ביצוע (f2p); } פתח סטטי ציבורי ציבורי (IGPProcess proc) {Geoprocessor gp = Geoprocessor חדש (); gp.AddOutputsToMap = true; gp.OverwriteOutput = true; gp.RegisterGeoProcessorEvents ((IGeoProcessorEvents) GPEvents חדש); IGeoProcessorResult2 result = gp.Execute (proc, null) בתור IGeoProcessorResult2; IGPMessages msgs = result.GetResultMessages (); עבור (int i = 0; i

אני מקבל את הפלט הזה ב- VS:

PreToolExecute PostToolExecute2 MultipartToSinglepart Executing: MultipartToSinglepart GPL0 D:  Projects  AmberGIS  Forums  forumtest.gdb  m2s esriGPMessageTypeProcessDefinition Time Start: Thu Sep 02 11:32:44 2010 esriGPed Time TessStepTessessThessedThessedTessSepTessessThisPadSenseThisPadTime 7.00 שניות) esriGPMessageTypeProcessStop

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

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

נסה זאת לאחר כל שיחה (בדוק את GetMessageS, לא GetMessage) ...

Console.WriteLine ("Messages:" + gp.GetMessages (1)); Console.WriteLine ("אזהרות:" + gp.GetMessages (2)); Console.WriteLine ("שגיאות:" + gp.GetMessages (3));


צפו בסרטון: ArcGIS Desktop: New HTML Popup Tool (סֶפּטֶמבֶּר 2021).