我在Maximo 7.6.1.1中有一个工作订单:
LatitudeY
LongitudeX
zone
在单独的GIS数据库中有一个要素类(多边形)。
我想进行 空间查询, 以从 WO相交 的 多边形记录中 返回一个属性,并使用它填充zone到WO中。
我怎样才能做到这一点?
在 Maximo 76脚本功能 (pdf)的“库脚本”部分中修改代码:
#What the script does: # 1. Takes the X&Y coordinates of a work order in Maximo # 2. Generates a URL from the coordinates # 3. Executes the URL via a separate script/library (LIB_HTTPCLIENT) # 4. Performs a spatial query in an ESRI REST feature service (a separate GIS system) # 5. Returns JSON text to Maximo with the attributes of the zone that the work # order intersected # 6. Parses the zone number from the JSON text # 7. Inserts the zone number into the work order record from psdi.mbo import MboConstants from java.util import HashMap from com.ibm.json.java import JSONObject field_to_update = "ZONE" gis_field_name = "ROADS_ZONE" def get_coords(): """ Get the y and x coordinates(UTM projection) from the WOSERVICEADDRESS table via the SERVICEADDRESS system relationship. The datatype of the LatitdeY and LongitudeX fields is decimal. """ laty = mbo.getDouble("SERVICEADDRESS.LatitudeY") longx = mbo.getDouble("SERVICEADDRESS.LongitudeX") #Test values #laty = 4444444.7001941890 #longx = 666666.0312127020 return laty, longx def is_latlong_valid(laty, longx): #Verify if the numbers are legitimate UTM coordinates return (4000000 <= laty <= 5000000 and 600000 <= longx <= 700000) def make_url(laty, longx, gis_field_name): """ Assembles the URL (including the longx and the laty). Note: The coordinates are flipped in the url. """ url = ( "http://hostname.port" "/arcgis/rest/services/Example" "/Zones/MapServer/15/query?" "geometry={0}%2C{1}&" "geometryType=esriGeometryPoint&" "spatialRel=esriSpatialRelIntersects&" "outFields={2}&" "returnGeometry=false&" "f=pjson" ).format(longx, laty, gis_field_name) return url def fetch_zone(url): # Get the JSON text from the feature service (the JSON text contains the zone value). ctx = HashMap() ctx.put("url", url) service.invokeScript("LIBHTTPCLIENT", ctx) json_text = str(ctx.get("response")) # Parse the zone value from the JSON text obj = JSONObject.parse(json_text) parsed_val = obj.get("features")[0].get("attributes").get(gis_field_name) return parsed_val try: laty, longx = get_coords() if not is_latlong_valid(laty, longx): service.log('Invalid coordinates') else: url = make_url(laty, longx, gis_field_name) zone = fetch_zone(url) #Insert the zone value into the zone field in the work order mbo.setValue(field_to_update, zone, MboConstants.NOACCESSCHECK) service.log(zone) except: #If the script fails, then set the field value to null. mbo.setValue(field_to_update, None, MboConstants.NOACCESSCHECK) service.log("An exception occurred")
LIBHTTPCLIENT :(可重用的Jython 库脚本)
from psdi.iface.router import HTTPHandler from java.util import HashMap from java.lang import String handler = HTTPHandler() map = HashMap() map.put("URL", url) map.put("HTTPMETHOD", "GET") responseBytes = handler.invoke(map, None) response = String(responseBytes, "utf-8")