def main(): if len(sys.argv) != 2: return 0 params = int(sys.argv[1]) nData = OsmData() # Nodes rData = OsmData() # Reference way tData = OsmData() # Target ways nData.read(sys.stdin) rData.read(sys.stdin) tData.read(sys.stdin) tangle = 0 rangle = 0 if params == 1: rangle = getangle( FOREL(createtable(rData, nData, list(rData.ways.keys())[0]), 15) ) # get main angle of reference object rcenter = getbboxcenter(getbbox(rData, nData, list(rData.ways.keys())[0])) targets = {} for key in tData.ways.keys(): if params == 1: tangle = getangle(FOREL(createtable(tData, nData, key), 15)) # get target object main angle tcenter = getbboxcenter(getbbox(tData, nData, key)) targets[key] = (tangle, tcenter) for key in targets.keys(): treplace(nData, rData, list(rData.ways.keys())[0], tData, key, (rangle, rcenter), targets[key]) tData.mergedata(nData) tData.addcomment("Done.") tData.write(sys.stdout)
def main(): if len(sys.argv) != 2: return 0 params = int(sys.argv[1]) nData = OsmData() # Nodes rData = OsmData() # Reference way tData = OsmData() # Target ways nData.read(sys.stdin) rData.read(sys.stdin) tData.read(sys.stdin) tangle = 0 rangle = 0 if params == 1: rangle = getangle( FOREL(createtable(rData, nData, list(rData.ways.keys())[0]), 15)) #get main angle of reference object rcenter = getbboxcenter(getbbox(rData, nData, list(rData.ways.keys())[0])) targets = {} for key in tData.ways.keys(): if params == 1: tangle = getangle(FOREL(createtable(tData, nData, key), 15)) #get target object main angle tcenter = getbboxcenter(getbbox(tData, nData, key)) targets[key] = (tangle, tcenter) for key in targets.keys(): treplace(nData, rData, list(rData.ways.keys())[0], tData, key, (rangle, rcenter), targets[key]) tData.mergedata(nData) tData.addcomment('Done.') tData.write(sys.stdout)
def main(): nData = OsmData() # Nodes rData = OsmData() # Reference way tData = OsmData() # Target ways nData.read(sys.stdin) rData.read(sys.stdin) tData.read(sys.stdin) rangle = getangle(FOREL(createtable(rData, nData, list(rData.ways.keys())[0]), 15)) rcenter = getbboxcenter(getbbox(rData, nData, list(rData.ways.keys())[0])) targets = {} for key in tData.ways.keys(): tangle = getangle(FOREL(createtable(tData, nData, key), 15)) tcenter = getbboxcenter(getbbox(tData, nData, key)) targets[key] = (tangle, tcenter) for key in targets.keys(): treplace(nData, rData, list(rData.ways.keys())[0], tData, key, (rangle, rcenter), targets[key]) tData.mergedata(nData) tData.addcomment('Done.') tData.write(sys.stdout)
def main(): if len(sys.argv) != 3: return 0 wData = OsmData() # Way nData = OsmData() # Nodes wData.read(sys.stdin) wData.read(sys.stdin) nData.read(sys.stdin) radius = float(sys.argv[1]) segments = int(sys.argv[2]) nodes = [] usednodes = set() for way in wData.ways.items(): for key in nData.nodes.keys(): if key in usednodes: continue try: index = way[1][REF].index(key) except ValueError: pass else: lastindex = len(way[1][REF]) - 1 if way[1][REF][0] == way[1][REF][lastindex]: # polygon if index == 0: nodes.append([way[1][REF][lastindex-1], key, way[1][REF][index+1], way[0], index]) # previous node, node for fillet, next node, way usednodes.add(key) else: nodes.append([way[1][REF][index-1], key, way[1][REF][index+1], way[0], index]) usednodes.add(key) else: # way if index > 0 and index < lastindex: nodes.append([way[1][REF][index-1], key, way[1][REF][index+1], way[0], index]) usednodes.add(key) tData = OsmData() tData.mergedata(nData) tData.mergedata(wData) for pack in nodes: M = projections.from4326( (wData.nodes[pack[0]][LON], wData.nodes[pack[0]][LAT]), "EPSG:3857") # previous node O = projections.from4326( (wData.nodes[pack[1]][LON], wData.nodes[pack[1]][LAT]), "EPSG:3857") # center node N = projections.from4326( (wData.nodes[pack[2]][LON], wData.nodes[pack[2]][LAT]), "EPSG:3857") # next node r = radius / math.cos(math.radians(wData.nodes[pack[1]][LAT])) OM = (M[0] - O[0], M[1] - O[1]) ON = (N[0] - O[0], N[1] - O[1]) OMabs = math.sqrt(OM[0]*OM[0] + OM[1]*OM[1]) ONabs = math.sqrt(ON[0]*ON[0] + ON[1]*ON[1]) cosa = (OM[0]*ON[0] + OM[1]*ON[1]) / (OMabs * ONabs) OCabs = r / (math.sqrt((1 - cosa) / 2)) OMnorm = (OM[0]/OMabs, OM[1]/OMabs) ONnorm = (ON[0]/ONabs, ON[1]/ONabs) bisectrix = (OMnorm[0] + ONnorm[0], OMnorm[1] + ONnorm[1]) bisectrixabs = math.sqrt(bisectrix[0]*bisectrix[0] + bisectrix[1]*bisectrix[1]) bisectrixnorm = (bisectrix[0]/bisectrixabs, bisectrix[1]/bisectrixabs) OC = (bisectrixnorm[0]*OCabs, bisectrixnorm[1]*OCabs) C = (O[0]+OC[0], O[1]+OC[1]) P1 = project(OM, O, C) P2 = project(ON, O, C) arc = createarc(C, P1, P2, r, segments) arcref = [] exists = int(segments/2) for point in range(len(arc)): p = projections.to4326(arc[point], "EPSG:3857") if point == exists: tData.nodes[pack[1]][ACTION] = MODIFY tData.nodes[pack[1]][LON] = p[0] tData.nodes[pack[1]][LAT] = p[1] arcref.append(pack[1]) else: newid = tData.addnode() tData.nodes[newid][LON] = p[0] tData.nodes[newid][LAT] = p[1] tData.nodes[newid][TAG] = {} arcref.append(newid) way = tData.ways[pack[3]] way[ACTION] = MODIFY lastindex = len(way[REF]) - 1 index = way[REF].index(pack[1]) ref = way[REF][:] if way[REF][0] == way[REF][lastindex] and index == 0: # polygon way[REF] = arcref[:] way[REF] += (ref[1:lastindex]) way[REF] += [(arcref[0])] else: # way way[REF] = ref[:index] + arcref + ref[index+1:] tData.ways[pack[3]] = way tData.addcomment("Done.") tData.write(sys.stdout) #f = open("out.txt", "w") #tData.write(f) #f.close() return 0
def main(): if len(sys.argv) != 3: return 0 wData = OsmData() # Way nData = OsmData() # Nodes wData.read(sys.stdin) wData.read(sys.stdin) nData.read(sys.stdin) radius = float(sys.argv[1]) segments = int(sys.argv[2]) nodes = [] usednodes = set() for way in wData.ways.items(): for key in nData.nodes.keys(): if key in usednodes: continue try: index = way[1][REF].index(key) except ValueError: pass else: lastindex = len(way[1][REF]) - 1 if way[1][REF][0] == way[1][REF][lastindex]: # polygon if index == 0: nodes.append([ way[1][REF][lastindex - 1], key, way[1][REF][index + 1], way[0], index ]) # previous node, node for fillet, next node, way usednodes.add(key) else: nodes.append([ way[1][REF][index - 1], key, way[1][REF][index + 1], way[0], index ]) usednodes.add(key) else: # way if index > 0 and index < lastindex: nodes.append([ way[1][REF][index - 1], key, way[1][REF][index + 1], way[0], index ]) usednodes.add(key) tData = OsmData() tData.mergedata(nData) tData.mergedata(wData) for pack in nodes: M = projections.from4326( (wData.nodes[pack[0]][LON], wData.nodes[pack[0]][LAT]), "EPSG:3857") # previous node O = projections.from4326( (wData.nodes[pack[1]][LON], wData.nodes[pack[1]][LAT]), "EPSG:3857") # center node N = projections.from4326( (wData.nodes[pack[2]][LON], wData.nodes[pack[2]][LAT]), "EPSG:3857") # next node r = radius / math.cos(math.radians(wData.nodes[pack[1]][LAT])) OM = (M[0] - O[0], M[1] - O[1]) ON = (N[0] - O[0], N[1] - O[1]) OMabs = math.sqrt(OM[0] * OM[0] + OM[1] * OM[1]) ONabs = math.sqrt(ON[0] * ON[0] + ON[1] * ON[1]) cosa = (OM[0] * ON[0] + OM[1] * ON[1]) / (OMabs * ONabs) OCabs = r / (math.sqrt((1 - cosa) / 2)) OMnorm = (OM[0] / OMabs, OM[1] / OMabs) ONnorm = (ON[0] / ONabs, ON[1] / ONabs) bisectrix = (OMnorm[0] + ONnorm[0], OMnorm[1] + ONnorm[1]) bisectrixabs = math.sqrt(bisectrix[0] * bisectrix[0] + bisectrix[1] * bisectrix[1]) bisectrixnorm = (bisectrix[0] / bisectrixabs, bisectrix[1] / bisectrixabs) OC = (bisectrixnorm[0] * OCabs, bisectrixnorm[1] * OCabs) C = (O[0] + OC[0], O[1] + OC[1]) P1 = project(OM, O, C) P2 = project(ON, O, C) arc = createarc(C, P1, P2, r, segments) arcref = [] exists = int(segments / 2) for point in range(len(arc)): p = projections.to4326(arc[point], "EPSG:3857") if point == exists: tData.nodes[pack[1]][ACTION] = MODIFY tData.nodes[pack[1]][LON] = p[0] tData.nodes[pack[1]][LAT] = p[1] arcref.append(pack[1]) else: newid = tData.addnode() tData.nodes[newid][LON] = p[0] tData.nodes[newid][LAT] = p[1] tData.nodes[newid][TAG] = {} arcref.append(newid) way = tData.ways[pack[3]] way[ACTION] = MODIFY lastindex = len(way[REF]) - 1 index = way[REF].index(pack[1]) ref = way[REF][:] if way[REF][0] == way[REF][lastindex] and index == 0: # polygon way[REF] = arcref[:] way[REF] += (ref[1:lastindex]) way[REF] += [(arcref[0])] else: # way way[REF] = ref[:index] + arcref + ref[index + 1:] tData.ways[pack[3]] = way tData.addcomment("Done.") tData.write(sys.stdout) #f = open("out.txt", "w") #tData.write(f) #f.close() return 0