def getoscdiff(timebase, cat1, cat2, cat3): timenow = int(time.time()) epochts = int(time.mktime(settings.REPLICATE_EPOCH.timetuple())) if timebase == "minute": pageStep = 60000000 if timebase == "hour": pageStep = 60000000 * 60 if timebase == "day": pageStep = 60000000 * 60 * 24 pageStep2 = pageStep / 1000 pageStep3 = pageStep2 / 1000 pageStartTimestamp = int(cat1) * pageStep + int(cat2) * pageStep2 + int( cat3) * pageStep3 + epochts elapsedInPage = timenow - pageStartTimestamp if elapsedInPage < 0: return HttpResponseNotFound("Page does not exist") t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetReplicateDiff(pageStartTimestamp - pageStep3, pageStartTimestamp, osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return sio.getvalue()
def object_history(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetObjectsHistoryById(objType, [int(objId)], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def ways_for_node(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetWaysForNodes([int(objId)], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def relations_for_obj(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetRelationsForObjs(objType.encode("UTF-8"), [int(objId)], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def __init__(self, bbox): self.sio = io.BytesIO() self.enc = pgmap.PyOsmXmlEncode(self.sio, common.xmlAttribs) #Don't let transaction object go out of scope while query is running self.t = p.GetTransaction("ACCESS SHARE") self.mapQuery = self.t.GetQueryMgr() if self.mapQuery.Start(bbox, self.enc) < 0: raise RuntimeError("Map query failed to start") self.complete = False
def object_version(request, objType, objId, objVer): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() idVerPair = pgmap.pairi64i64(int(objId), int(objVer)) t.GetObjectsByIdVer(objType, [idVerPair], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def get_affected_from_upload(request): t = p.GetTransaction("ACCESS SHARE") affectedData = pgmap.OsmData() t.GetAffectedObjects(request.data, affectedData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio) affectedData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def object_history(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetObjectsHistoryById(objType, [int(objId)], osmData) if len(osmData.nodes) + len(osmData.ways) + len(osmData.relations) == 0: return HttpResponseNotFound("{} {} not found".format(objType, objId)) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def get_affected(request, objType, objIds): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetObjectsById(objType, list(map(int, objIds.split(","))), osmData) affectedData = pgmap.OsmData() t.GetAffectedObjects(osmData, affectedData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) affectedData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def ways_for_node(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") #Check reference object exists osmData = pgmap.OsmData() t.GetObjectsById(objType, pgmap.seti64([int(objId)]), osmData) # From the 0.6 spec: "There is no error if the element does not exist." osmData = pgmap.OsmData() t.GetWaysForNodes([int(objId)], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def index(request, objType): if objType not in request.GET: return HttpResponseBadRequest("Incorrect arguments in URL") try: objIds = map(int, request.GET[objType].split(",")) except ValueError as err: return HttpResponseBadRequest(err) t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetObjectsById(objType[:-1], list(objIds), osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def historic_map(request): bbox = request.GET.get('bbox', None) if bbox is None: return HttpResponseBadRequest("bbox must be specified as an argument", content_type="text/plain") dt = request.GET.get('datetime', None) print(dt) if dt is None: return HttpResponseBadRequest( "datetime must be specified as an argument", content_type="text/plain") dt2 = int(round(common.get_utc_posix_timestamp(parse_datetime(dt)))) bbox = list(map(float, bbox.split(","))) if len(bbox) != 4: return HttpResponseBadRequest("Invalid bbox", content_type="text/plain") #left,bottom,right,top dLon = bbox[2] - bbox[0] dLat = bbox[3] - bbox[1] area = dLon * dLat if area > settings.AREA_MAXIMUM: err = "The maximum bbox size is {}, and your request was too large. Either request a smaller area, or use planet.osm".format( settings.AREA_MAXIMUM) response = HttpResponseBadRequest(err, content_type="text/plain") response["Error"] = err return response t = p.GetTransaction("ACCESS SHARE") sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) ret = t.GetHistoricMapQuery(bbox, dt2, enc) t.Commit() return HttpResponse(sio.getvalue(), content_type='text/xml')
def full_obj(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetFullObjectById(objType, int(objId), osmData) if len(osmData.nodes) + len(osmData.ways) + len(osmData.relations) == 0: # No live version found. Check to see if this ever existed. t.GetObjectsHistoryById(objType, [int(objId)], osmData) if len(osmData.nodes) + len(osmData.ways) + len( osmData.relations) == 0: return HttpResponseNotFound("{} {} not found".format( objType, objId)) else: # The object once existed, therefore it was deleted. return HttpResponse("Gone", status=410, content_type="text/plain") sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def element(request, objType, objId): if request.method == 'GET': osmData = pgmap.OsmData() t = p.GetTransaction("ACCESS SHARE") t.GetObjectsById(objType.encode("UTF-8"), pgmap.seti64([int(objId)]), osmData) if len(osmData.nodes) + len(osmData.ways) + len( osmData.relations) == 0: return HttpResponseNotFound("{} {} not found".format( objType, objId)) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml') if request.method in ['PUT', 'DELETE']: t = p.GetTransaction("EXCLUSIVE") action = None if request.method == "PUT": action = "modify" if request.method == "DELETE": action = "delete" obj = None if objType == "node": obj = request.data.nodes[0] if objType == "way": obj = request.data.ways[0] if objType == "relation": obj = request.data.relations[0] if obj.objId != objId: return HttpResponseBadRequest("Object has wrong ID") ret = upload_single_object(action, request, obj, objType, t) if ret != True: return ret return HttpResponse("", content_type='text/plain')
settings = ReadConfig("config.cfg") p = pgmap.PgMap( "dbname={} user={} password='******' hostaddr={} port=5432".format( settings["dbname"], settings["dbuser"], settings["dbpass"], settings["dbhost"]), settings["dbtableprefix"], settings["dbtabletestprefix"]) print("Connected to database", p.Ready()) t = p.GetTransaction(b"ACCESS SHARE") if 0: sio = io.BytesIO() #enc = pgmap.PyO5mEncode(sio) enc = pgmap.PyOsmXmlEncode(sio) print( t.MapQuery((-1.1473846, 50.7360206, -0.9901428, 50.8649113), 0, enc)) data = sio.getvalue() print(len(data), "bytes") if 1: osmData = pgmap.OsmData() objectIds = [1000594005591, 1000595178493, 1000594446551] t.GetObjectsById("node", pgmap.seti64(objectIds), osmData) print(len(osmData.nodes)) for i in range(len(osmData.nodes)): node = osmData.nodes[i]