from matplotlib import pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch

import numpy
import geopandas as gpd
from shapely.wkt import loads
import cartagen as c4

lines = [
    loads('LINESTRING (289184.21437219734 6246150.13410344, 289215.75580483914 6246150.14309645)'), 
    loads('LINESTRING (288637.3172818263 6246106.108300235, 288631.3408840097 6246118.244113474, 288627.37563865416 6246122.634045328, 288604.23992658715 6246139.395711885, 288560.51632616314 6246178.711389345, 288526.0924697988 6246208.341750289, 288496.5177005692 6246238.605575045)'), 
    loads('LINESTRING (289116.97759501816 6245953.147152052, 289125.31671338686 6245953.341894989, 289135.0143558264 6245954.760227884, 289144.4025478515 6245957.393618262, 289152.40748423565 6245963.669880755, 289163.14649294945 6245969.04762575, 289176.0084014949 6245974.436208194, 289200.5346283961 6245982.165575439, 289225.6736118953 6245988.681353372, 289237.93136127404 6245993.610527186, 289251.84708544106 6246000.525210027, 289271.3610048151 6246009.9017360555, 289281.8022664537 6246014.213269036)'), 
    loads('LINESTRING (289281.31459591363 6246080.518895285, 289281.22981562244 6246097.247652293)'), 
    loads('LINESTRING (289281.31459591363 6246080.518895285, 289281.56488520413 6246061.053518009)'), 
    loads('LINESTRING (288496.5177005692 6246238.605575045, 288491.23856421845 6246233.103089319, 288475.27387984784 6246211.88031431, 288459.0209090466 6246187.766442701, 288444.91765414143 6246158.492884909)'), 
    loads('LINESTRING (289184.21437219734 6246150.13410344, 289183.4672401425 6246177.809726378)'), 
    loads('LINESTRING (289117.49220031087 6246150.097157965, 289118.09103786026 6246181.429705115)'), 
    loads('LINESTRING (289123.1027982971 6246150.125861503, 289184.21437219734 6246150.13410344)'), 
    loads('LINESTRING (289046.67580903426 6246150.038725288, 289117.49220031087 6246150.097157965)'), 
    loads('LINESTRING (288871.5174584371 6245826.269657385, 288812.3949242171 6245823.227888869)'), 
    loads('LINESTRING (288819.13589251053 6245720.914016689, 288813.379479711 6245808.633386019, 288812.3949242171 6245823.227888869)'), 
    loads('LINESTRING (288712.33367048565 6246085.508341264, 288700.9445272949 6246088.643292142)'), 
    loads('LINESTRING (289075.017637285 6245527.571383963, 289069.71146412526 6245527.392134886, 289059.7064011996 6245526.884664227, 289044.22881983063 6245529.086470105, 289011.41844241525 6245540.475896121, 288941.23928445077 6245565.055907173)'), 
    loads('LINESTRING (288651.5914798669 6246102.227921053, 288645.6690414187 6246103.870225628, 288637.3172818263 6246106.108300235)'), 
    loads('LINESTRING (288764.82061175193 6246052.168751328, 288777.474214769 6246039.002783486, 288786.3400066326 6246025.208965364, 288794.3255652259 6246005.631500229)'), 
    loads('LINESTRING (288294.79656754056 6246186.912349576, 288278.71344691893 6246188.653563382, 288256.84204318403 6246195.3833857365, 288244.6628585013 6246204.597086903, 288243.59192430787 6246206.416528559)'), 
    loads('LINESTRING (288444.91765414143 6246158.492884909, 288420.01290689583 6246165.3594227275, 288366.4170597613 6246178.160095999, 288338.0402547805 6246181.966649622)'), 
    loads('LINESTRING (288637.3172818263 6246106.108300235, 288500.4963202632 6246143.420777211, 288444.91765414143 6246158.492884909)'), 
    loads('LINESTRING (288700.9445272949 6246088.643292142, 288651.5914798669 6246102.227921053)'), 
    loads('LINESTRING (289247.2416190762 6245652.849019694, 289157.47742033965 6245562.818281107)'), 
    loads('LINESTRING (288764.82061175193 6246052.168751328, 288746.6799862192 6246070.7814133195, 288728.73695623124 6246080.422169331, 288712.33367048565 6246085.508341264)'), 
    loads('LINESTRING (289276.5056522798 6246251.437762811, 289279.71381280647 6246157.009012389)'), 
    loads('LINESTRING (288241.67331358604 6246283.970539342, 288353.678033132 6246383.563236457, 288387.4987668975 6246412.179782212, 288418.91779146047 6246436.069031892, 288451.7174752609 6246456.923602242, 288479.84775358794 6246471.670260659, 288510.56233825354 6246485.213530869, 288543.5634256192 6246496.487202841, 288606.7174769705 6246512.6316598095, 288641.1218962456 6246516.459801094, 288679.7833165551 6246518.180528832, 288720.89525118715 6246515.198915923, 288760.8041428637 6246510.233726606, 288807.41491940495 6246499.523441406, 288849.65437788307 6246483.619351269, 288893.1239338712 6246464.375431085, 288937.39423243224 6246436.7705230415, 288952.77148285357 6246424.834434673, 289032.85708212026 6246362.128467061, 289082.9360104116 6246325.275570669, 289124.1629281516 6246299.479621282, 289189.0469760377 6246273.500255838, 289205.29715257476 6246268.716474945, 289276.5056522798 6246251.437762811)'), 
    loads('LINESTRING (288966.45282064116 6245705.24717713, 288921.46748764906 6245665.780353164, 288922.2539696308 6245571.193431001)'), 
    loads('LINESTRING (289116.97759501816 6245953.147152052, 289116.41282978473 6245944.931880157, 289116.0012468517 6245936.413237701, 289116.6627057719 6245925.618881949, 289116.97680331324 6245923.491358696, 289124.348770872 6245875.319616884, 289126.28360190766 6245852.669639621, 289127.30470944225 6245800.967983047, 289121.414273968 6245796.375493325, 289086.3594857915 6245801.670918109, 289039.86795077147 6245819.530141834)'), 
    loads('LINESTRING (289039.86795077147 6245819.530141834, 289035.12008388096 6245828.782627365, 289032.79445057793 6245838.807932898, 289032.2915031234 6245848.234274682, 289032.2426778239 6245857.815033897, 289032.5017682558 6245866.484903307, 289033.63500825263 6245882.154939915, 289037.50307856675 6245896.774459639, 289044.8626100987 6245910.651492029, 289055.26413812285 6245922.719156944, 289070.0646315269 6245934.5051951725, 289086.23683971394 6245944.92951704, 289096.5286212475 6245948.78423123, 289116.97759501816 6245953.147152052)'), 
    loads('LINESTRING (289039.86795077147 6245819.530141834, 289032.21763949224 6245803.218497932, 289017.2549318771 6245793.5608357815, 288997.0832701556 6245794.369849204, 288956.1318562686 6245796.288771805, 288927.92447969056 6245796.904283273, 288890.73506666516 6245804.46913894, 288874.5718785029 6245822.027156844, 288871.5174584371 6245826.269657385)'), 
    loads('LINESTRING (289117.49220031087 6246150.097157965, 289123.1027982971 6246150.125861503)'), 
    loads('LINESTRING (288871.5174584371 6245826.269657385, 288862.6574454198 6245838.998725201, 288855.6496765063 6245845.349997484, 288854.4443056346 6245873.478527978, 288855.5702275269 6245890.517285387, 288858.3610112035 6245908.172964517, 288862.9947508299 6245921.2757384125, 288870.6814080267 6245930.440132022, 288899.0859924957 6245950.660907352, 288916.7720422614 6245961.549588758, 288945.21876464185 6245973.558091324, 288982.97969285556 6245972.991539433, 289029.0960271622 6245969.426030927, 289076.7611886468 6245959.480794487, 289116.97759501816 6245953.147152052)'), 
    loads('LINESTRING (289247.2416190762 6245652.849019694, 289242.176916192 6245664.837198053, 289240.9222256149 6245673.042918888, 289247.96212401765 6245720.070570544, 289251.92581130605 6245745.79187687, 289252.65234657034 6245752.030769008, 289255.4215183566 6245774.096196989, 289262.89565358177 6245825.2327190405)'), 
    loads('LINESTRING (289268.1069432752 6245874.076792822, 289262.89565358177 6245825.2327190405)'), 
    loads('LINESTRING (289281.22981562244 6246097.247652293, 289279.71381280647 6246157.009012389)'), 
    loads('LINESTRING (289046.5672242329 6246082.056609921, 289046.67580903426 6246150.038725288)'), 
    loads('LINESTRING (289046.67580903426 6246150.038725288, 289046.8063086348 6246183.954326287)'), 
    loads('LINESTRING (288794.3255652259 6246005.631500229, 288797.54885925277 6245998.044005317, 288803.48002980667 6245965.072827671, 288804.79670522606 6245944.852800458, 288806.6204627779 6245914.446026234, 288811.8948572049 6245832.045900767)'), 
    loads('LINESTRING (288812.3949242171 6245823.227888869, 288811.8948572049 6245832.045900767)'), 
    loads('LINESTRING (288528.03469168476 6246390.552302153, 288527.3748283904 6246400.890924609, 288529.65454476385 6246429.343421622, 288534.5380675324 6246452.790538311, 288544.29692408454 6246471.852361825)'), 
    loads('LINESTRING (289157.47742033965 6245562.818281107, 289113.10389721516 6245611.711553035, 289109.28842721233 6245616.558442521, 289106.5304853155 6245622.171122725, 289106.50185827084 6245627.797773398, 289114.63335346157 6245668.747826266, 289114.8925193625 6245677.417508431, 289109.665935011 6245691.381813501, 289103.10793501505 6245698.800015944, 289095.65639497136 6245703.02002969, 289087.0018691112 6245705.256879316, 289077.2928956313 6245706.119628325, 288966.45282064116 6245705.24717713)'), 
    loads('LINESTRING (288338.0402547805 6246181.966649622, 288359.7863061838 6246228.7701001, 288380.9897174477 6246263.251896732, 288400.7122592496 6246290.882156507, 288423.7796592557 6246316.856873009, 288445.2089804353 6246337.043756965, 288463.7807609751 6246352.653156159, 288512.90029759257 6246384.69446789, 288528.03469168476 6246390.552302153)'), 
    loads('LINESTRING (288528.03469168476 6246390.552302153, 288534.70771748514 6246390.434800642, 288541.2361529507 6246388.947745937, 288546.2536521152 6246386.388236928, 288552.6633405316 6246378.512836939, 288554.35724756925 6246373.502691074, 288553.39352902415 6246295.628737056, 288552.21957339114 6246288.018301023, 288548.6099795685 6246282.220295045, 288542.8774318248 6246276.411290807, 288506.3209322899 6246248.998286053, 288496.5177005692 6246238.605575045)'), 
    loads('LINESTRING (288996.64620175684 6246207.118295554, 288968.7407909836 6246207.735522729, 288964.7911974007 6246209.084018154, 288963.2546276696 6246213.030356927, 288963.86844568595 6246241.321492513)'), 
    loads('LINESTRING (289215.75580483914 6246150.14309645, 289231.5261353874 6246150.223590716)'), 
    loads('LINESTRING (289123.1027982971 6246150.125861503, 289123.60481128754 6246081.234372439)'), 
    loads('LINESTRING (289157.47742033965 6245562.818281107, 289147.5155996624 6245553.794960846, 289133.4637264783 6245543.990349851, 289113.64695708506 6245534.764527777, 289106.378135957 6245532.902443875)'), 
    loads('LINESTRING (289281.56488520413 6246061.053518009, 289282.2039940289 6246024.7089988245, 289281.8022664537 6246014.213269036)'), 
    loads('LINESTRING (289280.5600942866 6245990.025890948, 289280.4177080749 6245988.200183183, 289276.49853513355 6245953.657699546, 289268.1069432752 6245874.076792822)'), 
    loads('LINESTRING (289281.8022664537 6246014.213269036, 289280.5600942866 6245990.025890948)'), 
    loads('LINESTRING (289281.31459591363 6246080.518895285, 289236.58411442 6246079.834513841, 289230.51865104854 6246079.803561612)'), 
    loads('LINESTRING (289231.5261353874 6246150.223590716, 289230.51865104854 6246079.803561612)'), 
    loads('LINESTRING (289230.51865104854 6246079.803561612, 289123.60481128754 6246081.234372439)'), 
    loads('LINESTRING (288990.0315496325 6246136.364841866, 288994.06991352054 6246147.335642993, 288995.6425220118 6246166.050132187, 288996.64620175684 6246207.118295554)'), 
    loads('LINESTRING (288941.23928445077 6245565.055907173, 288922.2539696308 6245571.193431001)'), 
    loads('LINESTRING (289106.378135957 6245532.902443875, 289088.05446948705 6245528.246433178, 289075.017637285 6245527.571383963)'), 
    loads('LINESTRING (289004.2319182942 6246087.46665533, 288992.5159585138 6246065.50655162, 288991.6709312235 6246023.071115257, 288939.0495010435 6246023.5613885755)'), 
    loads('LINESTRING (288922.2539696308 6245571.193431001, 288895.36065670813 6245581.852506931, 288880.4505698958 6245591.660704889, 288857.90613038896 6245611.770727088, 288842.6522246948 6245629.485057903, 288833.89884912386 6245651.034770037, 288824.0334161916 6245682.46377338, 288822.1468987958 6245695.532656157, 288819.7914694871 6245711.336530289, 288819.13589251053 6245720.914016689)'), 
    loads('LINESTRING (288990.0315496325 6246136.364841866, 288985.7740611738 6246138.624262417, 288973.78227629326 6246140.996071781, 288892.1911371919 6246142.554009997, 288860.6559559815 6246141.327208701, 288847.78310174454 6246138.067187622, 288842.03644101036 6246134.995919551, 288826.6441596345 6246120.316583929, 288771.74987940904 6246061.177378261, 288764.82061175193 6246052.168751328)'), 
    loads('LINESTRING (288996.64620175684 6246207.118295554, 288998.1478607585 6246269.48131031, 288996.71251774597 6246283.313843878, 288992.6977336541 6246297.437339611)'), 
    loads('LINESTRING (289123.60481128754 6246081.234372439, 289060.06365684717 6246081.973676705, 289046.5672242329 6246082.056609921)'), 
    loads('LINESTRING (288992.6977336541 6246297.437339611, 288989.1479436012 6246309.586106175, 288980.25347317685 6246329.007666835, 288971.3845748167 6246343.410489353, 288958.56443306286 6246359.466010159, 288933.8657077225 6246385.34628354, 288929.15548955987 6246387.147148858, 288923.6963831998 6246387.119099585, 288912.19025417743 6246383.409841501, 288907.6565448705 6246380.344766553, 288904.66879101534 6246371.508275759, 288904.692885802 6246366.793659929, 288906.08175325784 6246362.086062179, 288947.6046555468 6246308.156153993, 288954.34515922243 6246294.807093585, 288958.4526435785 6246292.242703794, 288963.6099633236 6246291.965007999, 288977.7039671026 6246293.71031054, 288992.6977336541 6246297.437339611)'), 
    loads('LINESTRING (289004.2319182942 6246087.46665533, 289001.64323672093 6246089.582546889, 288998.4324946449 6246094.736919879, 288995.79727022507 6246105.977599391, 288994.47247634555 6246127.870905237, 288993.0844686932 6246132.426312351, 288990.0315496325 6246136.364841866)'), 
    loads('LINESTRING (289046.5672242329 6246082.056609921, 289013.2032947197 6246082.645994776, 289004.2319182942 6246087.46665533)'), 
    loads('LINESTRING (288230.12386792776 6246230.223747577, 288239.79327734397 6246237.118067686, 288242.95640689944 6246241.240894919, 288247.8855887316 6246255.714809249, 288248.598049897 6246264.539545897, 288247.03985803993 6246272.5920148315, 288241.67331358604 6246283.970539342)'), 
    loads('LINESTRING (288243.59192430787 6246206.416528559, 288234.56872927636 6246221.121778986, 288230.12386792776 6246230.223747577)'), 
    loads('LINESTRING (288338.0402547805 6246181.966649622, 288294.79656754056 6246186.912349576)'), 
    loads('LINESTRING (288294.79656754056 6246186.912349576, 288307.01906204026 6246227.887063783, 288312.0613951766 6246249.813738766, 288317.9702871961 6246280.109753266)'), 
]

fig = plt.figure(1, (6, 12))

sub1 = fig.add_subplot(211)
sub1.set_aspect('equal')
sub1.set_title('a) convex_hull = True', pad=10, family='sans-serif')
sub1.axes.get_xaxis().set_visible(False)
sub1.axes.get_yaxis().set_visible(False)

sub2 = fig.add_subplot(212)
sub2.set_aspect('equal')
sub2.set_title('b) convex_hull = False', pad=10, family='sans-serif')
sub2.axes.get_xaxis().set_visible(False)
sub2.axes.get_yaxis().set_visible(False)

faces1 = list(c4.network_faces(lines, convex_hull=True))
faces2 = list(c4.network_faces(lines, convex_hull=False))

for face in faces1:
    poly = Path.make_compound_path(Path(numpy.asarray(face.exterior.coords)[:, :2]),*[Path(numpy.asarray(ring.coords)[:, :2]) for ring in face.interiors])
    sub1.add_patch(PathPatch(poly, facecolor="red", edgecolor='none'))

for face in faces2:
    poly = Path.make_compound_path(Path(numpy.asarray(face.exterior.coords)[:, :2]),*[Path(numpy.asarray(ring.coords)[:, :2]) for ring in face.interiors])
    sub2.add_patch(PathPatch(poly, facecolor="red", edgecolor='none'))

for line in lines:
    path = Path(numpy.asarray(line.coords)[:, :2])
    sub1.add_patch(PathPatch(path, facecolor="none", edgecolor='black', linewidth=1))
    sub2.add_patch(PathPatch(path, facecolor="none", edgecolor='black', linewidth=1))

sub1.autoscale_view()
sub2.autoscale_view()

plt.show()