Лучший способ сделать сетку / ажурную сетку на osm, используя стройные и пиосмиевые для распределения комнат / Внутренняя структура
Я пытаюсь построить комнаты внутри объекта / здания OpenStreetMap. Но я застрял в том, какой метод самый простой и быстрый. До сих пор я думал:
- сделать сетку внутри ограничительной рамки здания
- и затем разделите часть здания прямоугольной формы на 3 части (у каждой части здания есть зал посередине между двумя комнатами лицом к лицу)
- проверьте, находится ли сетка внутри внутреннего слоя или нет.
- определить сетку как комнату или зал.
Я успешно получил внешний и внутренний слой корпуса, используя пиосмий и стройный, используя функцию 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. И линия внутри здания пересекает внешний слой, поскольку ее перевод выполняется относительно этой ограничительной рамки вместо рамки самой формы здания.