def modify_way(wayIn, refsIn, tagsIn, user, timestamp = None): way = pgmap.OsmWay() way.objId = wayIn.objId way.metaData.version = wayIn.metaData.version + 1 if timestamp is None: way.metaData.timestamp = int(time.time()) else: way.metaData.timestamp = int(timestamp) way.metaData.changeset = 1000 way.metaData.uid = user.id way.metaData.username = user.username way.metaData.visible = True for k in tagsIn: way.tags[k] = tagsIn[k] for ref in refsIn: way.refs.append(ref) data = pgmap.OsmData() data.ways.append(way) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print (errStr.errStr) else: t.Commit() return ok, way
def create_way(uid, username, refs, changeset = 1000, timestamp = None): way = pgmap.OsmWay() way.objId = -1 way.metaData.version = 1 if timestamp is None: way.metaData.timestamp = int(time.time()) else: way.metaData.timestamp = int(timestamp) way.metaData.changeset = changeset way.metaData.uid = uid way.metaData.username = username way.metaData.visible = True way.tags["test"] = "spring" for ref in refs: way.refs.append(ref) data = pgmap.OsmData() data.ways.append(way) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print (errStr.errStr) return None else: t.Commit() way.objId = createdWayIds[-1] return way
def modify_node(nodeIn, nodeCurrentVer, user, timestamp = None): node = pgmap.OsmNode() node.objId = nodeIn.objId node.metaData.version = nodeCurrentVer + 1 if timestamp is None: node.metaData.timestamp = int(time.time()) else: node.metaData.timestamp = int(timestamp) node.metaData.changeset = 1000 node.metaData.uid = user.id node.metaData.username = user.username node.metaData.visible = True node.tags["test"] = "winter" node.lat = nodeIn.lat + 0.1 node.lon = nodeIn.lon + 0.2 data = pgmap.OsmData() data.nodes.append(node) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print (errStr.errStr) else: t.Commit() return ok, node
def modify_relation(uid, username, relationIn, refsIn, tagsIn): relation = pgmap.OsmRelation() relation.objId = relationIn.objId relation.metaData.version = relationIn.metaData.version + 1 relation.metaData.timestamp = int(time.time()) relation.metaData.changeset = 1000 relation.metaData.uid = uid relation.metaData.username = username relation.metaData.visible = True for k in tagsIn: relation.tags[k] = tagsIn[k] for refTypeStr, refId, refRole in refsIn: relation.refTypeStrs.append(refTypeStr) relation.refIds.append(refId) relation.refRoles.append(refRole) data = pgmap.OsmData() data.relations.append(relation) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print (errStr.errStr) return None else: t.Commit() return relation
def create_relation(uid, username, refs, changeset=1000): relation = pgmap.OsmRelation() relation.objId = -1 relation.metaData.version = 1 relation.metaData.timestamp = 0 relation.metaData.changeset = changeset relation.metaData.uid = uid relation.metaData.username = username relation.metaData.visible = True relation.tags["test"] = "moon" for refTypeStr, refId, refRole in refs: relation.refTypeStrs.append(refTypeStr) relation.refIds.append(refId) relation.refRoles.append(refRole) data = pgmap.OsmData() data.relations.append(relation) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print(errStr.errStr) return None else: t.Commit() relation.objId = createdRelationIds[-1] return relation
def upload(request, changesetId): #Check changeset is open and for this user t = p.GetTransaction("EXCLUSIVE") changesetData = pgmap.PgChangeset() errStr = pgmap.PgMapError() ret = t.GetChangeset(int(changesetId), changesetData, errStr) if ret == -1: return HttpResponseNotFound("Changeset not found") if ret == 0: return HttpResponseServerError(errStr.errStr) if not changesetData.is_open: err = "The changeset {} was closed at {}.".format( changesetData.id, changesetData.close_datetime.isoformat()) response = HttpResponse(err, content_type="text/plain") response.status_code = 409 return response if request.user.id != changesetData.uid: return HttpResponse("This changeset belongs to a different user", status=409, content_type="text/plain") #Prepare diff result xml responseRoot = ET.Element('diffResult') doc = ET.ElementTree(responseRoot) responseRoot.attrib["version"] = str(settings.API_VERSION) responseRoot.attrib["generator"] = settings.GENERATOR createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() for i in range(request.data.blocks.size()): action = request.data.actions[i] block = request.data.blocks[i] ifunused = request.data.ifunused[i] timestamp = time.time() ret = upload_block(action, block, changesetId, t, responseRoot, request.user.id, request.user.username, timestamp, createdNodeIds, createdWayIds, createdRelationIds, ifunused) if ret != True: print(ret) return ret t.Commit() sio = io.BytesIO() doc.write( sio, str("UTF-8")) # str work around https://bugs.python.org/issue15811 return HttpResponse(sio.getvalue(), content_type='text/xml')
def upload_single_object(action, request, obj, objType, t): #Additional validate of input if (request.data.nodes.size() != (objType == "node") or request.data.ways.size() != (objType == "way") or request.data.relations.size() != (objType == "relation")): return HttpResponseBadRequest("Wrong number of objects") changesetId = obj.metaData.changeset #Check changeset is open and for this user changesetData = pgmap.PgChangeset() errStr = pgmap.PgMapError() ret = t.GetChangeset(int(changesetId), changesetData, errStr) if ret == -1: return HttpResponseNotFound("Changeset not found") if ret == 0: return HttpResponseServerError(errStr.errStr) if not changesetData.is_open: err = "The changeset {} was closed at {}.".format( changesetData.id, datetime.datetime.fromtimestamp( changesetData.close_timestamp).isoformat()) response = HttpResponse(err, content_type="text/plain") response.status_code = 409 return response if request.user.id != changesetData.uid: return HttpResponse("This changeset belongs to a different user", status=409, content_type="text/plain") #Prepare diff result xml responseRoot = ET.Element('diffResult') doc = ET.ElementTree(responseRoot) responseRoot.attrib["version"] = str(settings.API_VERSION) responseRoot.attrib["generator"] = settings.GENERATOR createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() timestamp = time.time() ret = upload_block("create", request.data, changesetId, t, responseRoot, request.user.id, request.user.username, timestamp, createdNodeIds, createdWayIds, createdRelationIds) if ret != True: return ret t.Commit() return True
def delete_object(objIn, user, tIn=None, timestamp=None): if isinstance(objIn, pgmap.OsmNode): obj = pgmap.OsmNode() elif isinstance(objIn, pgmap.OsmWay): obj = pgmap.OsmWay() elif isinstance(objIn, pgmap.OsmRelation): obj = pgmap.OsmRelation() obj.objId = objIn.objId obj.metaData.version = objIn.metaData.version + 1 if timestamp is None: obj.metaData.timestamp = int(time.time()) else: obj.metaData.timestamp = int(timestamp) obj.metaData.changeset = 1000 obj.metaData.uid = user.id obj.metaData.username = user.username obj.metaData.visible = False if isinstance(objIn, pgmap.OsmNode): obj.lat = objIn.lat obj.lon = objIn.lon data = pgmap.OsmData() if isinstance(objIn, pgmap.OsmNode): data.nodes.append(obj) elif isinstance(objIn, pgmap.OsmWay): data.ways.append(obj) elif isinstance(objIn, pgmap.OsmRelation): data.relations.append(obj) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() if tIn is not None: t = tIn else: t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if tIn is None: if not ok: t.Abort() print(errStr.errStr) else: t.Commit() return ok
def create_node(uid, username, nearbyNode=None, changeset=1000, timestamp=None): node = pgmap.OsmNode() node.objId = -1 node.metaData.version = 1 if timestamp is None: node.metaData.timestamp = int(time.time()) else: node.metaData.timestamp = int(timestamp) node.metaData.changeset = changeset node.metaData.uid = uid node.metaData.username = username node.metaData.visible = True node.tags["test"] = "autumn" if nearbyNode is None: node.lat = 43.0 + random.uniform(-1.0, 1.0) node.lon = -70.3 + random.uniform(-1.0, 1.0) else: node.lat = nearbyNode.lat + random.uniform(-0.00015, 0.00015) node.lon = nearbyNode.lon + random.uniform(-0.00015, 0.00015) data = pgmap.OsmData() data.nodes.append(node) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print(errStr.errStr) return None else: t.Commit() node.objId = createdNodeIds[-1] return node