יותר

מעדכן בחזרה ל- GeoServer/Oracle מ- OpenLayers?


עקבתי אחר הדוגמה כדי להגדיר עסקת WFS בהצלחה:

http://dev.openlayers.org/examples/wfs-protocol-transactions.html

הסביבה שלי היא GeoServer 2.6.1/OpenLayers 2.12.1. אני כן מקבל את 4 הסמלים של סרגל הכלים בפינה הימנית העליונה. (לצייר, לשנות, למחוק, לשמור). השתמשתי בשכבה שמחוברת לטבלת אורקל ב- geoserver כשכבה הניתנת לעריכה.

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

// לקוחות הניתנים לעריכה VECTOR Layer var saveStrategy = OpenLayers.Strategy.Save () חדש; לקוחות = OpenLayers.Layer.Vector חדש ("לקוחות", {אסטרטגיות: [new OpenLayers.Strategy.BBOX (), saveStrategy], הקרנה: OpenLayers.Projection חדש ("EPSG: 2236"), פרוטוקול: OpenLayers.Protocol חדש. WFS ({גירסה: "1.1.0", srsName: "EPSG: 2236", כתובת אתר: "http: // server01: 8085/geoserver/sf/wfs", featurePrefix: "sf", featureType: "לקוחות", featureNS : "http://a.org/layers01", geometryName: "GEOMETRY"})});

טבלת האורקל עצמה כוללת את השדות הבאים:

-customerId -geometry -date_updated

כיצד אוכל לבצע תוספות באמצעות openlayers/geoserver/עד לשולחן האורקל? (כדי לכלול ערך מפתח וגיאומטריה וכו ') הייתי רוצה שהדוגמה שלעיל תשמור את הגיאומטריה בחזרה לרשומה ספציפית בטבלה. אני לא בטוח איך להמשיך בנושא.


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

הגדרתי את customerId בשיטת FeatureAdded והגדרתי את המצב ל- OpenLayers.State.UPDATE. בדקתי גם שה- customerId שהצבתי במשתנה added_feature.attributes.customerId אכן קיים בטבלה. זוהי השגיאה שאני מקבל כשאני מנסה לעדכן:

java.lang.RuntimeException: הניתוח נכשל עבור FeatureId: java.lang.NullPointerException הניתוח נכשל עבור FeatureId: java.lang.NullPointerException

לא ניסיתי את השילוב של Geoserver ו- Oracle אבל אני מניח ש- WFS-T אמור לעבוד מחוץ לקופסה כמו שהוא עושה כאשר אני משתמש ב- PostGIS כמאגר נתונים.

קודם כל אני חושב שכדאי שתברר מדוע התכונות שלך אינן מאוחסנות (הפרות אילוצים NOT NULL, אילומי בדיקה או משהו כזה). ב- Geoserver WebUI שלך תוכל לבדוק שוב כי בחלק "שירותים-> WFS" רמת השירות מוגדרת לעסקה או להשלים.

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

var saveStrategy = OpenLayers.Strategy.Save () חדש; function showSuccessMsg (e) {console.log ("העסקה הושלמה בהצלחה"); //console.log(e); } הפונקציה showFailureMsg (e) {alert (e.response.error.exceptionReport.exceptions [0] .texts [0]); //console.log(e); } הפונקציה saveStart (אירוע) {console.log ('שמור התחלת שכבה'); } saveStrategy.events.register ("הצלחה", ", showSuccessMsg); saveStrategy.events.register ('start', null, saveStart); saveStrategy.events.register ('fail', null, showFailureMsg);

כמובן שכדאי שתסתכל גם בכלי הבאגים שלך (למשל באג fir לראות בקונסולה או בכרטיסיית הרשת מה קורה) ואחרון חביב אתה יכול להסתכל בקובצי היומן של ה- DBMS שלך.

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

var draw = new OpenLayers.Control.DrawFeature (wfs, OpenLayers.Handler.Polygon, {title: "Feature Draw", displayClass: "olControlDrawFeaturePolygon", multi: true}); draw.events.register ("featureadded", ", FeatureAdded); function FeatureAdded (object) {console.log ('feature added'); var added_feature = object.feature; added_feature.state = OpenLayers.State.INSERT; // יש להחליף את הגרסה הסטטית באינטראקציה של משתמשים added_feature.attributes.customerId = 42442;} map.addControl (draw);

אם הגדרת את המאפיינים שאתה צריך להגדיר תוכל להפעיל את SaveStrategy (מה נעשה כאשר אתה לוחץ על כפתור השמירה)

saveStrategy.save ();

כשלבים הבאים תוכל להשתמש בדרכים דינאמיות יותר להקצאת התכונות (למשל שדות טקסט ו- document.getElementById.innerHTML)

אם כל זה עובד בסדר אתה יכול להשתמש ב- modifyfeature-control כדי לעדכן גיאומטריה ותכונות. אם אתה מעדכן תכונות אל תשכח להגדיר את featurestate ל- OpenLayers.State.UPDATE


צפו בסרטון: GETTING STARTED WITH POSTGIS, GEOSERVER AND OPENLAYERS (אוֹקְטוֹבֶּר 2021).