Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
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')
Exemple #7
0
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
Exemple #8
0
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
Exemple #9
0
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