예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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)
예제 #4
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
예제 #5
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