Лучший способ сделать сетку / ажурную сетку на osm, используя стройные и пиосмиевые для распределения комнат / Внутренняя структура

Я пытаюсь построить комнаты внутри объекта / здания OpenStreetMap. Но я застрял в том, какой метод самый простой и быстрый. До сих пор я думал:

  1. сделать сетку внутри ограничительной рамки здания
  2. и затем разделите часть здания прямоугольной формы на 3 части (у каждой части здания есть зал посередине между двумя комнатами лицом к лицу)
  3. проверьте, находится ли сетка внутри внутреннего слоя или нет.
  4. определить сетку как комнату или зал.

Я успешно получил внешний и внутренний слой корпуса, используя пиосмий и стройный, используя функцию Polygon:

######################################################
##########                RELATION
# Plot inner and outer layer of hospital building
# From RELATION
relation_outer = rel2nod('building', 'hospital', 'w', 'outer') # output is nodes of outer layer
relation_inner = rel2nod('building', 'hospital', 'w', 'inner')

# plot the points
polygons = Polygon(relation_outer[0], relation_inner)
x,y = polygons.exterior.xy
plt.plot(x,y, zorder=1)

И затем из его ограничивающих рамок я попытался сделать прямоугольную рамку для сетки.

# make rectangular box
bounding = polygons.bounds
minx = bounding[0]
miny = bounding[1]
maxx = bounding[2]
maxy = bounding[3]

chordfish = []

chordfish.append(Point(minx,maxy))
chordfish.append(Point(maxx,maxy))
chordfish.append(Point(minx,miny))
chordfish.append(Point(maxx,miny))

Затем с помощью

object.parallel_offset (расстояние, сторона)

функция от стройной, которая берет линию и смещает ее на расстояние и параллельно самой себе. Я пытался сделать перевод линии параллельной ее внешней линии. Мой план состоит в том, чтобы повторять процесс, пока он не коснется другой стороны этой внешней линии. Но я не смог сделать перевод, так как эта функция использует источник ограничивающей рамки карты, (0,0)map. Вместо происхождения коробки, которую я сделал перед ограждением здания, (0,0) здание.

Я надеюсь, что мое объяснение достаточно ясно. Я также поместил результат, чтобы прояснить, в чем проблема. Хотелось бы, чтобы кто-нибудь знал, как это сделать лучше. так как я застрял в этом самом шаге. Спасибо за отклики и идеи.

# select point of outer layer that touched the bounding box
# make the line defining grid
# with a scale between lines == gap

for n in list(polygons.exterior.coords):
    if n[0] == minx:
        left_side = n
    elif n[0] == maxx:
        right_side = n
    elif n[1] == miny:
        down_side = n
    elif n[1] == maxy:
        up_side = n

upper_line = LineString([left_side, up_side])
lower_line = LineString([down_side, right_side])
distance_lines = upper_line.distance(lower_line)
gap = distance_lines/grid_horizontal


grid_line_horizontal = [] # make it tuple
for i in range(grid_horizontal):
    if i == 0:
        grid_line_horizontal.append(upper_line.parallel_offset(gap, 'right'))
    else:
        grid_line_horizontal.append(grid_line_horizontal[i-1].parallel_offset(gap, 'right'))
    x2,y2 = grid_line_horizontal[0].xy
    plt.plot(x2, y2, zorder=1)


# plotting
for cor in chordfish:
    plt.plot(cor.x, cor.y, 'o')

#plt.show()
mplleaflet.show()

Результат:

4 цветные точки ограничивают рамки здания относительно карты OSM. И линия внутри здания пересекает внешний слой, поскольку ее перевод выполняется относительно этой ограничительной рамки вместо рамки самой формы здания.

0 ответов

Другие вопросы по тегам