diff --git a/alembic/versions/20230808-190813_add_title_photo_url_for_user_b1bd8ecc3251.py b/alembic/versions/20230808-190813_add_title_photo_url_for_user_b1bd8ecc3251.py new file mode 100644 index 0000000..e292cb1 --- /dev/null +++ b/alembic/versions/20230808-190813_add_title_photo_url_for_user_b1bd8ecc3251.py @@ -0,0 +1,28 @@ +"""add title photo url for user + +Revision ID: b1bd8ecc3251 +Revises: b5c66e5a2df7 +Create Date: 2023-08-08 19:08:13.021213 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b1bd8ecc3251' +down_revision = 'b5c66e5a2df7' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('user', sa.Column('title_image_url', sa.String(length=128), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('user', 'title_image_url') + # ### end Alembic commands ### diff --git a/alembic/versions/20230808-194521_rename_images_in_user_table_3d51075b5ece.py b/alembic/versions/20230808-194521_rename_images_in_user_table_3d51075b5ece.py new file mode 100644 index 0000000..b86d729 --- /dev/null +++ b/alembic/versions/20230808-194521_rename_images_in_user_table_3d51075b5ece.py @@ -0,0 +1,34 @@ +"""rename images in user table + +Revision ID: 3d51075b5ece +Revises: b1bd8ecc3251 +Create Date: 2023-08-08 19:45:21.470315 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '3d51075b5ece' +down_revision = 'b1bd8ecc3251' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('user', sa.Column('avatar_image_filename', sa.String(length=128), nullable=True)) + op.add_column('user', sa.Column('title_image_filename', sa.String(length=128), nullable=True)) + op.drop_column('user', 'title_image_url') + op.drop_column('user', 'avatar_image_url') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('user', sa.Column('avatar_image_url', mysql.VARCHAR(length=128), nullable=True)) + op.add_column('user', sa.Column('title_image_url', mysql.VARCHAR(length=128), nullable=True)) + op.drop_column('user', 'title_image_filename') + op.drop_column('user', 'avatar_image_filename') + # ### end Alembic commands ### diff --git a/alembic/versions/20230808-202432_add_public_info_to_user_707eb800ddcd.py b/alembic/versions/20230808-202432_add_public_info_to_user_707eb800ddcd.py new file mode 100644 index 0000000..c675879 --- /dev/null +++ b/alembic/versions/20230808-202432_add_public_info_to_user_707eb800ddcd.py @@ -0,0 +1,32 @@ +"""add public info to user + +Revision ID: 707eb800ddcd +Revises: 3d51075b5ece +Create Date: 2023-08-08 20:24:32.728653 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '707eb800ddcd' +down_revision = '3d51075b5ece' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('user', sa.Column('description', sa.Text(), nullable=False)) + op.add_column('user', sa.Column('public_username', sa.String(length=128), nullable=True)) + op.create_unique_constraint(None, 'user', ['public_username']) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'user', type_='unique') + op.drop_column('user', 'public_username') + op.drop_column('user', 'description') + # ### end Alembic commands ### diff --git a/alembic/versions/20230808-220834_add_is_public_to_flight_300b721e0818.py b/alembic/versions/20230808-220834_add_is_public_to_flight_300b721e0818.py new file mode 100644 index 0000000..a6b8210 --- /dev/null +++ b/alembic/versions/20230808-220834_add_is_public_to_flight_300b721e0818.py @@ -0,0 +1,28 @@ +"""add is_public to flight + +Revision ID: 300b721e0818 +Revises: 707eb800ddcd +Create Date: 2023-08-08 22:08:34.559165 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '300b721e0818' +down_revision = '707eb800ddcd' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('flight', sa.Column('is_public', sa.Boolean(), server_default='0', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('flight', 'is_public') + # ### end Alembic commands ### diff --git a/db/csvToDb.py b/db/csvToDb.py new file mode 100644 index 0000000..9b95670 --- /dev/null +++ b/db/csvToDb.py @@ -0,0 +1,30 @@ +import csv + + +def deg_to_dec(val: str): + + val = val[:-1].lstrip("0") + # h_m, s = val.split(".") + # h_m = h_m.strip("0") + # h = int(h_m[0:2]) + # m = int(h_m[2:4]) + # print(f"----{val}---------------------------------") + # print(val) + # print("h_m", h_m) + # print("m", m) + # print(h, m, int(s)) + # print("--konec-----------------------------------") + # return h + (m / 60.0) + (int(s) / 3600.0) + + return len(val or "") + +# ZDAKOV: @49.504378,14.1808905 + +with open("./poi.csv") as f: + reader = csv.DictReader(f) + + for row in reader: + # if row['name'] != 'ZDAKOV': + # continue + + print(row['name'], row['lat'], row['lon'], deg_to_dec(row['lat']), deg_to_dec(row['lon'])) \ No newline at end of file diff --git a/db/poi.csv b/db/poi.csv new file mode 100644 index 0000000..14d03f8 --- /dev/null +++ b/db/poi.csv @@ -0,0 +1,547 @@ +name,code,country,lat,lon,elev,style,rwdir,rwlen,freq,desc +"9 KRIZU",9KRIZU,CZ,4916.317N,01616.550E,0.0m,1,,,,"MOTOREST" +"9 SKAL",9SKAL,CZ,4940.233N,01601.850E,836.0m,7,,,,"VRCHOL" +"ADAMOV",ADAMOV,CZ,4918.067N,01639.267E,0.0m,1,,,,"KOSTEL" +"ALBRECHTICE",ALBRE,CZ,5010.133N,01734.667E,0.0m,1,,,,"NADRAZI" +"AS",AS,CZ,5013.133N,01210.983E,600.0m,1,,,,"NADRAZI" +"BASKA",BASKA,CZ,4938.567N,01821.133E,336.0m,2,1,300.0m,"125,825","SLZ PLOCHA" +"BECOV",BECOV,CZ,5005.233N,01250.383E,609.0m,1,,,,"ZAMEK" +"BECHYNE",BECHYN,CZ,4916.417N,01430.167E,0.0m,3,0,0.0m,,"STREDPLOCHY" +"BENATKY NAD JIZEROU",BENATK,CZ,5017.333N,01449.533E,0.0m,1,,,,"MOST" +"BEZDEKOV",BEZDEKOV,CZ,4917.633N,01610.983E,0.0m,1,,,,"KOSTEL" +"BEZDEZ",BEZDEZ,CZ,5032.317N,01443.217E,0.0m,1,,,,"ZRICENINA" +"BEZVEROV",BEZVER,CZ,4959.667N,01303.383E,0.0m,1,,,,"KOSTEL" +"BILA VODA",BVODA,CZ,5026.567N,01654.750E,0.0m,1,,,,"KOSTEL" +"BILINA",BILINA,CZ,5032.950N,01346.350E,0.0m,1,,,,"MOST" +"BILOVEC",BILOVE,CZ,4945.200N,01800.833E,0.0m,1,,,,"NADRAZI" +"BITOV",BITOV,CZ,4856.633N,01541.983E,428.0m,1,,,,"ZAMEK" +"BLANIK",BLANIK,CZ,4938.617N,01452.333E,0.0m,1,,,,"ROZHLEDNA" +"BLANSKO",BLANSK,CZ,4921.633N,01638.450E,0.0m,1,,,,"MOST" +"BLATNA",BLATNA,CZ,4925.600N,01352.633E,500.0m,1,,,,"KOSTEL" +"BLOVICE",BLOVIC,CZ,4934.883N,01331.883E,478.0m,1,,,,"NADRAZI" +"BOHDALOV",BOHDAL,CZ,4928.850N,01552.400E,0.0m,1,,,,"KOSTEL" +"BOHDANEC",BOHDAN,CZ,4946.633N,01513.433E,450.0m,1,,,,"KOSTEL" +"BOJKOVICE",BOJKOV,CZ,4902.233N,01748.283E,0.0m,1,,,,"CENTRUM" +"BOLERADICE",BOLERA,CZ,4857.750N,01650.233E,198.0m,2,7,480.0m,"125,825","SLZ PLOCHA" +"BOREK",BOREK,CZ,5012.583N,01439.567E,170.0m,2,17,550.0m,"118,750","SLZ PLOCHA" +"BORITOV",BORITO,CZ,4925.883N,01635.517E,380.0m,2,2,850.0m,"125,825","SLZ PLOCHA" +"BOROVA",BOROVA,CZ,4944.600N,01609.750E,650.0m,1,,,,"NADRAZI" +"BOSKOVICE",BOSKOV,CZ,4929.500N,01639.067E,365.0m,1,,,,"NADRAZI" +"BOUBIN",BOUBIN,CZ,4859.450N,01349.033E,1362.0m,1,,,,"VRCHOL" +"BOUZOV",BOUZOV,CZ,4942.333N,01653.417E,440.0m,1,,,,"HRAD" +"BRANDYS NAD LABEM",BRANDY,CZ,5011.200N,01439.683E,0.0m,1,,,,"CENTRUM" +"BRANDYS NAD ORLICI",BRANOR,CZ,5000.100N,01617.200E,0.0m,1,,,,"KOSTEL" +"BRANNA",BRANNA,CZ,5008.817N,01700.867E,633.0m,1,,,,"NADRAZI" +"BRATROUCHOV",BRATRO,CZ,5042.400N,01528.967E,0.0m,1,,,,"CHATA" +"BRECLAV",BRECLA,CZ,4845.333N,01653.767E,0.0m,1,,,,"NADRAZI" +"BREZI",BREZI,CZ,4920.667N,01613.033E,530.0m,1,,,,"KOSTEL" +"BREZNICE",BREZNI,CZ,4932.667N,01356.667E,470.0m,1,,,,"KOSTEL" +"BREZOVA N SVITAVOU",BREZSV,CZ,4938.783N,01630.967E,0.0m,1,,,,"KOSTEL" +"BRIDLICNA",BRIDLC,CZ,5002.100N,01711.083E,1358.0m,7,,,,"VRCHOL" +"BRUNTAL",BRUNTA,CZ,4959.617N,01728.467E,431.0m,1,,,,"NADRAZI" +"BUCOV",BUCOV,CZ,5008.617N,01329.400E,432.0m,1,,,,"KRIZOVATKA" +"BUDISOV N BUDISOVKOU",BUDISO,CZ,4947.683N,01737.667E,0.0m,1,,,,"KOSTEL" +"BUCHLOV",BUCHLO,CZ,4906.417N,01718.800E,192.0m,1,,,,"HRAD" +"BUCHTUV KOPEC",BUCHTU,CZ,4939.617N,01608.100E,810.0m,7,,,,"VRCHOL" +"BUKOVA HORA",BUKHOR,CZ,5040.300N,01413.550E,0.0m,1,,,,"VYSILAC" +"BURANOS AIRES",BURAIR,CZ,5000.517N,01402.117E,440.0m,2,9,450.0m,"125,825","SLZ PLOCHA" +"BYNOVEC",BYNOVE,CZ,5049.550N,01416.033E,380.0m,2,7,400.0m,"122,8","SLZ PLOCHA" +"BYSTRICE P PERNSTEJNEM",BYSPER,CZ,4931.350N,01515.683E,532.0m,1,,,,"KOSTEL" +"CASLAV",CASLAV,CZ,4956.400N,01523.017E,241.0m,5,60,0.0m,,"LETISTE" +"CEBIN",CEBIN,CZ,4918.750N,01628.650E,0.0m,1,,,,"KOSTEL" +"CECHTICE",CECHTI,CZ,4937.350N,01502.883E,0.0m,1,,,,"KOSTEL" +"CERNA HORA",CERHOR,CZ,5039.100N,01544.500E,1300.0m,8,,,,"VYSILAC" +"CERVENA",CERVEN,CZ,4922.317N,01415.950E,0.0m,1,,,,"CERVENANVLT" +"CERVENA LHOTA",CERVLH,CZ,4914.800N,01453.167E,0.0m,1,,,,"ZAMEK" +"CERVENA VODA",CERVOD,CZ,5002.433N,01644.650E,0.0m,1,,,,"KOSTEL" +"CERVENY KOSTELEC",CERKOS,CZ,5028.650N,01605.767E,0.0m,1,,,,"NAMESTI" +"CESKA SKALICE",CESKAL,CZ,5023.717N,01603.267E,0.0m,1,,,,"NADRAZI" +"CESKA TREBOVA",CETREB,CZ,4954.217N,01626.667E,0.0m,1,,,,"CENTRUM" +"CESKE BUDEJOVICE",LKCBUD,CZ,4856.800N,01425.750E,433.0m,5,60,0.0m,"122.600","LETISTE" +"CESKY BROD",CEBROD,CZ,5003.850N,01453.417E,0.0m,1,,,,"VYSILAC" +"CESKY DUB",CESDUB,CZ,5040.733N,01459.950E,380.0m,2,1,370.0m,"125,825","SLZ PLOCHA" +"CESKY KRUMLOV",CEKRUM,CZ,4849.000N,01419.067E,0.0m,1,,,,"CENTRUM" +"CESTIN",CESTIN,CZ,4948.450N,01506.133E,500.0m,1,,,,"KOSTEL" +"CIMELICE",CIMELI,CZ,4928.217N,01404.617E,0.0m,1,,,,"NADRAZI" +"CL RAMS",CLRAMS,CZ,5038.500N,01432.483E,300.0m,2,13,600.0m,"120,675","SLZ PLOCHA" +"CUKRAK",CUKRAK,CZ,4956.233N,01421.383E,0.0m,1,,,,"VYSILAC" +"DACICE",DACICE,CZ,4904.800N,01526.033E,577.0m,1,,,,"KOSTEL" +"DARKO",DARKO,CZ,4937.933N,01554.167E,590.0m,1,,,,"RYBNIK" +"DEBLIN",DEBLIN,CZ,4919.367N,01620.817E,0.0m,1,,,,"KOSTEL" +"DECIN",DECIN,CZ,5046.400N,01412.467E,0.0m,1,,,,"MOST" +"DECINSKY SNEZNIK",DESNEZ,CZ,5047.567N,01406.117E,722.0m,7,,,,"VRCHOL" +"DESTNE V ORL HORACH",DESTNE,CZ,5018.200N,01620.900E,0.0m,1,,,,"KOSTEL" +"DETRICHOV",DETRIC,CZ,4943.767N,01707.100E,225.0m,2,14,450.0m,"120,675","SLZ PLOCHA" +"DEVIN",DEVIN,CZ,4852.083N,01638.967E,549.0m,7,,,,"VRCHOL" +"DOBRIS",DOBRIS,CZ,4946.833N,01410.067E,0.0m,1,,,,"CENTRUM" +"DOBRUSKA",DOBRUS,CZ,5017.367N,01609.133E,0.0m,1,,,,"NADRAZI" +"DOLNI BUKOVSKO",DOLBUK,CZ,4910.250N,01434.850E,0.0m,1,,,,"KOSTEL" +"DOLNI CEREKEV",DOLCER,CZ,4920.733N,01527.400E,0.0m,1,,,,"KOSTEL" +"DOLNI DVORISTE",DOLDVO,CZ,4839.400N,01427.067E,617.0m,1,,,,"KOSTEL" +"DOLNI LOUCKY",DOLLOU,CZ,4921.700N,01621.033E,0.0m,1,,,,"KOSTEL" +"DOLNI ZANDOV",DOLZAN,CZ,5000.683N,01232.400E,0.0m,1,,,,"NADRAZI" +"DOMAZLICE",DOMAZL,CZ,4926.450N,01255.500E,423.0m,1,,,,"CENTRUM" +"DRUZCOV",DRUZCO,CZ,5043.700N,01455.467E,460.0m,2,17,440.0m,"125,825","SLZ PLOCHA" +"DUSNIKY",DUSNIK,CZ,5024.750N,01411.867E,222.0m,2,17,420.0m,"122,8","SLZ PLOCHA" +"EXIT BOR",EXIBOR,CZ,4944.833N,01246.683E,400.0m,1,,,,"EXIT D1 128" +"FIALNIK",FIALNI,CZ,4944.517N,01510.717E,550.0m,7,,,,"VRCHOL" +"FRYDEK MISTEL",FRYDEK,CZ,4940.783N,01820.817E,0.0m,1,,,,"MOST" +"FRYDLANT",FRYDLA,CZ,5055.117N,01504.400E,500.0m,1,,,,"NADRAZI" +"FRYMBURK",FRYMBU,CZ,4841.967N,01411.967E,798.0m,2,6,500.0m,"134,825","SLZ PLOCHA" +"FRYSAVA P ZAK HOROU",FRYSAV,CZ,4937.667N,01602.300E,0.0m,1,,,,"KOSTEL" +"GOLCUV JENIKOV",GOLJEN,CZ,4948.883N,01528.650E,389.0m,1,,,,"CENTRUM" +"HABRY",HABRY,CZ,4945.167N,01528.983E,500.0m,1,,,,"KRIZOVATKA" +"HANUSOVICE",HANUSO,CZ,5004.583N,01655.867E,0.0m,1,,,,"KOSTEL" +"HARRACHOV",HARRAC,CZ,5048.267N,01525.450E,850.0m,1,,,,"CELNICE" +"HERALEC",HERALE,CZ,4941.250N,01559.717E,0.0m,1,,,,"KOSTEL" +"HERMANUV MESTEC",HERMES,CZ,4957.083N,01539.517E,300.0m,1,,,,"NADRAZI" +"HLINSKO",HLINSK,CZ,4946.000N,01554.100E,495.0m,1,,,,"NADRAZI" +"HLUBOKA",HLUBOK,CZ,4903.267N,01426.450E,0.0m,1,,,,"ZAMEK" +"HODONIN",HODONI,CZ,4851.283N,01707.083E,0.0m,1,,,,"NADRAZI" +"HORAZDOVICE",HORAZD,CZ,4919.267N,01342.567E,0.0m,1,,,,"NADRAZI" +"HORNI BENESOV",HORBEN,CZ,4958.050N,01736.033E,0.0m,1,,,,"KOSTEL" +"HORNI BRIZA",HORBRI,CZ,4950.383N,01321.383E,451.0m,1,,,,"KOSTEL" +"HORNI CEREKEV",HORCER,CZ,4918.650N,01519.483E,586.0m,1,,,,"NADRAZI" +"HORSOVSKY TYN",HORTYN,CZ,4931.450N,01256.350E,400.0m,1,,,,"NADRAZI" +"HORY",HORY,CZ,5013.033N,01246.500E,501.0m,2,7,500.0m,"125,825","SLZ PLOCHA" +"HOSTINNE",HOSTIN,CZ,5032.517N,01543.483E,390.0m,17,,,,"STRED MESTA" +"HOSTOMICE",HOSTOM,CZ,4949.567N,01402.650E,0.0m,1,,,,"KOSTEL" +"HOSTYN",HOSTYN,CZ,4922.817N,01742.083E,735.0m,7,,,,"VRCHOL" +"HRADCANY",HRADCA,CZ,5037.167N,01443.983E,278.0m,5,9,2700.0m,"134,825","SLZ PLOCHA" +"HRADEC N MORAVICI",HRAMOR,CZ,4952.483N,01752.567E,300.0m,1,,,,"NARDAZI" +"HRACHOLUSKY",HRACHO,CZ,4947.467N,01310.467E,0.0m,1,,,,"HRAZ" +"HRIMEZDICE",HRIMEZ,CZ,4940.450N,01415.767E,462.0m,1,,,,"MOST" +"HUBENOV",HUBENO,CZ,4923.517N,01529.367E,0.0m,1,,,,"HRAZ" +"HUMPOLEC",HUMPOL,CZ,4932.517N,01521.417E,474.0m,1,,,,"CENTRUM" +"HUSINEC",HUSINE,CZ,4902.300N,01359.617E,0.0m,1,,,,"HRAZ" +"HUSTOPECE",HUSTOP,CZ,4856.133N,01644.317E,0.0m,1,,,,"NADRAZI" +"CHABERICE",CHABER,CZ,4944.883N,01503.700E,350.0m,2,11,500.0m,"125,825","SLZ PLOCHA" +"CHARVATCE",CHARVA,CZ,5025.983N,01348.633E,275.0m,2,8,500.0m,"125,825","SLZ PLOCHA" +"CHEB",CHEB,CZ,5011.550N,01222.250E,450.0m,1,,,,"KRIZOVATKASEVER" +"CHLUM",CHLUM,CZ,4918.867N,01545.933E,0.0m,1,,,,"KOSTEL" +"CHLUMEC N CIDLINOU",CHLUME,CZ,5009.800N,01527.433E,0.0m,1,,,,"NADRAZI" +"CHOMUTOV",CHOMU,CZ,5027.800N,01324.217E,343.0m,1,,,,"KRIZOVATKACENTR" +"CHORNICE",CHORNI,CZ,4940.000N,01644.467E,0.0m,1,,,,"KOSTEL" +"CHOTEC",CHOTEC,CZ,5026.083N,01531.733E,328.0m,2,9,600.0m,"125,825","SLZ PLOCHA" +"CHOTESOV",CHOTES,CZ,4939.133N,01311.417E,365.0m,2,9,550.0m,"125,825","SLZ PLOCHA" +"CHRAST",CHRAST,CZ,4953.333N,01556.500E,0.0m,1,,,,"RYBNIK" +"CHRASTAVA",CHRSTA,CZ,5048.800N,01457.083E,300.0m,1,,,,"NADRAZI" +"CHRIBSKA",CHRIBS,CZ,5051.400N,01428.033E,383.0m,2,10,600.0m,"122.4","SLZ PLOCHA" +"CHVALETICE",CHVALE,CZ,5001.667N,01527.333E,0.0m,1,,,,"KOMIN" +"JABLONEC N NISOU",JABLON,CZ,5043.267N,01509.650E,0.0m,1,,,,"NADRAZI" +"JABLONNE N ORLICI",JABORL,CZ,5001.667N,01635.967E,0.0m,1,,,,"KOSTEL" +"JABLONNE V PODJESTEDI",JABPOD,CZ,5046.200N,01445.517E,600.0m,1,,,,"NADRAZI" +"JABLUKOV",JABLUN,CZ,4934.600N,01845.900E,0.0m,1,,,,"KOSTEL" +"JAROMERICE N ROKYTKOU",JAROME,CZ,4905.600N,01553.400E,422.0m,1,,,,"KOSTEL" +"JAVORICE",JAVORI,CZ,4913.267N,01520.200E,836.0m,1,,,,"VYSILAC" +"JAVORNIK",JAVORN,CZ,5023.267N,01700.017E,0.0m,1,,,,"JAVORNIKZAMEK" +"JAVOROVY",JAVORO,CZ,4937.250N,01836.467E,1032.0m,7,,,,"VRCHOL" +"JEDOVNICE",JEDOVN,CZ,4920.400N,01645.267E,470.0m,1,,,,"HRAZ" +"JEHNEDI",JEHNED,CZ,4957.983N,01618.600E,478.0m,2,9,750.0m,"125,825","SLZ PLOCHA" +"JEMNICE",JEMNIC,CZ,4900.950N,01534.850E,498.0m,1,,,,"NADRAZI" +"JESENICE",JESENI,CZ,5005.067N,01228.483E,0.0m,1,,,,"HRAZ" +"JESENIK",JESNIK,CZ,5013.667N,01711.583E,0.0m,1,,,,"NADRAZI" +"JESTED",JESTED,CZ,5043.950N,01459.117E,1014.0m,1,,,,"VYSILAC" +"JEVICKO",JEVICK,CZ,4937.933N,01642.717E,360.0m,1,,,,"NAMESTI" +"JIMRAMOV",JIMRAM,CZ,4938.217N,01613.483E,550.0m,1,,,,"KOSTEL" +"JINDRICHOVICE P SMRKEM",JINSMR,CZ,5057.483N,01515.233E,800.0m,1,,,,"NADRAZI" +"JIRICKY",JIRICK,CZ,4933.183N,01509.333E,450.0m,2,16,750.0m,"125,825","SLZ PLOCHA" +"JIRKOV",JIRKOV,CZ,5029.917N,01326.867E,0.0m,1,,,,"KOSTEL" +"JISTEBNICE",JISTEB,CZ,4929.200N,01431.550E,578.0m,1,,,,"KOSTEL" +"KACOV",KACOV,CZ,4946.550N,01501.867E,0.0m,1,,,,"NADRAZI" +"KADAN",KADAN,CZ,5022.383N,01316.483E,485.0m,1,,,,"SILNICNIMOST" +"KAMEN",KAMEN,CZ,4925.400N,01500.883E,585.0m,1,,,,"HRAD" +"KAMEN PLOCHA",KAMPLO,CZ,4925.100N,01500.000E,0.0m,3,90,0.0m,,"LETISTE" +"KAMENICE N LIPOU",KAMLIP,CZ,4918.167N,01504.517E,563.0m,1,,,,"KOSTEL" +"KAMYK",KAMYK,CZ,4938.383N,01415.333E,0.0m,1,,,,"HRAZ" +"KAPLICE",KAPLIC,CZ,4844.300N,01429.283E,0.0m,1,,,,"CENTRUM" +"KARDASOVA RECICE",KARDRE,CZ,4911.033N,01451.650E,0.0m,1,,,,"NADRAZI" +"KARLSTEJN",KARLST,CZ,4956.400N,01411.283E,0.0m,1,,,,"HRAD" +"KASARNA",KASARN,CZ,4910.900N,01538.017E,533.0m,1,,,,"KRIZOVATKA" +"KASPERSKE HORY",KASHOR,CZ,4909.900N,01333.833E,1010.0m,1,,,,"ZAMEK" +"KDYNE",KDYNE,CZ,4923.317N,01302.383E,400.0m,1,,,,"KOSTEL" +"KELCSKY JAVORNIK",KELJAV,CZ,4924.000N,01745.933E,865.0m,7,,,,"VRCHOL" +"KEPRNIK",KEPRNI,CZ,5010.267N,01706.983E,1423.0m,7,,,,"VRCHOL" +"KLASTEREC N OHRI",KLASOH,CZ,5023.083N,01311.783E,300.0m,1,,,,"NADRAZI" +"KLECANY",KLECAN,CZ,5011.017N,01424.967E,0.0m,5,0,0.0m,,"PLOCHA" +"KLINOVEC",KLINOV,CZ,5023.750N,01258.050E,1244.0m,7,,,,"VRCHOL" +"KOBEROVICE",KOBERO,CZ,4935.200N,01515.717E,0.0m,1,,,,"KOSTEL" +"KOCLIROV",KOCLIR,CZ,4946.183N,01631.283E,600.0m,1,,,,"KRIZOVATKA" +"KOJAL",KOJAL,CZ,4922.217N,01648.950E,0.0m,1,,,,"VYSILAC" +"KOKORIN",KOKORI,CZ,5026.400N,01434.617E,0.0m,1,,,,"HRAD" +"KONICE",KONICE,CZ,4935.500N,01652.983E,328.0m,1,,,,"NADRAZI" +"KORYCANY",KORYCA,CZ,4906.983N,01711.650E,0.0m,1,,,,"HRAZ" +"KOSTELEC N HANE",KOSHAN,CZ,4930.950N,01703.667E,0.0m,1,,,,"KOSTEL" +"KOTVRDOVICE",KOTVRD,CZ,4921.867N,01647.233E,556.0m,2,10,600.0m,"123,475","SLZ PLOCHA" +"KOURIM",KOURIM,CZ,5000.183N,01458.617E,0.0m,1,,,,"OBEC" +"KOZAKOV",KOZAKO,CZ,5035.583N,01515.767E,774.0m,7,,,,"ROZHLEDNA" +"KRALICKY SNEZNIK",KRASNE,CZ,5012.300N,01651.350E,1424.0m,7,,,,"VRCHOL" +"KRALIKY",KRALIK,CZ,5004.850N,01645.400E,0.0m,1,,,,"NADRAZI" +"KRALOVICE",KRALOV,CZ,4959.333N,01329.350E,0.0m,1,,,,"NADRAZI" +"KRAMOLIN",KRAMOL,CZ,4854.917N,01443.667E,505.0m,2,9,455.0m,"122,4","SLZ PLOCHA" +"KRASNA LIPA",KRALIP,CZ,5055.100N,01430.750E,500.0m,1,,,,"NADRAZI" +"KREMESNIK",KREMES,CZ,4924.217N,01519.633E,765.0m,7,,,,"VRCHOL" +"KRINEC",KRINEC,CZ,5015.200N,01507.833E,197.0m,2,10,750.0m,"125,825","SLZ PLOCHA" +"KRIVOKLAT",KRIVOK,CZ,5002.283N,01352.367E,0.0m,1,,,,"HRAD" +"KRSY",KRSY,CZ,4955.533N,01303.300E,600.0m,1,,,,"KOSTEL" +"KRUZBERK",KRUZBE,CZ,4949.400N,01739.767E,450.0m,1,,,,"HRAZ" +"KUKS",KUKS,CZ,5023.867N,01553.333E,0.0m,1,,,,"ZAMEK" +"KUNETICE",KUNETI,CZ,5004.133N,01548.917E,219.0m,2,5,730.0m,"121,250","SLZ PLOCHA" +"KURIM",KURIM,CZ,4917.783N,01631.533E,0.0m,1,,,,"KOSTEL" +"KUTNA HORA",KUTHOR,CZ,4957.000N,01516.617E,0.0m,1,,,,"NADRAZI" +"LANSKROUN",LANSKR,CZ,4954.517N,01636.167E,421.0m,1,,,,"NADRAZI" +"LAZNE BELOHRAD",LAZBEL,CZ,5025.717N,01534.967E,0.0m,1,,,,"NAMESTI" +"LAZNE KYNZVART",LAZKYN,CZ,5000.583N,01237.583E,0.0m,1,,,,"KOSTEL" +"LEDEC N SAZAVOU",LEDEC,CZ,4941.767N,01516.617E,0.0m,1,,,,"LEDEC" +"LETOVICE",LETOVI,CZ,4932.867N,01634.467E,372.0m,1,,,,"CENTRUM" +"LHOTA",LHOTAH,CZ,4918.483N,01655.833E,298.0m,1,,,,"HRAZ" +"LIBAVA",LIBAVA,CZ,4943.283N,01731.183E,0.0m,1,,,,"KOSTEL" +"LIBECHOV",LIBECH,CZ,5024.500N,01426.700E,0.0m,1,,,,"ZAMEK" +"LIBINA",LIBINA,CZ,4952.733N,01705.050E,500.0m,1,,,,"KOSTEL" +"LIBKOVICE",LIBKOV,CZ,5034.250N,01341.000E,277.0m,2,3,600.0m,"125,825","SLZ PLOCHA" +"LIBLIN",LIBLIN,CZ,4954.950N,01332.600E,0.0m,1,,,,"KOSTEL" +"LIBOCHOVICE",LIBCHV,CZ,5024.300N,01402.617E,0.0m,1,,,,"KOSTEL" +"LINE",LINE,CZ,4940.517N,01316.467E,363.0m,2,60,0.0m,"129.000","LETISTE" +"LIPNICE",LIPNIC,CZ,4936.650N,01524.550E,600.0m,1,,,,"HRAD" +"LIPNO",LIPNO,CZ,4837.983N,01414.217E,0.0m,1,,,,"HRAZ" +"LIPOVEC",LIPOVE,CZ,4922.950N,01648.300E,0.0m,1,,,,"KOSTEL" +"LIPUVKA",LIPUVK,CZ,4920.400N,01633.150E,364.0m,1,,,,"KRIZOVATKA" +"LITENCICE",LITENC,CZ,4912.217N,01712.350E,0.0m,1,,,,"KOSTEL" +"LITOMERICE",LITOME,CZ,5031.783N,01408.100E,0.0m,1,,,,"MOST" +"LITOMYSL",LITOMY,CZ,4952.500N,01618.250E,368.0m,1,,,,"NADRAZI" +"LITOVEL",LITOVE,CZ,4942.133N,01704.417E,0.0m,1,,,,"KOSTEL" +"LK DACICE",LKDAC,CZ,4904.200N,01527.300E,495.0m,2,14,600.0m,"125,825","SLZ PLOCHA" +"LK CHEB",LKCHEB,CZ,5003.917N,01224.500E,486.0m,5,6,1400.0m,"122,2","SLZ PLOCHA" +"LK LETOVICE",LKLETO,CZ,4932.833N,01635.750E,370.0m,2,16,345.0m,"125,825","SLZ PLOCHA" +"LK LITOMERICE",LKLITO,CZ,5031.617N,01411.100E,150.0m,2,10,450.0m,"125,825","SLZ PLOCHA" +"LK LITOMYSL",LKLITM,CZ,4952.467N,01620.117E,383.0m,2,9,600.0m,"125,825","SLZ PLOCHA" +"LK LOMNICE",LKLOM,CZ,5032.367N,01523.467E,510.0m,2,14,450.0m,"125,825","SLZ PLOCHA" +"LK MELNIK",LKMELN,CZ,5020.583N,01426.083E,162.0m,2,9,700.0m,"120,675","SLZ PLOCHA" +"LK NACHOD",LKNACH,CZ,5024.833N,01607.283E,440.0m,2,11,430.0m,"123,325","SLZ PLOCHA" +"LK OPAVA",LKOPAV,CZ,4956.417N,01759.000E,260.0m,2,10,400.0m,"125,825","SLZ PLOCHA" +"LK PISEK",LKPISE,CZ,4920.500N,01406.750E,412.0m,2,16,600.0m,"120,325","SLZ PLOCHA" +"LK RICANY",LKRICA,CZ,4958.450N,01439.000E,380.0m,2,9,450.0m,"125,825","SLZ PLOCHA" +"LK ROKYCANY",LKROKY,CZ,4945.050N,01335.367E,400.0m,2,9,960.0m,"125,825","SLZ PLOCHA" +"LK STARA PAKA",LKSTPA,CZ,5030.000N,01529.000E,484.0m,2,10,580.0m,"122,2","SLZ PLOCHA" +"LK TEPLICE",LKTEPL,CZ,5037.300N,01348.667E,350.0m,2,18,480.0m,"122,4","SLZ PLOCHA" +"LK TREBIC",LKTREB,CZ,4911.900N,01554.167E,486.0m,2,11,520.0m,"125,825","SLZ PLOCHA" +"LK TRUTNOV",LKTRUT,CZ,5034.033N,01551.867E,454.0m,2,17,450.0m,"125,825","SLZ PLOCHA" +"LK USTI N LABEM",LKUSTI,CZ,5042.050N,01358.300E,239.0m,2,5,650.0m,"123.4","SLZ PLOCHA" +"LKBA",LKBA,CZ,4847.450N,01653.550E,160.0m,2,8,740.0m,"123,5","BRECLAV" +"LKBE",LKBE,CZ,4944.450N,01438.683E,403.0m,2,9,750.0m,"118,0","BENESOV" +"LKBO",LKBO,CZ,4940.233N,01717.700E,236.0m,2,7,840.0m,"118,275","BOHUNOVICE" +"LKBR",LKBR,CZ,5033.717N,01620.567E,409.0m,2,14,920.0m,"123,5","BROUMOV" +"LKBU",LKBU,CZ,4958.467N,01410.683E,426.0m,2,10,730.0m,"122,2","BUBOVICE" +"LKCE",LKCE,CZ,5042.633N,01434.083E,283.0m,2,13,700.0m,"123,6","CESKALIPA" +"LKCM",LKCM,CZ,4914.217N,01633.300E,282.0m,2,15,920.0m,"123,6","BRNOMEDLANKY" +"LKCO",LKCO,CZ,4958.633N,01611.117E,264.0m,2,15,620.0m,"125,825","CHOCEN" +"LKCR",LKCR,CZ,4956.183N,01546.833E,298.0m,2,6,980.0m,"122,6","CHRUDIM" +"LKCT",LKCT,CZ,4941.150N,01540.567E,593.0m,2,17,1010.0m,"122,2","CHOTEBOR" +"LKDK",LKDK,CZ,5024.850N,01550.217E,282.0m,2,10,860.0m,"119,65","DVURKRALOVE" +"LKER",LKER,CZ,4948.167N,01302.283E,478.0m,2,11,860.0m,"123,5","ERPUZICE" +"LKFR",LKFR,CZ,4935.367N,01822.750E,439.0m,2,8,800.0m,"123,5","FRYDLANTNO" +"LKHB",LKHB,CZ,4935.833N,01532.950E,463.0m,2,11,1000.0m,"122,6","HAVLICKUVBROD" +"LKHC",LKHC,CZ,5021.433N,01534.600E,280.0m,2,13,750.0m,"123,5","HORICE" +"LKHD",LKHD,CZ,5039.433N,01504.667E,451.0m,2,1,1000.0m,"123,5","HODKOVICE" +"LKHK",LKHK,CZ,5015.200N,01550.717E,241.0m,5,16,2400.0m,"122,30","HRADEC KRALOVE" +"LKHN",LKHN,CZ,4932.767N,01742.267E,243.0m,2,5,735.0m,"123,5","HRANICE" +"LKHO",LKHO,CZ,4918.867N,01734.133E,231.0m,2,11,1800.0m,"122,5","HOLESOV" +"LKHS",LKHS,CZ,4902.400N,01429.700E,494.0m,5,6,1000.0m,"130,2","HOSIN" +"LKHV",LKHV,CZ,4950.683N,01353.150E,370.0m,5,7,1170.0m,"122,6","HOROVICE" +"LKCH",LKCH,CZ,5028.133N,01328.083E,345.0m,2,4,1200.0m,"123,6","CHOMUTOV" +"LKCHEB",LKCHEB,CZ,5004.767N,01224.350E,469.0m,2,90,0.0m,,"LETISTE" +"LKJA",LKJA,CZ,5019.883N,01557.233E,271.0m,2,14,940.0m,"122,6","JAROMER" +"LKJC",LKJC,CZ,5025.800N,01519.983E,263.0m,2,12,1000.0m,"122,2","JICIN" +"LKJH",LKJH,CZ,4909.050N,01458.300E,513.0m,5,7,760.0m,"123,6","JINDRICHUVHRAD" +"LKJI",LKJI,CZ,4925.167N,01538.117E,555.0m,2,10,920.0m,"123,5","JIHLAVA" +"LKKA",LKKA,CZ,4922.100N,01606.967E,559.0m,2,14,700.0m,"122,2","KRIZANOV" +"LKKB",LKKB,CZ,5007.283N,01432.617E,286.0m,5,6,2000.0m,"135,5","KBELY" +"LKKL",LKKL,CZ,5006.767N,01405.383E,433.0m,2,13,900.0m,"123,475","KLADNO" +"LKKM",LKKM,CZ,4917.133N,01724.950E,188.0m,2,3,770.0m,"122,2","KROMERIZ" +"LKKO",LKKO,CZ,5000.117N,01510.400E,282.0m,2,3,850.0m,"123,5","KOLIN" +"LKKR",LKKR,CZ,5004.550N,01741.533E,369.0m,2,12,730.0m,"122,6","KRNOV" +"LKKT",LKKT,CZ,4925.100N,01319.317E,396.0m,2,9,820.0m,"122,2","KLATOVY" +"LKKU",LKKU,CZ,4901.767N,01726.383E,177.0m,5,3,2000.0m,"120,1","KUNOVICE" +"LKKV",LKKV,CZ,5012.183N,01254.900E,606.0m,5,11,2150.0m,"121,225","KARLOVYVARY" +"LKKY",LKKY,CZ,4858.800N,01707.483E,209.0m,2,15,1000.0m,"123,6","KYJOV" +"LKLB",LKLB,CZ,5046.100N,01501.500E,405.0m,2,16,1050.0m,"122,6","LIBEREC" +"LKLT",LKLT,CZ,5007.883N,01431.533E,278.0m,2,5,814.0m,"120,325","LETNANY" +"LKMB",LKMB,CZ,5023.900N,01453.900E,237.0m,2,16,900.0m,"123,6","MLADABOLESLAV" +"LKMH",LKMH,CZ,5032.400N,01500.400E,244.0m,5,7,1550.0m,"130,2","MNICHOVOHRAD" +"LKMI",LKMI,CZ,5018.100N,01717.850E,419.0m,2,5,1000.0m,"123,5","JESENIKMIKULOVI" +"LKMK",LKMK,CZ,4947.900N,01641.267E,403.0m,2,8,720.0m,"130,55","MORAVSKATREBOVA" +"LKMO",LKMO,CZ,5031.500N,01340.983E,331.0m,2,2,1130.0m,"123,5","MOST" +"LKMR",LKMR,CZ,4955.367N,01243.483E,539.0m,2,15,1035.0m,"120,9","MARIANSKELAZNE" +"LKMT",LKMT,CZ,4941.767N,01806.650E,257.0m,5,4,3500.0m,"120,8","OSTRAVAMOSNOV" +"LKNM",LKNM,CZ,5021.850N,01606.817E,305.0m,2,8,930.0m,"123,4","NOVEMESTONM" +"LKNY",LKNY,CZ,5010.167N,01503.267E,186.0m,5,9,600.0m,"123,475","NYMBURK" +"LKOL",LKOL,CZ,4935.267N,01712.650E,265.0m,2,10,900.0m,"118,0","OLOMOUC" +"LKOT",LKOT,CZ,4911.900N,01731.067E,184.0m,5,17,650.0m,"122,4","OTROKOVICE" +"LKPA",LKPA,CZ,4944.367N,01615.533E,603.0m,2,15,1500.0m,"122,6","POLICKA" +"LKPC",LKPC,CZ,5018.383N,01356.050E,368.0m,5,9,2505.0m,"130,550","PANENSKY TYNEC" +"LKPD",LKPD,CZ,5000.800N,01544.317E,226.0m,5,9,2500.0m,"121,250","PARDUBICE" +"LKPI",LKPI,CZ,4934.833N,01545.767E,531.0m,2,8,765.0m,"123,6","PRIBYSLAV" +"LKPJ",LKPJ,CZ,4926.867N,01708.033E,214.0m,2,12,1000.0m,"123,6","PROSTEJOV" +"LKPL",LKPL,CZ,4943.383N,01327.133E,419.0m,2,8,700.0m,"130,6","PLZENLETKOV" +"LKPM",LKPM,CZ,4943.200N,01406.017E,466.0m,5,6,1450.0m,"123,5","PRIBRAM" +"LKPN",LKPN,CZ,4956.350N,01532.983E,381.0m,2,7,730.0m,"123,6","PODHORANY" +"LKPO",PREROV,CZ,4925.583N,01724.400E,207.0m,5,240,2500.0m,,"PREROV" +"LKPR",LKPR,CZ,5006.050N,01415.600E,380.0m,5,6,3715.0m,"118,1","PRAHARUZYNE" +"LKPS",LKPS,CZ,4955.217N,01322.617E,437.0m,2,3,840.0m,"123,6","PLASY" +"LKRA",LKRA,CZ,5024.233N,01345.117E,269.0m,2,11,850.0m,"122,6","LOUNYRANA" +"LKRK",LKRK,CZ,5005.650N,01341.333E,388.0m,2,9,935.0m,"123,5","RAKOVNIK" +"LKRO",LKRO,CZ,5024.633N,01413.567E,222.0m,2,13,1400.0m,"122,2","ROUDNICENL" +"LKSA",LKSA,CZ,4934.000N,01302.917E,428.0m,2,7,660.0m,"123,6","STANKOV" +"LKSK",LKSK,CZ,4949.667N,01600.350E,488.0m,2,13,860.0m,"123,5","SKUTEC" +"LKSN",LKSN,CZ,5013.000N,01405.317E,329.0m,2,7,760.0m,"122,4","SLANY" +"LKSO",LKSO,CZ,4914.800N,01442.817E,407.0m,2,18,740.0m,"122,2","SOBESLAV" +"LKSR",LKSR,CZ,4904.950N,01404.550E,477.0m,2,15,900.0m,"123,5","STRUNKOVICE" +"LKST",LKST,CZ,4915.100N,01353.567E,420.0m,2,3,900.0m,"123,6","STRAKONICE" +"LKSU",LKSU,CZ,4957.633N,01701.067E,335.0m,2,18,700.0m,"122,6","SUMPERK" +"LKSZ",LKSZ,CZ,5019.483N,01415.533E,233.0m,2,15,1315.0m,"119,65","KRALUPYSAZENA" +"LKTA",LKTA,CZ,4923.467N,01442.500E,439.0m,2,12,1100.0m,"122,6","TABOR" +"LKTB",LKTB,CZ,4909.083N,01641.633E,237.0m,5,10,2650.0m,"119,6","BRNOTURANY" +"LKTC",LKTC,CZ,4959.117N,01425.533E,313.0m,2,10,800.0m,"123,4","TOCNA" +"LKTO",LKTO,CZ,5005.183N,01257.167E,651.0m,2,8,1290.0m,"122,6","TOUZIM" +"LKTV",LKTV,CZ,4926.317N,01437.417E,492.0m,5,13,1400.0m,"125,825","TABORVSECHOV" +"LKUO",LKUO,CZ,4958.717N,01625.583E,409.0m,2,14,887.0m,"122,2","USTINADORLICI" +"LKVL",LKVL,CZ,4943.733N,01452.733E,433.0m,2,13,750.0m,"123,5","VLASIM" +"LKVM",LKVM,CZ,4955.617N,01611.150E,301.0m,5,12,1200.0m,"130,6","VYSOKEMYTO" +"LKVO",LKVO,CZ,5013.000N,01423.733E,280.0m,5,10,2500.0m,"133,075","VODOCHODY" +"LKVP",LKVP,CZ,5028.100N,01612.117E,404.0m,2,9,760.0m,"122,2","HRONOVVPORICI" +"LKVR",LKVR,CZ,5037.450N,01538.783E,491.0m,2,11,840.0m,"125,325","VRCHLABI" +"LKVY",LKVY,CZ,4918.017N,01701.517E,279.0m,2,2,1280.0m,"123,5","VYSKOV" +"LKZA",LKZA,CZ,4955.700N,01804.700E,242.0m,5,10,900.0m,"123,6","ZABREH" +"LKZB",LKZB,CZ,4948.850N,01512.100E,493.0m,2,15,780.0m,"122,6","ZBRASLAVICE" +"LKZD",LKZD,CZ,5019.050N,01330.767E,269.0m,5,11,1120.0m,"125,425","ZATEC" +"LKZM",LKZM,CZ,5005.033N,01626.633E,429.0m,2,13,725.0m,"122,6","ZAMBERK" +"LKZN",LKZN,CZ,4849.067N,01603.950E,252.0m,2,8,860.0m,"130,6","ZNOJMO" +"LNARE",LNARE,CZ,4925.850N,01347.317E,565.0m,1,,,,"LNAREPLOCHA" +"LOMNICE",LOMNIC,CZ,4924.300N,01624.783E,0.0m,1,,,,"KOSTEL" +"LOMNICE N POPELKOU",LOMNIC,CZ,5031.850N,01522.467E,500.0m,17,,,,"KRIZOVATKA STRED" +"LUCINA",LUCINA,CZ,4948.383N,01234.883E,0.0m,1,,,,"HRAZ" +"LUKA NAD JIHLAVOU",LUKA,CZ,4922.167N,01542.550E,0.0m,1,,,,"NADRAZI" +"LYSA HORA",LYSAHO,CZ,4932.767N,01826.983E,1323.0m,7,,,,"VRCHOL" +"LYSYCE",LYSYCE,CZ,4927.183N,01632.050E,0.0m,1,,,,"ZAMEK" +"MALENIK",MALENI,CZ,4930.867N,01740.667E,479.0m,7,,,,"VRCHOL" +"MALSICE",MALSIC,CZ,4921.783N,01434.783E,0.0m,1,,,,"KOSTEL" +"MANETIN",MANETI,CZ,4959.600N,01313.817E,430.0m,1,,,,"KOSTEL" +"MEDVEDI VRCCH",MEDVRH,CZ,5009.600N,01718.700E,1216.0m,7,,,,"VRCHOL" +"MELC",MELC,CZ,4950.850N,01745.700E,0.0m,1,,,,"KOSTEL" +"MELNIK",MELNIK,CZ,5020.783N,01428.533E,0.0m,1,,,,"SOUTOK" +"MERIN",MERIN,CZ,4923.517N,01553.267E,519.0m,1,,,,"OBEC" +"MESTEC KRALOVE",MESKRA,CZ,5012.450N,01517.783E,0.0m,1,,,,"KOSTEL" +"MIKULOV",MIKULO,CZ,4848.417N,01638.117E,0.0m,1,,,,"CENTRUM" +"MILESOVKA",MILESO,CZ,5033.283N,01355.817E,0.0m,1,,,,"METEO" +"MILEVSKO",MILEVS,CZ,4926.950N,01421.450E,490.0m,1,,,,"KOSTEL" +"MILOVICE",MILOVI,CZ,5014.167N,01455.417E,199.0m,5,9,2500.0m,"125,825","SLZ PLOCHA" +"MIROSLAV",MIROSL,CZ,4856.833N,01618.817E,238.0m,1,,,,"NAMESTI" +"MISTEK",MISTEK,CZ,4939.333N,01821.000E,322.0m,2,2,425.0m,"122,6","SLZ PLOCHA" +"MLADA VOZICE",MLVOZI,CZ,4931.933N,01448.550E,238.0m,1,,,,"KOSTEL" +"MOHELNICE",MOHELN,CZ,4946.617N,01655.067E,0.0m,1,,,,"NAMESTI" +"MORAVSKE BUDEJOVICE",MORBUD,CZ,4903.067N,01548.517E,481.0m,1,,,,"KOSTEL" +"MORAVSKY BEROUN",MORBER,CZ,4947.067N,01725.900E,359.0m,1,,,,"NAMESTI" +"MORAVSKY KRUMLOV",MORKRU,CZ,4902.967N,01618.467E,307.0m,1,,,,"ZAMEK" +"MORKOV",MORKOV,CZ,4932.267N,01803.583E,0.0m,1,,,,"KOSTEL" +"MRAVENECNIK",MRAVEN,CZ,5004.533N,01708.233E,1343.0m,7,,,,"VRCHOL" +"MSENO",MSENO,CZ,5026.167N,01437.867E,0.0m,1,,,,"KOSTEL" +"NACHOD",NACHOD,CZ,5025.050N,01610.383E,0.0m,1,,,,"NADRAZI" +"NAKLO",NAKLO,CZ,4940.283N,01707.550E,305.0m,1,,,,"HRAZ" +"NEPOMUK",NEPOMU,CZ,4929.183N,01334.967E,0.0m,1,,,,"KOSTEL" +"NERATOVICE",NERATO,CZ,5015.733N,01431.600E,0.0m,1,,,,"MOST" +"NETOLICE",NETOLI,CZ,4903.267N,01411.400E,0.0m,1,,,,"NADRAZI" +"NOVA BYSTRICE",NOVBYS,CZ,4901.133N,01506.650E,535.0m,1,,,,"KOSTEL" +"NOVA PAKA",NOVPAK,CZ,5029.200N,01531.417E,0.0m,1,,,,"NADRAZI" +"NOVE MESTO NA MORAVE",NOVMEM,CZ,4934.100N,01604.917E,594.0m,1,,,,"NADRAZI" +"NOVE MLYNY",NOMLYN,CZ,4853.750N,01635.967E,256.0m,1,,,,"KOSTEL" +"NOVE VESELI",NOVESE,CZ,4931.183N,01554.350E,500.0m,1,,,,"KRIZOVATKA" +"NOVY BYDZOV",NOVBYD,CZ,5014.500N,01529.483E,0.0m,1,,,,"NAMESTI" +"NOVY JICIN",NOVJIC,CZ,4935.500N,01801.133E,0.0m,1,,,,"NADRAZI" +"NYMBURK",NYMBUR,CZ,5011.000N,01502.550E,0.0m,1,,,,"NAMESTI" +"NYRSKO",NYRSKO,CZ,4917.600N,01308.483E,0.0m,1,,,,"MOST" +"ODRY",ODRY,CZ,4940.183N,01749.983E,0.0m,1,,,,"NADRAZI" +"OKRISKY",OKRISK,CZ,4914.850N,01546.250E,472.0m,1,,,,"NADRAZI" +"OKROUHLICE",OKROUH,CZ,4937.833N,01529.250E,0.0m,1,,,,"Nadrazi" +"OLESNICE",OLESNI,CZ,4933.433N,01625.333E,0.0m,1,,,,"KOSTEL" +"OPARANY",OPARAN,CZ,4923.667N,01429.083E,420.0m,1,,,,"KOSTEL" +"OPAVA",OPAVA,CZ,4956.200N,01754.333E,0.0m,1,,,,"KRIZOVATKACENTR" +"OPOCNO",OPOCNO,CZ,5015.900N,01606.967E,0.0m,1,,,,"ZAMEK" +"ORLIK",ORLIK,CZ,4936.417N,01410.950E,0.0m,1,,,,"HRAZ" +"OSECNA",OSECNA,CZ,5041.600N,01455.250E,0.0m,1,,,,"KOSTEL" +"OSICINY",OSICIN,CZ,5000.933N,01446.350E,381.0m,2,18,540.0m,"125,825","SLZ PLOCHA" +"OSOVA BITYSKA",OSOBIT,CZ,4919.817N,01609.983E,535.0m,1,,,,"KRIZOVATKA" +"OSTROV",OSTROV,CZ,5020.217N,01258.217E,511.0m,2,7,500.0m,"122,4","SLZ PLOCHA" +"PACOV",PACOV,CZ,4928.317N,01500.317E,0.0m,1,,,,"KOSTEL" +"PASTVINY",PASTVI,CZ,5004.500N,01633.550E,574.0m,1,,,,"HRAZ" +"PAVOV",PAVOV,CZ,4927.067N,01536.650E,480.0m,1,,,,"KRIZOVATKA D1" +"PECKA",PECKA,CZ,5028.750N,01536.267E,0.0m,1,,,,"ZRICENINA" +"PELHRIMOV",PELHRI,CZ,4925.217N,01513.383E,494.0m,1,,,,"NADRAZI" +"PERNSTEJN",PERNST,CZ,4927.083N,01619.000E,530.0m,1,,,,"HRAD" +"PISEK",PISEK,CZ,4918.750N,01408.683E,472.0m,1,,,,"PISEKMOST" +"PLANA",PLANA,CZ,4951.967N,01244.017E,0.0m,1,,,,"CENTRUM" +"PLANANY",PLANAN,CZ,5003.033N,01501.967E,0.0m,1,,,,"KOSTEL" +"PLESNICE",PLESNI,CZ,4946.333N,01309.783E,408.0m,2,9,800.0m,"123.5","SLZ PLOCHA" +"PLUMLOV",PLUMLO,CZ,4928.100N,01702.300E,0.0m,1,,,,"HRAZ" +"POCATKY",POCATK,CZ,4915.700N,01514.267E,0.0m,1,,,,"OBEC" +"PODBORANY",PODBOR,CZ,5013.383N,01324.250E,0.0m,1,,,,"NADRAZI" +"PODEBRADY",PODEBR,CZ,5009.017N,01507.400E,0.0m,1,,,,"NADRAZI" +"PODOLI",PODOLI,CZ,4921.483N,01416.467E,0.0m,1,,,,"MOST" +"POLEPY",POLEPY,CZ,5031.233N,01416.317E,190.0m,2,18,400.0m,"125,825","SLZ PLOCHA" +"POLICE NAD METUJI",POLICE,CZ,5032.233N,01614.050E,450.0m,17,,,,"STRED MESTA" +"POLNA",POLNA,CZ,4929.250N,01543.117E,490.0m,1,,,,"CENTRUM" +"POPICE",POPICE,CZ,4921.017N,01532.433E,0.0m,1,,,,"KOSTEL" +"PORICI",PORICI,CZ,5034.433N,01556.883E,0.0m,1,,,,"KOSTEL" +"PRADED",PRADED,CZ,5005.000N,01713.950E,1491.0m,7,,,,"VRCHOL" +"PRACHATICE",PRACHA,CZ,4900.900N,01400.533E,0.0m,1,,,,"NADRAZI" +"PRACHOVICE",PRACHO,CZ,4953.650N,01537.733E,0.0m,1,,,,"KOSTEL" +"PRASILSKE JEZERO",PRJEZE,CZ,4904.600N,01324.167E,0.0m,1,,,,"PRASILSKEJEZERO" +"PROSEC",PROSEC,CZ,4948.333N,01607.100E,0.0m,1,,,,"KOSTEL" +"PROTIVANOV",PROTINOV,CZ,4928.983N,01650.267E,0.0m,1,,,,"KOSTEL" +"RABI",RABI,CZ,4916.850N,01337.133E,0.0m,1,,,,"HRAD" +"RABSTEJN",RABSTEJN,CZ,5002.583N,01317.667E,550.0m,1,,,,"HRAD" +"RADESINSKA SVRATKA",RADESTKA,CZ,4930.533N,01604.983E,0.0m,1,,,,"KOSTEL" +"RADHOST",RADHOS,CZ,4929.467N,01813.633E,0.0m,1,,,,"ROZHLEDNA" +"RADNICE",RADNICE,CZ,4951.367N,01336.383E,400.0m,1,,,,"KOSTEL" +"RADOSTIN NAD OSLAVOU",RADOSVOU,CZ,4927.700N,01558.000E,0.0m,1,,,,"KOSTEL" +"RALSKO",RALSKO,CZ,5040.467N,01445.950E,0.0m,7,,,,"VRCHOL" +"RAMZOVA",RAMZOVA,CZ,5011.767N,01703.867E,0.0m,1,,,,"KOSTEL" +"RICANY",RICANY,CZ,4959.867N,01439.867E,0.0m,1,,,,"NADRAZI" +"RIMOV",RIMOV,CZ,4851.017N,01429.467E,400.0m,1,,,,"MOST" +"RIP",RIP,CZ,5023.150N,01417.333E,0.0m,7,,,,"VRCHOL" +"ROHOZEC",ROHOZE,CZ,4958.917N,01523.567E,206.0m,2,5,400.0m,"133,0","SLZ PLOCHA" +"ROKYCANY",ROKYCA,CZ,4944.250N,01335.317E,362.0m,1,,,,"NADRAZI" +"ROKYTNICE NAD JIZEROU",ROKJIZ,CZ,5043.783N,01526.883E,690.0m,17,,,,"KRIZOVATKA STRED" +"ROKYTNICE V ORLICKYCH HORACH",ROKORL,CZ,5009.917N,01627.933E,550.0m,17,,,,"KRIZOVATKA STRED" +"ROPICE",ROPICE,CZ,4935.833N,01835.250E,1082.0m,7,,,,"VRCHOL" +"ROZDALOVICE",ROZDAICE,CZ,5018.417N,01510.283E,0.0m,1,,,,"KOSTEL" +"ROZNA",ROZNA,CZ,4928.733N,01613.967E,0.0m,1,,,,"KOSTEL" +"ROZNOV POD RADHOSTEM",ROZNOTEM,CZ,4927.600N,01808.100E,0.0m,1,,,,"NADRAZI" +"RUDA NAD MORAVOU",RUDANVOU,CZ,4958.967N,01652.750E,0.0m,1,,,,"KOSTEL" +"RUDNIK",RUDNIK,CZ,5035.767N,01544.083E,0.0m,1,,,,"KOSTEL" +"RYCNOV N KNEZNOU",RYCHKN,CZ,5009.483N,01616.433E,0.0m,1,,,,"NADRAZI" +"RYMAROV",RYMARO,CZ,4956.050N,01716.350E,590.0m,1,,,,"CENTRUM" +"SADSKA",SADSKA,CZ,5008.150N,01458.800E,0.0m,1,,,,"KOSTEL" +"SANCE",SANCE,CZ,4930.667N,01824.933E,0.0m,12,,,,"PRAHRADA" +"SANOV",SANOV,CZ,4848.617N,01622.967E,219.0m,1,,,,"NADRAZI" +"SAZAVA",SAZAVA,CZ,4953.417N,01456.667E,410.0m,2,9,400.0m,"125,825","SLZ PLOCHA" +"SEC",SEC,CZ,4950.217N,01538.783E,386.0m,1,,,,"HRAZ" +"SEDLCANY",SEDLCA,CZ,4939.333N,01426.050E,0.0m,1,,,,"NADRAZI" +"SEDLEC PRCICE",SEDPRC,CZ,4934.333N,01432.000E,0.0m,1,,,,"CENTRUM" +"SEMILY",SEMILY,CZ,5036.133N,01519.900E,0.0m,1,,,,"MOST" +"SEVETIN",SEVETIN,CZ,4906.000N,01434.367E,0.0m,1,,,,"KOSTEL" +"SKLENE NAD OSLAVOU",SKLENVOU,CZ,4926.250N,01603.200E,0.0m,1,,,,"NADRAZI" +"SKRYJE",SKRYJE,CZ,4923.500N,01618.383E,0.0m,1,,,,"KOSTEL" +"SLAPY",SLAPY,CZ,4949.433N,01426.033E,0.0m,1,,,,"HRAZ" +"SLAVONIN",SLAVON,CZ,4859.767N,01521.167E,512.0m,1,,,,"KOSTEL" +"SLEZSKA HARTA",SLEZSRTA,CZ,4953.417N,01735.100E,500.0m,12,,,,"PRAHRADA" +"SLUSOVICE",SLUSOV,CZ,4915.533N,01748.833E,354.0m,2,4,400.0m,"123,5","SLZ PLOCHA" +"SMRK",SMRK,CZ,5013.717N,01702.050E,1125.0m,7,,,,"VRCHOL" +"SMRK V BESKYDECH",SMRKVECH,CZ,4930.500N,01822.233E,1276.0m,1,,,,"VRCHOL" +"SNEZKA",SNEZKA,CZ,5044.150N,01544.433E,0.0m,7,,,,"VRCHOL" +"SOBOTKA",SOBOTK,CZ,5028.250N,01510.200E,0.0m,1,,,,"HUMPRECHT" +"SOKOLOV",SOKOLO,CZ,5011.083N,01238.133E,410.0m,1,,,,"SILNICNIMOST" +"SOPOTICE",SOPOTICE,CZ,5003.600N,01620.750E,0.0m,1,,,,"KOSTEL" +"STAJ",STAJ,CZ,4927.500N,01548.217E,0.0m,1,,,,"KOSTEL" +"STARE MESTO",STARESTO,CZ,5009.667N,01656.917E,0.0m,1,,,,"KOSTEL" +"STARY JICIN",STARYCIN,CZ,4934.667N,01757.733E,0.0m,1,,,,"KOSTEL" +"STERNBERK",STERNB,CZ,4944.333N,01718.133E,306.0m,1,,,,"ZAMEK" +"STETI",STETI,CZ,5027.917N,01424.283E,240.0m,2,14,500.0m,"125,825","SLZ PLOCHA" +"STIPA",STIPA,CZ,4916.383N,01744.867E,336.0m,2,9,400.0m,"122,8","SLZ PLOCHA" +"STITY",STITY,CZ,4957.733N,01645.700E,450.0m,1,,,,"KOSTEL" +"STONAROV",STONAROV,CZ,4916.900N,01535.267E,0.0m,1,,,,"KOSTEL" +"STRAZEK",STRAZEK,CZ,4926.400N,01611.733E,0.0m,1,,,,"KOSTEL" +"STRAZNICE",STRAZN,CZ,4853.300N,01717.717E,190.0m,2,5,750.0m,"125,30","SLZ PLOCHA" +"STREMY",STREMY,CZ,5023.100N,01434.617E,305.0m,2,9,500.0m,"125,825","SLZ PLOCHA" +"STRIBRO",STRIBR,CZ,4945.217N,01259.700E,0.0m,1,,,,"CENTRUM" +"SUCHY VRCH",SUCHVR,CZ,5003.100N,01641.600E,995.0m,8,,,,"VYSILAC" +"SUMVALDSKY RYBNIK",SUMVANIK,CZ,4948.750N,01707.233E,390.0m,12,,,,"RYBNIK" +"SUSICE",SUSICE,CZ,4913.783N,01331.267E,0.0m,1,,,,"MOST" +"SVETLA N SAZAVOU",SVETLA,CZ,4940.217N,01525.033E,400.0m,1,,,,"CENTRUM" +"SVIHOV",SVIHOV,CZ,4928.733N,01317.117E,452.0m,1,,,,"HRAD" +"SVITAVY",SVITAV,CZ,4945.267N,01628.450E,435.0m,1,,,,"CENTRUM" +"SVOJANOV",SVOJANOV,CZ,4937.617N,01624.533E,0.0m,16,,,,"HRAD" +"SYKOR",SYKOR,CZ,4926.800N,01624.450E,701.0m,7,,,,"VRCHOL" +"TACHOV",TACHOV,CZ,4947.683N,01238.133E,530.0m,1,,,,"CENTRUM" +"TELC",TELC,CZ,4910.967N,01527.900E,523.0m,1,,,,"NADRAZI" +"TEPLA",TEPLA,CZ,4958.783N,01251.833E,600.0m,1,,,,"STRED" +"TEPLICE",TEPLIC,CZ,5038.800N,01349.767E,0.0m,1,,,,"NADRAZICENTRUM" +"TEPLICE NAD METUJI",TEPLIUJI,CZ,5035.567N,01610.333E,0.0m,1,,,,"NADRAZI" +"TISNOV",TISNOV,CZ,4920.833N,01625.083E,395.0m,1,,,,"NADRAZI" +"TRAVNY",TRAVNY,CZ,4933.667N,01830.533E,1203.0m,7,,,,"VRCHOL" +"TREBETIN",TREBETIN,CZ,4946.217N,01516.217E,550.0m,1,,,,"KOSTEL" +"TREBIC",TREBIC,CZ,4912.683N,01553.067E,505.0m,1,,,,"NADRAZI" +"TREBON",TREBON,CZ,4859.983N,01446.367E,534.0m,1,,,,"HRAZSVET" +"TREST",TREST,CZ,4917.217N,01528.933E,582.0m,1,,,,"NADRAZI" +"TRHOVE SVINY",TRHSVI,CZ,4850.317N,01438.317E,637.0m,1,,,,"KOSTEL" +"TROJBOD",TROJBO,CZ,5012.233N,01443.533E,0.0m,1,,,,"TROJBOD" +"TROSKY",TROSKY,CZ,5030.983N,01514.000E,0.0m,1,,,,"ZRICENINA" +"TRUTNOV",TRUTNO,CZ,5033.700N,01554.450E,420.0m,17,,,,"KRIZOVATKA STRED" +"TYN N VLTAVOU",TYNVLT,CZ,4913.283N,01425.267E,486.0m,1,,,,"MOST" +"TYNEC NAD LABEM",TYNECBEM,CZ,5002.433N,01521.500E,0.0m,1,,,,"KOSTEL" +"TYNISTE N ORLICI",TYNORL,CZ,5009.267N,01604.450E,321.0m,1,,,,"CENTRUM" +"UHERSKY BROD",UHERBR,CZ,4901.333N,01738.467E,0.0m,1,,,,"NADRAZI" +"UHLIRSKE JANOVICE",UHLJAN,CZ,4952.850N,01503.867E,389.0m,1,,,,"OBEC" +"UNICOV",UNICOV,CZ,4946.267N,01707.300E,0.0m,1,,,,"CENTRUM" +"UPICE",UPICE,CZ,5030.617N,01600.950E,410.0m,17,,,,"KRIZOVATKA STRED" +"USOV",USOV,CZ,4947.900N,01700.667E,300.0m,1,,,,"KOSTEL" +"USTEK",USTEK,CZ,5035.067N,01420.600E,0.0m,1,,,,"KOSTEL" +"USTI NAD LABEM",USTLAB,CZ,5039.550N,01402.833E,0.0m,1,,,,"SILNICNIMOST" +"UVALY",UVALY,CZ,5004.483N,01443.367E,0.0m,1,,,,"NADRAZI" +"VALASKE MEZIRICI",VALMEZ,CZ,4928.617N,01757.733E,0.0m,1,,,,"NADRAZI" +"VALEC",VALEC,CZ,5010.467N,01315.133E,500.0m,1,,,,"KOSTEL" +"VELESIN",VELESI,CZ,4849.600N,01426.967E,518.0m,2,9,400.0m,"120,675","SLZ PLOCHA" +"VELKA BITES",VELBIT,CZ,4917.283N,01613.683E,0.0m,1,,,,"CENTRUM" +"VELKA BYSTRICE",VELKCE,CZ,4935.867N,01721.967E,260.0m,1,,,,"NADRAZI" +"VELKA DESTNA",VELDES,CZ,5018.133N,01623.917E,1115.0m,7,,,,"VRCHOL" +"VELKA JAVORINA",VELKNA,CZ,4851.517N,01740.483E,970.0m,7,,,,"VRCHOL" +"VELKE KARLOVICE",VELKCE,CZ,4921.600N,01817.133E,0.0m,1,,,,"KOSTEL" +"VELKE MEZIRICI",VELMEZ,CZ,4921.600N,01600.900E,0.0m,1,,,,"DALNICNIMOST" +"VELKY JAVORNIK",VELJAV,CZ,4919.133N,01822.533E,1071.0m,7,,,,"VRCHOL" +"VELKY POLOM",VELKOM,CZ,4930.367N,01840.233E,1067.0m,7,,,,"VRCHOL" +"VELKY SENOV",VELNOV,CZ,5059.600N,01422.783E,0.0m,1,,,,"NADRAZI" +"VELKY TYNEC",VELNEC,CZ,4933.050N,01719.933E,0.0m,1,,,,"KOSTEL" +"VERNYROV",VERNYV,CZ,4950.833N,01509.183E,450.0m,1,,,,"KRIZOVATKA" +"VESELI N LUZNICI",VESLUZ,CZ,4911.233N,01442.050E,0.0m,1,,,,"MOST" +"VESELI NAD LIZNICI",VESECI,CZ,4911.617N,01442.983E,0.0m,1,,,,"NADRAZI" +"VETRNI JENIKOV",VETRNV,CZ,4928.417N,01528.683E,650.0m,1,,,,"KOSTEL" +"VEVERSKA BITYSKA",VEVESA,CZ,4916.533N,01626.233E,0.0m,1,,,,"KOSTEL" +"VEZNICE",VEZNCE,CZ,4924.533N,01545.367E,0.0m,1,,,,"NADJEZD" +"VIMPERK",VIMPER,CZ,4903.500N,01347.133E,694.0m,1,,,,"CENTRUM" +"VINOR",VINOR,CZ,5008.583N,01434.817E,0.0m,1,,,,"ZAMEK" +"VIR",VIR,CZ,4934.100N,01619.183E,517.0m,1,,,,"HRAZ" +"VISNOVA",VISNVA,CZ,4942.350N,01408.800E,0.0m,1,,,,"KOSTEL" +"VIZOVICE",VIZOVE,CZ,4913.167N,01750.567E,0.0m,1,,,,"NADRAZI" +"VODNANY",VODNAN,CZ,4908.750N,01410.733E,490.0m,1,,,,"NADRAZI" +"VOJNUV MESTEC",VOJMES,CZ,4940.767N,01552.517E,0.0m,1,,,,"NAMESTI" +"VOLYNE",VOLYNE,CZ,4910.100N,01353.500E,0.0m,1,,,,"MOST" +"VOTICE",VOTICE,CZ,4938.350N,01438.483E,436.0m,1,,,,"OBEC" +"VRANOV",VRANOV,CZ,4918.533N,01636.733E,0.0m,1,,,,"KOSTEL" +"VRANOV",VRANOV,CZ,4854.533N,01549.250E,405.0m,1,,,,"HRAZ" +"VRBNO POD PRADEDEM",VRBNOM,CZ,5007.033N,01722.750E,0.0m,1,,,,"KOSTEL" +"VSETIN",VSETIN,CZ,4920.017N,01759.217E,0.0m,1,,,,"KRIZOVATKAJIH" +"VYROVICE",VYRVCE,CZ,4855.767N,01606.567E,296.0m,12,,,,"VODNI NADRZ" +"VYSKYTNA",VYSKYA,CZ,4925.717N,01521.850E,650.0m,1,,,,"KOSTEL" +"VYSSI BROD",VYSIRD,CZ,4837.250N,01418.567E,600.0m,1,,,,"KOSTEL" +"ZABREH",ZABREH,CZ,4952.333N,01653.183E,388.0m,1,,,,"CENTRUM" +"ZAHORI",ZAHORI,CZ,4928.033N,01740.083E,317.0m,2,6,450.0m,"119,750","SLZ PLOCHA" +"ZALY",ZALY,CZ,5039.467N,01534.350E,1018.0m,7,,,,"ROZHLEDNA" +"ZATEC",ZATEC,CZ,5020.150N,01332.550E,0.0m,1,,,,"MOST" +"ZDAKOV",ZDAKOV,CZ,4930.250N,01411.000E,0.0m,1,,,,"ZDAKOVSKYMOST" +"ZDANIC",ZDANICE,CZ,4904.067N,01701.783E,0.0m,1,,,,"KOSTEL" +"ZDAR N SAZAVOU",ZDARSA,CZ,4933.967N,01556.383E,0.0m,1,,,,"CENTRUM" +"ZDAREC",ZDAREC,CZ,4922.617N,01615.950E,0.0m,1,,,,"STRED OBCE" +"ZEBRAK",ZEBRAK,CZ,4952.183N,01353.717E,386.0m,1,,,,"D5 EXIT" +"ZEHUN",ZEHUN,CZ,5008.133N,01517.450E,0.0m,1,,,,"KOSTEL" +"ZELETAVA",ZELETA,CZ,4908.600N,01540.417E,0.0m,1,,,,"KOSTEL" +"ZELEZNA RUDA",ZELRUD,CZ,4908.317N,01313.883E,0.0m,1,,,,"OBEC" +"ZELIV",ZELIV,CZ,4932.017N,01513.183E,406.0m,1,,,,"KOSTEL" +"ZELIVKA MOST",ZELIVK,CZ,4940.700N,01508.883E,447.0m,1,,,,"MOST" +"ZLATY CHLUM",ZLATCH,CZ,5014.317N,01714.400E,0.0m,1,,,,"ROZHLEDNA" +"ZLIN",ZLIN,CZ,4913.583N,01739.500E,0.0m,1,,,,"NADRAZI" +"ZLUTICE",ZLUTIC,CZ,5005.150N,01307.583E,0.0m,1,,,,"HRAZ" +"ZNOJMO",ZNOJMO,CZ,4851.150N,01603.550E,300.0m,1,,,,"NADRAZI" +"ZRUC NAD SAZAVOU",ZRUC,CZ,4944.283N,01506.250E,380.0m,1,,,,"NADRAZI" +"ZULOVA",ZULOVA,CZ,5018.433N,01706.117E,0.0m,1,,,,"NADRAZI" +"ZVIKOV",ZVIKOV,CZ,4926.317N,01411.533E,0.0m,1,,,,"HRAD" +"ZVIKOVEC",ZVKVEC,CZ,4957.583N,01341.867E,323.0m,1,,,,"MOST" +, diff --git a/src/database/models.py b/src/database/models.py index faa93e8..a31ad4f 100644 --- a/src/database/models.py +++ b/src/database/models.py @@ -45,8 +45,6 @@ class BaseModel: return obj -# TODO: doplnit GPX k letu - user_is_in_organization = Table( "user_is_in_organization", BaseModel.metadata, @@ -219,7 +217,7 @@ class Flight(BaseModel): weather_info_takeoff_id: Mapped[int] = mapped_column(Integer, ForeignKey('weather_info.id'), nullable=True) weather_info_landing_id: Mapped[int] = mapped_column(Integer, ForeignKey('weather_info.id'), nullable=True) landings: Mapped[int] = mapped_column(Integer, default=1) - + is_public: Mapped[bool] = mapped_column(Boolean, server_default='0') created_by_id: Mapped[int] = mapped_column(Integer, ForeignKey('user.id')) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now()) deleted: Mapped[bool] = mapped_column(Boolean, nullable=False, server_default='0') @@ -282,7 +280,10 @@ class User(BaseModel): id: Mapped[int] = mapped_column(primary_key=True) email: Mapped[str] = mapped_column(String(128), nullable=False, unique=True) name: Mapped[str] = mapped_column(String(128), nullable=False) - avatar_image_url: Mapped[str] = mapped_column(String(128), nullable=True) + description: Mapped[str] = mapped_column(Text, nullable=False) + public_username: Mapped[str] = mapped_column(String(128), nullable=True, unique=True) + avatar_image_filename: Mapped[str] = mapped_column(String(128), nullable=True) + title_image_filename: Mapped[str] = mapped_column(String(128), nullable=True) password_hashed: Mapped[str] = mapped_column(String(60), nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now()) diff --git a/src/endpoints/init_data.py b/src/endpoints/init_data.py deleted file mode 100644 index e978ca0..0000000 --- a/src/endpoints/init_data.py +++ /dev/null @@ -1,60 +0,0 @@ -from database.models import User, Flight, Copilot, Airport, Aircraft -from endpoints.base import BaseEndpoint - - -class InitDataEndpoint(BaseEndpoint): - - async def on_get(self): - user_ids = [] - copilot_ids = [] - flight_ids = [] - - users = [ - User(avatar_image_url="", name="Karel Vomacka", email="a@test.cz", password_hashed="****"), - User(avatar_image_url="", name="Karel Novak", email="b@test.cz", password_hashed="****"), - User(avatar_image_url="", name="Franta Pavel", email="c@test.cz", password_hashed="****"), - ] - - airport = Airport(name="Letiste Letnany", icao_code="LKLT") - self.db.add(airport) - - for user in users: - self.db.add(user) - await self.db.flush() - user_ids.append(user.id) - - aircraft = Aircraft(name="OK-AUR28", type="Bristell NG5", description="", created_by=user) - self.db.add(aircraft) - - copilot = None - if user.name == 'Franta Pavel': - copilot = Copilot(name="Copilot test", created_by_id=user.id) - self.db.add(copilot) - await self.db.flush() - - copilot_ids.append(copilot.id) - - flight = Flight(name="test flight", description="Testovaci popis", duration_total=65, duration_pic=65, - takeoff_airport=airport, landing_airport=airport, aircraft=aircraft, created_by_id=user.id, - copilot_id=copilot.id if copilot else None) - self.db.add(flight) - await self.db.flush() - flight_ids.append(flight.id) - - return { - "user_ids": user_ids, - "copilot_ids": copilot_ids, - "flight_ids": flight_ids, - 'airport_id': airport.id - } - - # - # - # self.db.add(Flight(name="test")) - # await self.db.flush() - # - # data = await self.db.execute(select(Flight).order_by(desc(Flight.id))) - # model = data.scalars().first() - # return { - # "status": model - # } diff --git a/src/endpoints/login.py b/src/endpoints/login.py index c2f34b5..1037497 100644 --- a/src/endpoints/login.py +++ b/src/endpoints/login.py @@ -4,7 +4,6 @@ from fastapi_jwt.jwt import JwtAccess, JwtRefresh from passlib.hash import bcrypt from sqlalchemy import select from starlette.responses import Response - from database.models import User from endpoints.base import BaseEndpoint from pydantic import BaseModel @@ -74,15 +73,3 @@ class RefreshEndpoint(BaseEndpoint): "access_token": access_token, "access_token_validity": self.access_security.access_expires_delta.total_seconds(), } - - -class MeEndpoint(BaseEndpoint): - - async def on_get(self, credentials) -> dict: - if not credentials: - raise HTTPException(status_code=401) - - query = select(User).filter_by(id=credentials['id']) - user = (await self.db.scalars(query)).first() - - return user.as_dict() diff --git a/src/endpoints/registration.py b/src/endpoints/registration.py index 1cc7845..f91edbf 100644 --- a/src/endpoints/registration.py +++ b/src/endpoints/registration.py @@ -1,5 +1,4 @@ import re - from fastapi import HTTPException from sqlalchemy import select from typing import Optional diff --git a/src/graphql_schema/entities/flight.py b/src/graphql_schema/entities/flight.py index ec3f265..c6ed3b1 100644 --- a/src/graphql_schema/entities/flight.py +++ b/src/graphql_schema/entities/flight.py @@ -15,7 +15,7 @@ from graphql_schema.entities.airport import Airport from graphql_schema.entities.photo import Photo from graphql_schema.entities.poi import PointOfInterest from graphql_schema.sqlalchemy_to_strawberry_type import strawberry_sqlalchemy_type, strawberry_sqlalchemy_input -from upload_utils import get_public_url, handle_file_upload, check_directories, file_exists, delete_file +from upload_utils import handle_file_upload, file_exists, delete_file from .helpers.flight import handle_aircraft_save, handle_track_edit, handle_copilot_edit, handle_weather_info from ..dataloaders.weather import airport_weather_info_loader from ..types import ComboboxInput @@ -95,28 +95,40 @@ class Flight: gpx_track_url: Optional[str] = strawberry.field(resolver=load_gpx_track_url) -def get_base_query(user_id: int): - return ( +def get_base_query(user_id: Optional[int], username: Optional[str] = None, is_auth: bool = False): + query = ( select(models.Flight) - .filter(models.Flight.created_by_id == user_id) .filter(models.Flight.deleted.is_(False)) .order_by(models.Flight.id.desc()) ) + if user_id: + query = query.filter(models.Flight.created_by_id == user_id) + + if username: + query = query.filter(models.Flight.created_by.public_username == username) + + if not is_auth: + query = query.filter(models.Flight.is_public.is_(True)) + + return query + @strawberry.type class FlightQueries: @strawberry.field - async def flights(root, info) -> List[Flight]: - query = get_base_query(info.context.user_id).order_by(models.Flight.id.desc()) - + async def flights(root, info, username: Optional[str] = None) -> List[Flight]: + query = ( + get_base_query(user_id=info.context.user_id, username=username, is_auth=bool(info.context.user_id)) + .order_by(models.Flight.id.desc()) + ) return (await info.context.db.scalars(query)).all() @strawberry.field - async def flight(root, info, id: int) -> Flight: + async def flight(root, info, id: int, username: Optional[str] = None) -> Flight: query = ( - get_base_query(info.context.user_id) + get_base_query(user_id=info.context.user_id, username=username, is_auth=bool(info.context.user_id)) .filter(models.Flight.id == id) .filter(models.Flight.deleted.is_(False)) ) @@ -176,7 +188,7 @@ class EditFlightMutation: # TODO: umoznit editovat jen vlastni lety! flight = (await info.context.db.scalars( - get_base_query(info.context.user_id).filter(models.Flight.id == id) + get_base_query(user_id=info.context.user_id, is_auth=bool(info.context.user_id)).filter(models.Flight.id == id) )).one() data = input.to_dict() @@ -221,7 +233,7 @@ class DeleteFlightMutation: async def delete_flight(self, info, id: int) -> Flight: flight = ( (await info.context.db.scalars( - get_base_query(info.context.user_id) + get_base_query(user_id=info.context.user_id, is_auth=True) .filter(models.Flight.id == id)) ) .one() diff --git a/src/graphql_schema/entities/user.py b/src/graphql_schema/entities/user.py index 17c5dfe..11377f6 100644 --- a/src/graphql_schema/entities/user.py +++ b/src/graphql_schema/entities/user.py @@ -1,25 +1,90 @@ +from typing import Optional import strawberry +from graphql import GraphQLError +from passlib.hash import bcrypt from sqlalchemy import select +from strawberry.file_uploads import Upload +from database import models from database.models import User -from graphql_schema.sqlalchemy_to_strawberry_type import strawberry_sqlalchemy_type +from graphql_schema.sqlalchemy_to_strawberry_type import strawberry_sqlalchemy_type, strawberry_sqlalchemy_input +from upload_utils import handle_file_upload, delete_file @strawberry_sqlalchemy_type(User, exclude_fields=['password_hashed']) -class UserType: - pass +class User: + async def load_avatar_image_url(root): + if not root.avatar_image_filename: + return None -@strawberry.type -class LoginResultType: - logged_user = UserType - access_token: str - refresh_token: str + return f"http://localhost:8000/uploads/profile/{root.id}/{root.avatar_image_filename}" + + async def load_title_image_url(root): + if not root.title_image_filename: + return "http://localhost:8000/static/default-title-image.jpg" + + return f"http://localhost:8000/uploads/profile/{root.id}/{root.title_image_filename}" + + avatar_image_url: Optional[str] = strawberry.field(resolver=load_avatar_image_url) + title_image_url: str = strawberry.field(resolver=load_title_image_url) @strawberry.type class UserQueries: + @strawberry.field + async def user(root, info, username: str) -> User: + print("username") + if len(username) == 0: + raise GraphQLError("Username not set!") + + return (await info.context.db.scalars( + select(models.User).filter_by(public_username=username) + )).one() @strawberry.field - async def logged_user(root, info) -> UserType: - query = select(User).filter_by(id=info.context.user_id) - return (await info.context.db.scalars(query)).first() + async def logged_user(root, info) -> User: + return (await info.context.db.scalars( + select(models.User).filter_by(id=info.context.user_id) + )).one() + + +@strawberry.type +class EditUserMutation: + @strawberry_sqlalchemy_input( + models.User, + exclude_fields=['id', 'email', 'avatar_image_filename', 'password_hashed', 'title_image_filename'], + all_optional=True + ) + class EditUserInput: + old_password: Optional[str] = None + new_password: Optional[str] = None + avatar_image: Optional[Upload] = None + title_image: Optional[Upload] = None + + @strawberry.mutation + async def edit_logged_user(root, info, input: EditUserInput) -> User: + user = (await info.context.db.scalars( + select(models.User).filter_by(id=info.context.user_id) + )).one() + + user_image_path = f"/app/uploads/profile/{user.id}" + data = input.to_dict() + if input.avatar_image: + if user.avatar_image_filename: + delete_file(f"{user_image_path}/{user.avatar_image_filename}", silent=True) + + data['avatar_image_filename'] = await handle_file_upload(input.avatar_image, user_image_path) + + if input.title_image: + if user.title_image_filename: + delete_file(f"{user_image_path}/{user.title_image_filename}", silent=True) + + data['title_image_filename'] = await handle_file_upload(input.title_image, user_image_path) + + if input.old_password and input.new_password: + if not bcrypt.verify(input.old_password, user.password_hashed): + raise GraphQLError("Bad password") + + data['password_hashed'] = bcrypt.hash(input.new_password) + + return await models.User.update(info.context.db, obj=user, data=data) diff --git a/src/graphql_schema/mutation.py b/src/graphql_schema/mutation.py index 76272c4..281e8ac 100644 --- a/src/graphql_schema/mutation.py +++ b/src/graphql_schema/mutation.py @@ -4,6 +4,7 @@ from graphql_schema.entities.copilot import CreateCopilotMutation, EditCopilotMu from graphql_schema.entities.flight import CreateFlightMutation, EditFlightMutation, DeleteFlightMutation from graphql_schema.entities.photo import UploadPhotoMutation, DeletePhotoMutation, EditPhotoMutation from graphql_schema.entities.poi import CreatePointOfInterestMutation, EditPointOfInterestMutation +from graphql_schema.entities.user import EditUserMutation Mutation = merge_types("Mutation", ( CreateAircraftMutation, @@ -19,4 +20,5 @@ Mutation = merge_types("Mutation", ( EditPointOfInterestMutation, CreateCopilotMutation, EditCopilotMutation, + EditUserMutation, )) diff --git a/src/main.py b/src/main.py index 488f78e..d3fba2c 100644 --- a/src/main.py +++ b/src/main.py @@ -10,8 +10,7 @@ from starlette.status import HTTP_401_UNAUTHORIZED from strawberry.fastapi import GraphQLRouter from config import APP_SECRET_KEY, GRAPHIQL, APP_DEBUG from dependencies.db import db_session -from endpoints.init_data import InitDataEndpoint -from endpoints.login import LoginEndpoint, LoginInput, MeEndpoint, RefreshEndpoint +from endpoints.login import LoginEndpoint, LoginInput, RefreshEndpoint from endpoints.registration import RegistrationInput, RegistrationEndpoint from graphql_schema.schema import schema, GraphQLContext @@ -33,6 +32,7 @@ class App: self.setup_exception_handlers(app) self.setup_middleware(app) + self.setup_static_paths(app) self.setup_routes(app) return app @@ -43,15 +43,19 @@ class App: @staticmethod def setup_middleware(app: FastAPI): - print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") app.add_middleware( CORSMiddleware, - allow_origins=["http://localhost:9001"], + allow_origins=["http://localhost:9001"], # TODO: pridat pres ENV URL produkce allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) + @staticmethod + def setup_static_paths(app: FastAPI): + app.mount("/uploads", StaticFiles(directory="/app/uploads"), name="uploads") + app.mount("/static", StaticFiles(directory="/app/static"), name="static") + def setup_graphql_endpoint(self, app: FastAPI): if APP_DEBUG: @self.api_router.get("/graphql/autologin") @@ -67,12 +71,9 @@ class App: credentials: JwtAuthorizationCredentials = Security(self.access_security), db: AsyncSession = Depends(db_session) ): - if not credentials: - raise HTTPException(status_code=HTTP_401_UNAUTHORIZED) - return GraphQLContext( jwt_auth_credentials=credentials, - user_id=credentials['id'], + user_id=credentials['id'] if credentials else None, db=db, jwt=self.access_security, background_tasks=Depends(BackgroundTasks) @@ -88,13 +89,6 @@ class App: def setup_routes(self, app: FastAPI): # protected endpoints - @self.api_router.get("/me") - async def me( - db: AsyncSession = Depends(db_session), - credentials: JwtAuthorizationCredentials = Security(self.access_security) - ): - return await MeEndpoint(db).on_get(credentials) - @app.post("/refresh") async def refresh( resp: Response, @@ -104,10 +98,7 @@ class App: self.setup_graphql_endpoint(app) - app.mount("/uploads", StaticFiles(directory="/app/uploads"), name="uploads") - # public endpoints - @self.api_router.post("/login") async def login(resp: Response, user: LoginInput, db: AsyncSession = Depends(db_session)): return await LoginEndpoint(db, self.access_security, self.refresh_security).on_post(user, resp) @@ -116,11 +107,5 @@ class App: async def registration(user: RegistrationInput, db: AsyncSession = Depends(db_session)): return await RegistrationEndpoint(db).on_post(user) - # testing endpoint - - @self.api_router.get("/init-data") - async def init_data(db: AsyncSession = Depends(db_session)): - return await InitDataEndpoint(db).on_get() - # musi byt na konci app.include_router(self.api_router) diff --git a/static/default-title-image.jpg b/static/default-title-image.jpg new file mode 100644 index 0000000..19eaa7e Binary files /dev/null and b/static/default-title-image.jpg differ