From d15d46e90d929c0352c36747989035b39becdba4 Mon Sep 17 00:00:00 2001 From: Jacob Date: Mon, 25 Aug 2025 22:18:41 +0200 Subject: [PATCH 01/13] Translated using Weblate (Swedish) Currently translated at 45.2% (526 of 1163 strings) Translation: Osmose/backend Translate-URL: https://hosted.weblate.org/projects/osmose/backend/sv/ --- po/sv.po | 91 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 18 deletions(-) diff --git a/po/sv.po b/po/sv.po index df95402cd..446e5a577 100644 --- a/po/sv.po +++ b/po/sv.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-04-28 19:47+0200\n" -"PO-Revision-Date: 2025-08-24 14:51+0000\n" +"PO-Revision-Date: 2025-08-25 22:01+0000\n" "Last-Translator: Jacob \n" "Language-Team: Swedish \n" @@ -5128,43 +5128,55 @@ msgid "" "a\n" "role." msgstr "" +"Ett objekt utan definierande taggar (inga andra taggar än `source`, " +"`created_by`, `area` eller `name`) och inte heller del av en relation med en " +"given roll." #: ../plugins/Name_PoorlyWrittenWayType.py:49 msgid "Badly written way name" -msgstr "" +msgstr "Felformaterat gatunamn" #: ../plugins/Name_PoorlyWrittenWayType.py:51 msgid "" "An abbreviation is present (e.g. Rd instead of Road) or the first letter of " "the name is lower case." msgstr "" +"En förkortning hittades (ex. 'Norrv.' istället för 'Norrvägen') eller så är " +"första bokstaven inte versal." #: ../plugins/Name_PoorlyWrittenWayType.py:53 msgid "" "Write the name without any abbreviations and make sure the first letter is " "upper case." msgstr "" +"Skriv ut gatunamnet utan några förkortningar och se till att första " +"bokstaven är en versal." #: ../analysers/analyser_osmosis_indoor.py:193 ../plugins/indoor.py:23 #: ../plugins/indoor.py:120 ../plugins/indoor.py:206 msgid "This indoor room should have a door" -msgstr "" +msgstr "Det här rummet inomhus borde ha en dörr" #: ../analysers/analyser_osmosis_indoor.py:195 msgid "" "Find out where the entrances of the room are and add them (with a `door=*` " "tag) so we can actually enter this indoor room." msgstr "" +"Ta reda på var ingångarna till rummet är och lägg till dem (med taggen " +"`door=*`) så kartan kan visa hur en faktiskt tar sig in i rummet." #: ../analysers/analyser_osmosis_indoor.py:197 msgid "This indoor feature is not reachable" -msgstr "" +msgstr "Det här inomhusobjektet går inte att nå" #: ../analysers/analyser_osmosis_indoor.py:199 msgid "" "Each indoor feature should be connected to another indoor feature or to some " "footpath so people can actually go to them." msgstr "" +"Alla företeelser, faciliteter etc inomhus bör vara anslutna till andra " +"inomhusobjekt eller till en gångväg eller liknande, så att människor vet hur " +"de ska ta sig fram till dem." #: ../analysers/analyser_osmosis_powerline.py:689 msgid "" @@ -5172,25 +5184,29 @@ msgid "" "Add a transformer using `power=transformer` (standalone transformers) or " "`power=pole + transformer=*` (pole mounted transformers)." msgstr "" +"Kontrollera att spänningen faktiskt är olika.\n" +"I så fall, lägg till en transformator med `power=transformer` (fristående " +"transformatorstation) eller `power=pole` + `transformer=*` (transformator " +"monterad på ledningsstolpe)." #: ../plugins/indoor.py:20 ../plugins/indoor.py:54 ../plugins/indoor.py:111 msgid "This indoor feature should be a closed and valid polygon" -msgstr "" +msgstr "Det här inomhusobjektet borde vara en sluten och giltig polygon" #: ../plugins/indoor.py:21 ../plugins/indoor.py:135 msgid "This indoor feature should have a level" -msgstr "" +msgstr "Det här inomhusobjektet borde ha ett angivet våningsplan `level`" #: ../plugins/indoor.py:22 ../plugins/indoor.py:157 msgid "This indoor shop should probably be inside a room" -msgstr "" +msgstr "Denna inomhusbutik borde troligen vara inuti ett rum" #: ../analysers/analyser_osmosis_tag_typo.py:162 #: ../analysers/analyser_osmosis_tag_typo.py:171 #: ../analysers/analyser_osmosis_tag_typo.py:180 #, python-brace-format msgid "`{0}` is more common than `{1}`, is `{1}` a typo?" -msgstr "" +msgstr "`{0}` är mycket vanligare än `{1}`, är `{1}` ett stavfel?" #: ../plugins/Colour.py:21 msgid "Bad colour name" @@ -5199,7 +5215,7 @@ msgstr "Dåligt färgnamn" #: ../plugins/Colour.py:233 ../plugins/Colour.py:466 ../plugins/Colour.py:671 #, python-brace-format msgid "Unknown or invalid colour in tag ''{0}''" -msgstr "" +msgstr "Okänd eller ogiltig färg i taggen \"{0}\"" #: ../plugins/TagFix_DuplicateValue.py:40 msgid "" @@ -5208,11 +5224,14 @@ msgid "" "Ensure the interpretation of the tag does not change when you delete one " "item." msgstr "" +"I vissa fall kan samtliga värden behövas.\n" +"\n" +"Se till att tolkningen av taggen inte förändras när du tar bort ett värde." #: ../plugins/TagFix_DuplicateValue.py:169 #, python-brace-format msgid "Similar values {v1} and {v2} in {key}={val}" -msgstr "" +msgstr "Liknande värden {v1} och {v2}, i {key}={val}" #: ../analysers/analyser_osmosis_highway_area_access.py:175 msgid "Inconsistent `motor_vehicle` values." @@ -5220,7 +5239,7 @@ msgstr "Inkonsekventa värden för `motor_vehicle`." #: ../analysers/analyser_osmosis_highway_area_access.py:179 msgid "Inconsistent access values between barrier and highway." -msgstr "" +msgstr "Inkonsekventa `access`-värden mellan väghinder och själva vägen." #: ../analysers/analyser_osmosis_highway_area_access.py:181 #: ../analysers/analyser_osmosis_highway_area_access.py:202 @@ -5228,35 +5247,42 @@ msgid "" "Sometimes a barrier can exist on an (otherwise uninterrupted) highway to " "prevent vehicles from using it for purposes other than destination traffic." msgstr "" +"Ibland kan ett väghinder finnas på en (annars obehindrad) väg för att " +"förhindra fordon att använda vägen för tex. genomfart eller andra obehöriga " +"syften." #: ../analysers/analyser_osmosis_highway_area_access.py:183 msgid "Copy the appropriate access tag to the barrier node." -msgstr "" +msgstr "Kopiera lämplig tillträdestagg över till noden för väghindret." #: ../analysers/analyser_osmosis_highway_area_access.py:225 #: ../analysers/analyser_osmosis_highway_area_access.py:230 #, python-brace-format msgid "Inconsistent {0} access: '{1}' on highway, not set on barrier" msgstr "" +"Inkonsekvent tillträde för {0} : vägen angiven som '{1}', ingenting angivet " +"på väghindret" #: ../plugins/notprefix.py:20 ../plugins/notprefix.py:75 #: ../plugins/notprefix.py:132 ../plugins/notprefix.py:187 #, python-brace-format msgid "`{0}` together with `{1}` and equal values" -msgstr "" +msgstr "`{0}` tillsammans med `{1}` och likvärdiga värden" #: ../analysers/analyser_osmosis_relation_cyclic.py:74 msgid "Cyclic relation" -msgstr "" +msgstr "Cyklisk relation" #: ../analysers/analyser_osmosis_relation_cyclic.py:76 msgid "" "A relation whose members (eventually) refer back to itself is rarely correct." msgstr "" +"En relation vars medlemmar (förr eller senare) hänvisar tillbaka till sig " +"själv, är sällan korrekt." #: ../analysers/analyser_osmosis_building_in_polygon.py:69 msgid "Building on agricultural land" -msgstr "" +msgstr "Byggnad på jordbruksmark" #: ../analysers/analyser_osmosis_building_in_polygon.py:71 msgid "" @@ -5264,6 +5290,9 @@ msgid "" "on the farmyard,\n" "not on the farmland where the crops grow." msgstr "" +"Byggnader inom lantbruk (boningshus, ladugård, stall, maskinhall etc...) " +"ligger vanligen inom ett särskilt gårdsområde, inte på själva " +"jordbruksmarken där odling, bete mm bedrivs." #: ../analysers/analyser_osmosis_building_in_polygon.py:74 msgid "" @@ -5276,6 +5305,14 @@ msgid "" "For areas dedicated to greenhouse horticulture, use " "`landuse=greenhouse_horticulture`." msgstr "" +"Ändra eller dela upp landanvändningen, så att lantbruksbyggnader och " +"tillhörande gårdsområde/gårdsplan ligger inom ett område med " +"`landuse=farmyard`, och att bara själva jordbruksmarken anges som " +"`landuse=farmland` (eller en mer specifik typ av odlingsmark, så som " +"`landuse=vineyard` eller `landuse=orchard`).\n" +"\n" +"För områden specialiserade på växthusodling, använd " +"`landuse=greenhouse_horticulture`." #: ../analysers/analyser_osmosis_building_in_polygon.py:88 #, python-brace-format @@ -5288,15 +5325,19 @@ msgid "" "Sometimes very small areas of this type may exist. In this case, please mark " "this issue as a false positive." msgstr "" +"\n" +"Ibland kan väldigt små områden av den här typen finnas och vara befogat. Om " +"det är fallet här, markera felet som en falsk positiv." #: ../analysers/analyser_osmosis_polygon_small.py:72 msgid "Natural area very small" -msgstr "" +msgstr "Naturområde väldigt litet" #: ../analysers/analyser_osmosis_polygon_small.py:74 msgid "" "A natural object of this type is typically larger than the current object." msgstr "" +"En naturlig företeelse av den här typen är normalt större än detta objektet." #: ../analysers/analyser_osmosis_polygon_small.py:76 #: ../analysers/analyser_osmosis_polygon_small.py:83 @@ -5304,6 +5345,8 @@ msgid "" "A single tree should be tagged as `natural=tree` rather than " "`landuse=forest` or `natural=wood`." msgstr "" +"Ett enskilt träd bör taggas som `natural=tree`, snarare än som " +"`landuse=forest` eller `natural=wood`." #: ../analysers/analyser_osmosis_polygon_small.py:79 #: ../analysers/analyser_osmosis_polygon_small.py:97 @@ -5315,6 +5358,7 @@ msgstr "Landanvändning väldigt liten" #: ../analysers/analyser_osmosis_polygon_small.py:99 msgid "Landuses of this type are typically larger than the current object." msgstr "" +"Landanvändning av den här typen är normalt större än det aktuella objektet." #: ../analysers/analyser_osmosis_polygon_small.py:86 msgid "Small farm" @@ -5330,6 +5374,13 @@ msgid "" "- `{0}`\n" "- etcetera." msgstr "" +"Lantbruksmark som används för bete, ladugårdar, växthus etc. bör inte taggas " +"som`landuse=farmland`.\n" +"Taggen `landuse=farmland` är menad för åkermark/odlingsmark, där grödor " +"odlas.\n" +"Annan landanvändning skulle kunna taggas med:\n" +"- `{0}`\n" +"- och så vidare." #: ../analysers/analyser_osmosis_polygon_small.py:101 #, python-brace-format @@ -5342,7 +5393,7 @@ msgstr "" #: ../analysers/analyser_osmosis_polygon_small.py:136 #, python-brace-format msgid "{0} with an area of {1} m2" -msgstr "" +msgstr "{0} med en yta på {1} m2" #: ../plugins/Highway_Parking_Lane.py:42 ../plugins/Highway_Parking_Lane.py:49 #: ../plugins/Highway_Parking_Lane.py:53 ../plugins/Highway_Parking_Lane.py:60 @@ -5352,15 +5403,19 @@ msgid "" "Consider switching to the new [street parking tagging scheme](\"https://wiki." "openstreetmap.org/wiki/Street_parking)." msgstr "" +"Överväg att byta till det nya [taggnings-schemat för gatuparkering](\"https" +"://wiki.openstreetmap.org/wiki/Street_parking)." #: ../plugins/Highway_Parking_Lane.py:91 msgid "Bad parking:[side]" -msgstr "" +msgstr "Felaktig parking:[side]" #: ../plugins/Highway_Parking_Lane.py:93 msgid "" "The side was not recognized, expected was either `left`, `right` or `both`." msgstr "" +"Angiven sida känns inte igen, förväntade värden är `left`, `right` eller " +"`both`." #: ../plugins/Highway_Parking_Lane.py:95 msgid "Use `parking:left`, `parking:right` or `parking:both`." From 985dab441c9aa658383c201a3a3ef72f69969a08 Mon Sep 17 00:00:00 2001 From: Jacob Date: Wed, 27 Aug 2025 00:25:25 +0200 Subject: [PATCH 02/13] Translated using Weblate (Swedish) Currently translated at 47.3% (551 of 1163 strings) Translation: Osmose/backend Translate-URL: https://hosted.weblate.org/projects/osmose/backend/sv/ --- po/sv.po | 73 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 11 deletions(-) diff --git a/po/sv.po b/po/sv.po index 446e5a577..c239eb059 100644 --- a/po/sv.po +++ b/po/sv.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-04-28 19:47+0200\n" -"PO-Revision-Date: 2025-08-25 22:01+0000\n" +"PO-Revision-Date: 2025-08-26 23:02+0000\n" "Last-Translator: Jacob \n" "Language-Team: Swedish \n" @@ -5428,16 +5428,21 @@ msgid "" "you should use `parking:both:maxstay=2 hours`, and not `parking:maxstay=2 " "hours`." msgstr "" +"För att ange att det inte går att parkera på gatan mer än 2 timmar (för båda " +"sidor), använd `parking:both:maxstay=2 hours`, och inte `parking:maxstay=2 " +"hours`." #: ../plugins/Highway_Parking_Lane.py:101 msgid "parking:[side]:* without parking:[side] value" -msgstr "" +msgstr "parking:[side]:* utan parking:[side]" #: ../plugins/Highway_Parking_Lane.py:103 msgid "" "A parking tag adding details, such as `parking:[side]:fee`, is present " "without primary `parking:[side]` key." msgstr "" +"En parkeringstagg med fler detaljer, t.ex. `parking:[side]:fee`, finns utan " +"att den primära taggen `parking:[side]` har angivits." #: ../plugins/Highway_Parking_Lane.py:107 msgid "" @@ -5447,6 +5452,10 @@ msgid "" "However, `parking:both` already covers both sides of a street, so the latter " "are redundant." msgstr "" +"Taggen `parking:both` (möjligen med suffix, som `:maxstay`) används " +"tillsammans med `parking:left`och/eller `parking:right` (med samma suffix).\n" +"Dock så täcker `parking:both` redan båda sidor av gatan, så taggar för " +"specifika sidor är överflödiga." #: ../plugins/Highway_Parking_Lane.py:111 msgid "Bad value for parking:[side]=*" @@ -5481,6 +5490,8 @@ msgstr "" #: ../plugins/TagWatchFrViPofm.py:71 msgid "Simple and frequent errors, can be updated by anyone on the wiki." msgstr "" +"Enkla och ofta förekommande fel kan läggas till och uppdateras av vem som " +"helst på wikin." #: ../plugins/TagFix_MultipleTag2.py:25 ../plugins/TagFix_MultipleTag2.py:60 #: ../plugins/TagFix_MultipleTag2.py:294 ../plugins/TagFix_MultipleTag2.py:604 @@ -5489,6 +5500,8 @@ msgid "" "{0} together with {1}, usually {1} is located underneath the {2}. Tag the " "{3} as a separate object." msgstr "" +"{0} tillsammans med {1}, vanligtvis är {1} lokaliserad under {2}. Tagga {3} " +"som ett separat objekt." #: ../plugins/indoor.py:24 ../plugins/indoor.py:67 ../plugins/indoor.py:172 #: ../plugins/indoor.py:218 @@ -5512,13 +5525,15 @@ msgstr "" #: ../plugins/Colour.py:387 ../plugins/Colour.py:537 ../plugins/Colour.py:603 #, python-brace-format msgid "{0} colour code should start with '#' followed by 3 or 6 hex digits" -msgstr "" +msgstr "{0} färgkod borde starta med '#' följt av 3 eller 6 hexadecimal-tecken" #: ../plugins/TagFix_MultipleTag2.py:34 msgid "" "Missing `maxheight=*` or `maxheight:physical=*` for a tunnel or a way under " "a bridge." msgstr "" +"En tunnel eller väg under bro saknar `maxheight=*` eller " +"`maxheight:physical=*`." #: ../plugins/TagFix_MultipleTag2.py:36 msgid "suspicious tag combination" @@ -5531,13 +5546,15 @@ msgstr "" #: ../analysers/analyser_osmosis_highway_area_access.py:185 msgid "Barrier blocking major highway" -msgstr "" +msgstr "Hinder blockerar större väg" #: ../analysers/analyser_osmosis_highway_area_access.py:187 msgid "" "A barrier is blocking a major highway. Typically, major highways (`tertiary` " "and above) are meant for passing traffic." msgstr "" +"Ett väghinder blockerar en större väg. Vanligtvis är större vägar (`tertiary`" +" och uppåt) avsedda för obehindrad trafik." #: ../analysers/analyser_osmosis_highway_area_access.py:189 msgid "" @@ -5548,6 +5565,12 @@ msgid "" "If there is a barrier, check if it has the appropriate (conditional) access " "keys." msgstr "" +"Kontrollera om det faktiskt finns ett hinder på den större vägen (och inte " +"t.ex. på enbart en anslutande mindre väg).\n" +"Om det inte finns ett hinder, ta bort det, eller flytta hindret till den " +"lämpliga anslutande vägen.\n" +"Om det faktiskt är ett hinder på den större vägen, se till att det har " +"korrekta (villkorliga) tillträdestaggar." #: ../analysers/analyser_osmosis_highway_area_access.py:196 msgid "Barrier blocking highway" @@ -5560,6 +5583,10 @@ msgid "" "In the current situation, traffic coming from any direction has to go " "through the barrier, to reach any of the destination ways." msgstr "" +"Ett hinder blockerar själva korsningen mellan flera vägar. Antagligen är " +"hindret menat att bara vara på en av vägarna. I nuvarande läge måste trafik " +"från samtliga vägar in i korsningen passera hindret oavsett vilken väg ut ur " +"korsningen trafiken ska ta." #: ../analysers/analyser_osmosis_highway_area_access.py:204 msgid "" @@ -5570,6 +5597,12 @@ msgid "" "If there is a barrier, check if it has the appropriate (conditional) access " "keys." msgstr "" +"Kontrollera om det faktiskt finns ett väghinder i själva korsningen (och " +"inte t.ex. på enbart en anslutande väg).\n" +"Om det inte finns ett hinder, ta bort det, eller flytta hindret till den " +"lämpliga anslutande vägen.\n" +"Om det faktiskt är ett hinder i korsningen, se till att det har lämpliga " +"(villkorliga) tillträdestaggar." #: ../analysers/analyser_osmosis_highway_area_access.py:192 msgid "" @@ -5597,7 +5630,7 @@ msgstr "" #: ../analysers/analyser_osmosis_parking_highway.py:120 msgid "Inconsistent access of parking" -msgstr "" +msgstr "Motstridiga tillträden för parkering" #: ../analysers/analyser_osmosis_parking_highway.py:121 msgid "" @@ -5606,21 +5639,27 @@ msgid "" "As a result, this public parking space can only be reached via limited-" "access roads." msgstr "" +"`access`-taggen för parkeringen stämmer inte med `access`-taggen för vägarna " +"till eller inom parkeringen.\n" +"Därmed kan denna allmänna parkering bara nås via vägar med begränsande " +"restriktioner." #: ../analysers/analyser_osmosis_parking_highway.py:123 msgid "" "Check which access restrictions are correct and apply them accordingly to " "the highways and the parking." msgstr "" +"Undersök vilka tillträdesrestriktioner som är korrekta, och tillämpa dem " +"likvärdigt på vägen och parkeringen." #: ../analysers/analyser_osmosis_parking_highway.py:124 msgid "A parking may be partially publicly accessible and partially private." -msgstr "" +msgstr "En parkering kan vara delvis allmänt tillgänglig och delvis privat." #: ../analysers/analyser_osmosis_parking_highway.py:137 #, python-brace-format msgid "highway: `access={0}` - parking: `access={1}`" -msgstr "" +msgstr "väg: `access={0}` - parkering: `access={1}`" #: ../analysers/analyser_osmosis_polygon_intersects.py:229 #, python-brace-format @@ -5637,22 +5676,27 @@ msgid "" "`tunnel=*` or\n" "`bridge=*` where appropriate, together with `layer=*` if needed." msgstr "" +"Om sträckan för transportering (t.ex. en väg) har exvis. en skog på endera " +"sidan av vägen, klipp bort vägens form från skogspolygonen.\n" +"Däremot, om sträckan för transportering är en tunnel eller en bro, lägg till " +"`tunnel=*` eller `bridge=*` där det är lämpligt, tillsammans med `layer=*` " +"om det behövs." #: ../analysers/analyser_osmosis_polygon_intersects.py:208 msgid "Bad intersection with major highway" -msgstr "" +msgstr "Felaktig överlappning med större väg" #: ../analysers/analyser_osmosis_polygon_intersects.py:212 msgid "Bad intersection with railway" -msgstr "" +msgstr "Felaktig överlappning med järnväg" #: ../analysers/analyser_osmosis_polygon_intersects.py:216 msgid "Bad intersection with aeroway" -msgstr "" +msgstr "Felaktig överlappning med landningsbana" #: ../analysers/analyser_osmosis_highway_vs_building.py:475 msgid "Commercial object or office and highway too close" -msgstr "" +msgstr "Kommersiellt objekt eller kontor för nära väg" #: ../analysers/analyser_osmosis_polygon_intersects.py:193 msgid "" @@ -5660,6 +5704,8 @@ msgid "" "a\n" "land coverage that would pose an obstacle for this transportation mode." msgstr "" +"En väg menad för transport (som en bilväg eller järnväg) överlappar med ett " +"marktäcke som skulle utgöra ett hinder för det aktuella transportslaget." #: ../analysers/analyser_osmosis_polygon_intersects.py:196 msgid "" @@ -5670,6 +5716,11 @@ msgid "" "`natural=water`,\n" "without bridge or tunnel." msgstr "" +"En stor betydande väg har vanligtvis inga träd som växer på eller väldigt " +"nära den, så en överlappning mellan `landuse=forest` och `highway=trunk` är " +"inte trolig.\n" +"Samma säk gäller för t.ex. en järnväg över ett område med `natural=water`, " +"utan en bro eller tunnel." #: ../plugins/Colour.py:21 msgid "" From 49dc2ce4f82b8667dbcb0f53c78a2211176f5610 Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 28 Aug 2025 01:28:46 +0200 Subject: [PATCH 03/13] Translated using Weblate (Swedish) Currently translated at 48.3% (562 of 1163 strings) Translation: Osmose/backend Translate-URL: https://hosted.weblate.org/projects/osmose/backend/sv/ --- po/sv.po | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/po/sv.po b/po/sv.po index c239eb059..06ec62987 100644 --- a/po/sv.po +++ b/po/sv.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-04-28 19:47+0200\n" -"PO-Revision-Date: 2025-08-26 23:02+0000\n" +"PO-Revision-Date: 2025-08-28 01:02+0000\n" "Last-Translator: Jacob \n" "Language-Team: Swedish \n" @@ -5728,12 +5728,18 @@ msgid "" "spelled in lowercase letters and without dashes. Multiple colours can be " "separated by a semicolon." msgstr "" +"Namn på färger bör vara en av de som anges i CSS-specifikationen, och " +"skrivas med små bokstäver och utan bindestreck. Flera färger kan skrivas " +"separerade med semikolon." #: ../plugins/TagFix_Tree_Lang_fr.py:70 msgid "" "To characterize the trees `natural=tree`, there are two main tags:\n" "`genus` and `species`." msgstr "" +"För att specificera typ av träd `natural=tree`, finns det två huvudsakliga " +"taggar:\n" +"`genus` och `species`." #: ../analysers/analyser_merge_bridge_ES.py:31 msgid "Bridge not integrated" @@ -5753,11 +5759,13 @@ msgstr "" #: ../analysers/analyser_osmosis_polygon_small.py:105 msgid "Leisure very small" -msgstr "" +msgstr "`leisure`-objekt väldigt litet" #: ../analysers/analyser_osmosis_polygon_small.py:107 msgid "Leisures of this type are typically larger than the current object." msgstr "" +"Fritidsobjekt (`leisure=*`) av den här typen är normalt större än det " +"aktuella objektet." #: ../analysers/analyser_osmosis_polygon_small.py:109 #, python-brace-format @@ -5770,23 +5778,25 @@ msgstr "" #: ../plugins/ConditionalRestrictions.py:71 msgid "Repeated condition in conditional restriction" -msgstr "" +msgstr "Upprepat villkor i en villkorlig restriktion" #: ../plugins/ConditionalRestrictions.py:72 msgid "" "Two different values are set to apply under the same condition or a " "condition is repeated. The first value is overruled by the second value." msgstr "" +"Två olika värden är angivna för samma typ av villkor, eller samma villkor " +"upprepas. Det första värdet åsidosätts av det andra värdet." #: ../plugins/ConditionalRestrictions.py:175 #, python-brace-format msgid "Repeated condition `{0}` in `{1}`" -msgstr "" +msgstr "Upprepat villkor `{0}` i `{1}`" #: ../plugins/ConditionalRestrictions.py:194 #, python-brace-format msgid "Repeated condition `{0}` in `{1}` (in tag `{2}`)" -msgstr "" +msgstr "Upprepat villkor `{0}` i `{1}` (i taggen `{2}`)" #: ../analysers/analyser_osmosis_highway_long_crossing.py:64 msgid "Long crossing" @@ -5794,7 +5804,7 @@ msgstr "Långt övergångsställe" #: ../analysers/analyser_osmosis_highway_long_crossing.py:66 msgid "The crossing way is much longer than usual." -msgstr "" +msgstr "Sträckan för övergången/passagen är mycket längre än normalt." #: ../analysers/analyser_osmosis_highway_long_crossing.py:68 msgid "" @@ -5802,11 +5812,15 @@ msgid "" "Remove crossing-related tags (such as `*=crossing`, `ford=*`) from the " "fragment that isn't a crossing." msgstr "" +"Dela sträckan vid de punkter där övergången/passagen inte längre går över " +"korsande väg eller vattendrag.\n" +"Från de segment som inte utgör själva övergången; ta bort de taggar som " +"relaterar till övergångsställe/passage (som ex. `*=crossing`, `ford=*`)." #: ../analysers/analyser_osmosis_highway_long_crossing.py:73 #, python-brace-format msgid "Highway or waterway crossing of {0}m" -msgstr "" +msgstr "Övergång på {0}m över väg eller vattendrag" #: ../analysers/analyser_osmosis_way_angle.py:90 msgid "Suspicious angle in way" From 26e01cdd481c5469561e532ab159460b90a553fd Mon Sep 17 00:00:00 2001 From: Jacob Date: Thu, 28 Aug 2025 21:55:07 +0200 Subject: [PATCH 04/13] Translated using Weblate (Swedish) Currently translated at 50.0% (582 of 1163 strings) Translation: Osmose/backend Translate-URL: https://hosted.weblate.org/projects/osmose/backend/sv/ --- po/sv.po | 59 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/po/sv.po b/po/sv.po index 06ec62987..0c67f7639 100644 --- a/po/sv.po +++ b/po/sv.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-04-28 19:47+0200\n" -"PO-Revision-Date: 2025-08-28 01:02+0000\n" +"PO-Revision-Date: 2025-08-29 02:01+0000\n" "Last-Translator: Jacob \n" "Language-Team: Swedish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.13\n" +"X-Generator: Weblate 5.13.1-dev\n" #: ../analysers/analyser_merge_college_FR.py:31 msgid "College not integrated" @@ -5824,13 +5824,15 @@ msgstr "Övergång på {0}m över väg eller vattendrag" #: ../analysers/analyser_osmosis_way_angle.py:90 msgid "Suspicious angle in way" -msgstr "Misstänkt vinkel på väg" +msgstr "Misstänkt vinkel på järnväg" #: ../analysers/analyser_osmosis_way_angle.py:92 msgid "" "Sharp angles on a railway are suspicious. Maybe a node was accidentally " "dragged?" msgstr "" +"Skarpa vinklar på en järnväg/spårväg är misstänkt då det blir för snäva " +"kurvor. Kanske har en nod flyttats av misstag?" #: ../analysers/analyser_osmosis_way_angle.py:96 #: ../analysers/analyser_osmosis_way_approximate.py:174 @@ -5838,11 +5840,13 @@ msgid "" "On service ways, train stations and train workshops this could be a false " "positive." msgstr "" +"Vid tågstationer, vagnhallar, servicespår och liknande kan detta vara en " +"falsk positiv." #: ../analysers/analyser_osmosis_way_angle.py:103 #, python-brace-format msgid "railway={0} with suspicious angle {1}°" -msgstr "" +msgstr "railway={0} med misstänkt vinkel {1}°" #: ../plugins/ConditionalRestrictions.py:73 msgid "" @@ -5891,6 +5895,12 @@ msgid "" "Warning: information sources can be contradictory in time or with spatial " "offset." msgstr "" +"Ett objekt kanske saknar en tagg, exvis. `tunnel=*`, `bridge=*`, `covered=*` " +"eller `ford=*`.\n" +"Om en väg eller järnväg korsar en byggnad, kolla om taggen `layer=*` kan " +"vara relevant. \n" +"OBS: olika informationskällor kan vara motstridiga över tid eller vara " +"förskjuta geografiskt." #: ../plugins/Administrative_INSEE_Name.py:48 msgid "" @@ -5911,17 +5921,19 @@ msgid "" "You can not simultaneously set a tag and the variants with\n" "`forward`, `backward` or `both_ways` suffixes." msgstr "" +"En kan kan inte ange en tagg samtidigt som samma tagg med `forward`, " +"`backward` eller `both_ways` suffix." #: ../plugins/TagFix_MultipleTag2.py:141 ../plugins/TagFix_MultipleTag2.py:480 #: ../plugins/TagFix_MultipleTag2.py:682 #, python-brace-format msgid "Conflict between tags: `{0}` and `{1}`" -msgstr "" +msgstr "Konflikt mellan taggar: `{0}` och `{1}`" #: ../plugins/TagFix_MultipleTag2.py:160 #, python-brace-format msgid "Conflict between tags: `{1}` must be used without `{0}`" -msgstr "" +msgstr "Konflikt mellan taggar: `{1}` måste användas utan `{0}`" #: ../plugins/TagFix_MultipleTag2.py:179 ../plugins/TagFix_MultipleTag2.py:496 #: ../plugins/TagFix_MultipleTag2.py:698 @@ -5930,6 +5942,8 @@ msgid "" "{0} together with {1}. A picnic site rarely consists of only one single " "picnic table" msgstr "" +"{0} tillsammans med {1}. En ordnad picnicplats (`picnic_site`) består sällan " +"av endast ett picnicbord" #: ../plugins/TagFix_MultipleTag2.py:512 #, python-brace-format @@ -6020,6 +6034,8 @@ msgid "" "The relation contains the same member (with the same role) more than once. " "This is not expected for this type of relations." msgstr "" +"Relationen innehåller samma medlem, i samma roll, mer än en gång. Det är " +"inte förväntat för denna typ av relation." #: ../analysers/analyser_osmosis_relation_duplicate_member.py:66 msgid "Remove the duplicate members until only unique members remain." @@ -6037,16 +6053,24 @@ msgid "" "If you are sure that the route should follow this way, consider adding `{0}" "=yes`." msgstr "" +"Kontrollera om leden/rutten faktiskt ska nyttja den här vägen.\n" +"Om inte, flytta rutten så att den följer den designerade sträckningen. Detta " +"kan innebära att flytta rutten till en separat karterad parallell väg.\n" +"\n" +"Om du är säker på att rutten ska följa den här vägen, överväg att lägga till " +"`{0}=yes` på vägen." #: ../plugins/ConditionalRestrictions.py:80 msgid "Equal conditional and unconditional tag value" -msgstr "" +msgstr "Likvärdigt villkorat och ovillkorat tagg-värde" #: ../plugins/ConditionalRestrictions.py:81 msgid "" "The conditional tag has the same value as the same tag without the " "conditional restriction." msgstr "" +"Den villkorade taggen har samma värde som samma tagg utan villkorade " +"restriktioner." #: ../plugins/ConditionalRestrictions.py:82 msgid "" @@ -6054,26 +6078,31 @@ msgid "" "conditional`.\n" "Otherwise, remove the tag without `:conditional`." msgstr "" +"Kontrollera om värdet är det som alltid gäller oavsett förhållanden. Om så " +"är fallet, ta bort taggen med `:conditional`.\n" +"Om inte, ta bort taggen utan `:conditional`." #: ../plugins/ConditionalRestrictions.py:84 msgid "" "`bicycle=yes` together with `bicycle:conditional = yes @ (12:00-24:00)` " "means the same as just `bicycle=yes`." msgstr "" +"`bicycle=yes` tillsammans med `bicycle:conditional = yes @ (12:00-24:00)` " +"betyder samma sak som bara `bicycle=yes`." #: ../plugins/ConditionalRestrictions.py:224 #, python-brace-format msgid "Tag `{0}` has the same value as `{1}`, without restrictions" -msgstr "" +msgstr "Taggen `{0}` har samma värde som `{1}`, utan restriktioner" #: ../plugins/Highway_Lanes.py:258 ../plugins/Highway_Lanes.py:265 #, python-brace-format msgid "{0}={1} is not a positive integer" -msgstr "" +msgstr "{0}={1} är inte ett positivt heltal" #: ../plugins/Structural_Multipolygon.py:39 msgid "Missing outer way with role `outer` for multipolygon" -msgstr "" +msgstr "Saknas sträcka med rollen `outer` att utgöra yttre ring i multipolygon" #: ../plugins/Structural_Multipolygon.py:43 msgid "" @@ -6081,12 +6110,17 @@ msgid "" "outer ways are also possible as long as they form one or more closed rings.\n" "The previous outer way may have been deleted, check the history." msgstr "" +"Hitta sträckan som utgör yttre ring, och lägg till den i relationen med roll " +"`outer`. Flera sträckor kan gemensamt utgöra yttre ring så länge som de " +"bildar en eller flera slutna ringar.\n" +"En redan angiven yttre ring kan ha blivit borttagen från relationen, kolla " +"historiken." #: ../plugins/TagFix_MultipleTag2.py:32 ../plugins/TagFix_MultipleTag2.py:216 #: ../plugins/TagFix_MultipleTag2.py:545 ../plugins/TagFix_MultipleTag2.py:731 #, python-brace-format msgid "{0} with {1}, likely this is a single pitch instead" -msgstr "" +msgstr "{0} med {1}, troligen är detta en enskild ställplats/tältplats istället" #: ../plugins/TagFix_MultipleTag2.py:32 msgid "" @@ -6094,6 +6128,9 @@ msgid "" "common for a single pitch (`tourism=camp_pitch`) within a camping site. " "Possibly the two were interchanged?" msgstr "" +"Campingplatsen (`tourism=camp_site`) har ett namn med siffror. Nummer är " +"mycket vanligare som referens till en enskild tältplats/ställplats " +"(`tourism=camp_pitch`) inom en campingplats. Möjligen har de två förväxlats?" #: ../plugins/TagFix_MultipleTag2.py:35 ../plugins/TagFix_MultipleTag2.py:193 #: ../plugins/TagFix_MultipleTag2.py:524 ../plugins/TagFix_MultipleTag2.py:710 From d0d14bf2f0a157e04695b9905a049055def09b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Fri, 29 Aug 2025 09:29:32 +0200 Subject: [PATCH 05/13] Translated using Weblate (French) Currently translated at 77.8% (905 of 1163 strings) Translation: Osmose/backend Translate-URL: https://hosted.weblate.org/projects/osmose/backend/fr/ --- po/fr.po | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/po/fr.po b/po/fr.po index 89d35a30d..369b886ad 100644 --- a/po/fr.po +++ b/po/fr.po @@ -63,8 +63,8 @@ msgstr "" "Project-Id-Version: Osmose\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-04-28 19:47+0200\n" -"PO-Revision-Date: 2025-07-15 03:38+0000\n" -"Last-Translator: Florian Stosse \n" +"PO-Revision-Date: 2025-08-30 03:01+0000\n" +"Last-Translator: Corentin Noël \n" "Language-Team: French \n" "Language: fr\n" @@ -73,7 +73,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % " "1000000 == 0 ? 1 : 2;\n" -"X-Generator: Weblate 5.13-dev\n" +"X-Generator: Weblate 5.13.1-dev\n" #: ../analysers/analyser_merge_college_FR.py:31 msgid "College not integrated" @@ -3918,6 +3918,8 @@ msgid "" "Chemist shops (\"parapharmacie\" in French) do not fall into this\n" "classification. They do not have a specific tag for the moment." msgstr "" +"Les parapharmacies ne rentrent pas dans cette catégorie.\n" +"Elles n'ont pas d'attribut spécifique pour le moment." #: ../plugins/Highway_Parking_Lane.py:39 msgid "" From 79b435192b1e1c32a0058a153ebce86906757a66 Mon Sep 17 00:00:00 2001 From: Jacob Date: Fri, 29 Aug 2025 05:08:23 +0200 Subject: [PATCH 06/13] Translated using Weblate (Swedish) Currently translated at 50.2% (584 of 1163 strings) Translation: Osmose/backend Translate-URL: https://hosted.weblate.org/projects/osmose/backend/sv/ --- po/sv.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/po/sv.po b/po/sv.po index 0c67f7639..a3f9ab91d 100644 --- a/po/sv.po +++ b/po/sv.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-04-28 19:47+0200\n" -"PO-Revision-Date: 2025-08-29 02:01+0000\n" +"PO-Revision-Date: 2025-08-30 03:01+0000\n" "Last-Translator: Jacob \n" "Language-Team: Swedish \n" @@ -6136,12 +6136,12 @@ msgstr "" #: ../plugins/TagFix_MultipleTag2.py:524 ../plugins/TagFix_MultipleTag2.py:710 #, python-brace-format msgid "Fence with {0} tag, also add {1}" -msgstr "" +msgstr "Stängsel med {0} tagg, lägg också till {1}" #: ../plugins/TagFix_Opening_Hours.py:69 #, python-brace-format msgid "The `{0}` value is invalid and could not be parsed" -msgstr "" +msgstr "Värdet `{0}` är ogiltigt och kunde inte tolkas" #: ../analysers/analyser_merge_forest_compartment_FR.py:33 msgid "Forest compartment not integrated" From 3745a341c21b9adc640c9c9db25f75f6c1f07475 Mon Sep 17 00:00:00 2001 From: Famlam Date: Sat, 30 Aug 2025 16:52:16 +0200 Subject: [PATCH 07/13] Add unclosed area way mapcss rules --- plugins/Structural.validator.mapcss | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 plugins/Structural.validator.mapcss diff --git a/plugins/Structural.validator.mapcss b/plugins/Structural.validator.mapcss new file mode 100644 index 000000000..b38c2d0ce --- /dev/null +++ b/plugins/Structural.validator.mapcss @@ -0,0 +1,59 @@ +/*######################################################################### +## ## +## Copyrights Osmose project ## +## ## +## This program is free software: you can redistribute it and/or modify ## +## it under the terms of the GNU General Public License as published by ## +## the Free Software Foundation, either version 3 of the License, or ## +## (at your option) any later version. ## +## ## +## This program is distributed in the hope that it will be useful, ## +## but WITHOUT ANY WARRANTY; without even the implied warranty of ## +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## +## GNU General Public License for more details. ## +## ## +## You should have received a copy of the GNU General Public License ## +## along with this program. If not, see . ## +## ## +#########################################################################*/ + +meta { + title: "Osmose-QA – geometry validation rules"; + description: "Validates geometric mistakes"; + author: "Osmose"; + min-josm-version: 14481; +} + +way[amenity ]!:closed[!area][amenity!~/^(bench|bicycle_parking|hitching_post|ticket_validator|weighbridge)$/], +way[area ]!:closed[area!=no], +way[area:highway ]!:closed, +way[building:part]!:closed[!area], +way[building ]!:closed, +way[club ]!:closed[!area], +way[craft ]!:closed[!area], +way[emergency ]!:closed[!area][emergency!~/^(yes|designated|permissive)$/][!highway], +way[healthcare ]!:closed[!area], +way[landcover ]!:closed, +way[landuse ]!:closed, +way[leisure ]!:closed[!area][leisure!~/^(barefoot|bathing_place|slipway|track)$/], +way[military ]!:closed[!area][military!~/^(obstacle_course|road|trench)$/][!highway], +way[natural ]!:closed[!area][natural=~/^(bare_rock|bay|beach|fell|glacier|grassland|heath|hot_spring|moor|mud|rock|sand|scree|scrub|shingle|sinkhole|stone|water|wetland|wood)$/][bay!=fjord], +way[office ]!:closed[!area], +way[place ]!:closed, +way[shop ]!:closed[!area], +way[tourism ]!:closed[!area][tourism!~/^(artwork|attraction|yes)$/], +way[waterway ]!:closed[!area][waterway=~/^(boatyard|dock|fuel|riverbank)$/] { + throwError: tr("Unclosed way with {0}", "{0.tag}"); + group: tr("Should be polygon, part of multipolygon or not having area tag"); + + assertNoMatch: "way tourism=xyz area=no"; + assertNoMatch: "way emergency=designated"; + assertNoMatch: "way oneway=no"; + + -osmoseItemClassLevel: "1170/4/1"; + -osmoseTags: list("geom", "fix:imagery", "fix:chair"); + -osmoseDetail: tr("A way has a tag that suggests it is an area, but the way is not closed."); + -osmoseFix: tr("Make sure the first and last node of the way are connected, such that it forms a closed way. If the way is not an area, add `area=no` or correct the tags."); + -osmoseTrap: tr("Use a multipolygon relation instead of a way if a closed way cannot be formed to represent the area. In this case, remove the area-related tags from the way."); + -osmoseExample: "![](https://wiki.openstreetmap.org/w/images/c/cc/Osmose-eg-error-1100.png)"; +} From f8e6cf4b41a0af44ef2f429d55cf1c40699bcb4a Mon Sep 17 00:00:00 2001 From: Famlam Date: Sat, 30 Aug 2025 16:52:34 +0200 Subject: [PATCH 08/13] Generate mapcss python code --- plugins/Structural.py | 167 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 plugins/Structural.py diff --git a/plugins/Structural.py b/plugins/Structural.py new file mode 100644 index 000000000..5e1c979a6 --- /dev/null +++ b/plugins/Structural.py @@ -0,0 +1,167 @@ +#-*- coding: utf-8 -*- +import modules.mapcss_lib as mapcss +import regex as re # noqa + +from plugins.Plugin import with_options # noqa +from plugins.PluginMapCSS import PluginMapCSS + + +class Structural(PluginMapCSS): + # ------------------------------- IMPORTANT ------------------------------- + # This file is generated automatically and should not be modified directly. + # Instead, modify the source mapcss file and regenerate this Python script. + # ------------------------------------------------------------------------- + + + + def init(self, logger): + super().init(logger) + tags = capture_tags = {} # noqa + self.errors[4] = self.def_class(item = 1170, level = 1, tags = mapcss.list_('geom', 'fix:imagery', 'fix:chair'), title = mapcss.tr('Should be polygon, part of multipolygon or not having area tag'), detail = mapcss.tr('A way has a tag that suggests it is an area, but the way is not closed.'), fix = mapcss.tr('Make sure the first and last node of the way are connected, such that it forms a closed way. If the way is not an area, add `area=no` or correct the tags.'), trap = mapcss.tr('Use a multipolygon relation instead of a way if a closed way cannot be formed to represent the area. In this case, remove the area-related tags from the way.'), example = {"en": '![](https://wiki.openstreetmap.org/w/images/c/cc/Osmose-eg-error-1100.png)'}) + + self.re_2d687399 = re.compile(r'^(barefoot|bathing_place|slipway|track)$') + self.re_342e1a01 = re.compile(r'^(yes|designated|permissive)$') + self.re_3977796a = re.compile(r'^(bench|bicycle_parking|hitching_post|ticket_validator|weighbridge)$') + self.re_3ad8d56a = re.compile(r'^(bare_rock|bay|beach|fell|glacier|grassland|heath|hot_spring|moor|mud|rock|sand|scree|scrub|shingle|sinkhole|stone|water|wetland|wood)$') + self.re_3dd10aca = re.compile(r'^(obstacle_course|road|trench)$') + self.re_50f04966 = re.compile(r'^(artwork|attraction|yes)$') + self.re_7d3259ea = re.compile(r'^(boatyard|dock|fuel|riverbank)$') + + + def way(self, data, tags, nds): + capture_tags = {} + keys = tags.keys() + err = [] + + + # way[amenity]!:closed[!area][amenity!~/^(bench|bicycle_parking|hitching_post|ticket_validator|weighbridge)$/] + # way[area]!:closed[area!=no] + # way[area:highway]!:closed + # way[building:part]!:closed[!area] + # way[building]!:closed + # way[club]!:closed[!area] + # way[craft]!:closed[!area] + # way[emergency]!:closed[!area][emergency!~/^(yes|designated|permissive)$/][!highway] + # way[healthcare]!:closed[!area] + # way[landcover]!:closed + # way[landuse]!:closed + # way[leisure]!:closed[!area][leisure!~/^(barefoot|bathing_place|slipway|track)$/] + # way[military]!:closed[!area][military!~/^(obstacle_course|road|trench)$/][!highway] + # way[natural]!:closed[!area][natural=~/^(bare_rock|bay|beach|fell|glacier|grassland|heath|hot_spring|moor|mud|rock|sand|scree|scrub|shingle|sinkhole|stone|water|wetland|wood)$/][bay!=fjord] + # way[office]!:closed[!area] + # way[place]!:closed + # way[shop]!:closed[!area] + # way[tourism]!:closed[!area][tourism!~/^(artwork|attraction|yes)$/] + # way[waterway]!:closed[!area][waterway=~/^(boatyard|dock|fuel|riverbank)$/] + if ('amenity' in keys) or ('area' in keys) or ('area:highway' in keys) or ('building' in keys) or ('building:part' in keys) or ('club' in keys) or ('craft' in keys) or ('emergency' in keys) or ('healthcare' in keys) or ('landcover' in keys) or ('landuse' in keys) or ('leisure' in keys) or ('military' in keys) or ('natural' in keys) or ('office' in keys) or ('place' in keys) or ('shop' in keys) or ('tourism' in keys) or ('waterway' in keys): + match = False + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'amenity')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (not mapcss.regexp_test(mapcss._value_const_capture(capture_tags, 3, self.re_3977796a, '^(bench|bicycle_parking|hitching_post|ticket_validator|weighbridge)$'), mapcss._tag_capture(capture_tags, 3, tags, 'amenity'))) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'area')) and (mapcss._tag_capture(capture_tags, 2, tags, 'area') != mapcss._value_const_capture(capture_tags, 2, 'no', 'no')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'area:highway')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'building:part')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'building')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'club')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'craft')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'emergency')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (not mapcss.regexp_test(mapcss._value_const_capture(capture_tags, 3, self.re_342e1a01, '^(yes|designated|permissive)$'), mapcss._tag_capture(capture_tags, 3, tags, 'emergency'))) and (not mapcss._tag_capture(capture_tags, 4, tags, 'highway')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'healthcare')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'landcover')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'landuse')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'leisure')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (not mapcss.regexp_test(mapcss._value_const_capture(capture_tags, 3, self.re_2d687399, '^(barefoot|bathing_place|slipway|track)$'), mapcss._tag_capture(capture_tags, 3, tags, 'leisure'))) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'military')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (not mapcss.regexp_test(mapcss._value_const_capture(capture_tags, 3, self.re_3dd10aca, '^(obstacle_course|road|trench)$'), mapcss._tag_capture(capture_tags, 3, tags, 'military'))) and (not mapcss._tag_capture(capture_tags, 4, tags, 'highway')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'natural')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (mapcss.regexp_test(mapcss._value_capture(capture_tags, 3, self.re_3ad8d56a), mapcss._tag_capture(capture_tags, 3, tags, 'natural'))) and (mapcss._tag_capture(capture_tags, 4, tags, 'bay') != mapcss._value_const_capture(capture_tags, 4, 'fjord', 'fjord')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'office')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'place')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'shop')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'tourism')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (not mapcss.regexp_test(mapcss._value_const_capture(capture_tags, 3, self.re_50f04966, '^(artwork|attraction|yes)$'), mapcss._tag_capture(capture_tags, 3, tags, 'tourism'))) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if not match: + capture_tags = {} + try: match = ((mapcss._tag_capture(capture_tags, 0, tags, 'waterway')) and (not mapcss._tag_capture(capture_tags, 2, tags, 'area')) and (mapcss.regexp_test(mapcss._value_capture(capture_tags, 3, self.re_7d3259ea), mapcss._tag_capture(capture_tags, 3, tags, 'waterway'))) and (nds[0] != nds[-1])) + except mapcss.RuleAbort: pass + if match: + # group:tr("Should be polygon, part of multipolygon or not having area tag") + # -osmoseTags:list("geom","fix:imagery","fix:chair") + # -osmoseDetail:tr("A way has a tag that suggests it is an area, but the way is not closed.") + # -osmoseFix:tr("Make sure the first and last node of the way are connected, such that it forms a closed way. If the way is not an area, add `area=no` or correct the tags.") + # -osmoseTrap:tr("Use a multipolygon relation instead of a way if a closed way cannot be formed to represent the area. In this case, remove the area-related tags from the way.") + # -osmoseExample:"![](https://wiki.openstreetmap.org/w/images/c/cc/Osmose-eg-error-1100.png)" + # -osmoseItemClassLevel:"1170/4/1" + # throwError:tr("Unclosed way with {0}","{0.tag}") + # assertNoMatch:"way emergency=designated" + # assertNoMatch:"way oneway=no" + # assertNoMatch:"way tourism=xyz area=no" + err.append({'class': 4, 'subclass': 0, 'text': mapcss.tr('Unclosed way with {0}', mapcss._tag_uncapture(capture_tags, '{0.tag}'))}) + + return err + + +from plugins.PluginMapCSS import TestPluginMapcss + + +class Test(TestPluginMapcss): + def test(self): + n = Structural(None) + class _config: + options = {"country": None, "language": None} + class father: + config = _config() + n.father = father() + n.init(None) + data = {'id': 0, 'lat': 0, 'lon': 0} + + self.check_not_err(n.way(data, {'emergency': 'designated'}, [0]), expected={'class': 4, 'subclass': 0}) + self.check_not_err(n.way(data, {'oneway': 'no'}, [0]), expected={'class': 4, 'subclass': 0}) + self.check_not_err(n.way(data, {'area': 'no', 'tourism': 'xyz'}, [0]), expected={'class': 4, 'subclass': 0}) From 3bbce5603f487e9d69f7ad27f94481bea522c4dc Mon Sep 17 00:00:00 2001 From: Famlam Date: Sat, 30 Aug 2025 16:58:41 +0200 Subject: [PATCH 09/13] Remove analyser --- .../analyser_osmosis_relation_multipolygon.py | 49 ------------------- 1 file changed, 49 deletions(-) diff --git a/analysers/analyser_osmosis_relation_multipolygon.py b/analysers/analyser_osmosis_relation_multipolygon.py index 766c8b574..c8ae653bd 100644 --- a/analysers/analyser_osmosis_relation_multipolygon.py +++ b/analysers/analyser_osmosis_relation_multipolygon.py @@ -161,43 +161,6 @@ COUNT(*) > 1 """ -sql40 = """ -SELECT - ways.id, - ST_AsText(way_locate(ways.linestring)), - ways.tags->'area', - ways.tags->'landuse', - ways.tags->'natural', - ways.tags->'waterway', - ways.tags->'leisure', - ways.tags->'amenity', - ways.tags->'building', - COALESCE(ways.tags->'area', ways.tags->'landuse', ways.tags->'natural', ways.tags->'waterway', ways.tags->'leisure', ways.tags->'amenity', ways.tags->'building') -FROM - {0}ways AS ways - LEFT JOIN relation_members ON - relation_members.member_id = ways.id AND - relation_members.member_type = 'W' -WHERE - ways.tags != ''::hstore AND - ( - (ways.tags?'area' AND ways.tags->'area' in ('yes', 'true')) OR - ways.tags?'landuse' OR - (ways.tags?'natural' AND ways.tags->'natural' in ('bare_rock', 'bay', 'beach', 'fell', 'glacier', 'grassland', 'heath', 'hot_spring', 'moor', 'mud', 'rock', 'sand', 'scree', 'scrub', 'shingle', 'sinkhole', 'stone', 'water', 'wetland', 'wood') AND (NOT ways.tags?'bay' OR ways.tags->'bay' != 'fjord')) OR - (ways.tags?'waterway' AND ways.tags->'waterway' in ('boatyard', 'dock', 'fuel', 'riverbank')) OR - (ways.tags?'leisure' AND ways.tags->'leisure' in ('adult_gaming_centre', 'amusement_arcade', 'bandstand', 'beach_resort', 'bird_hide', 'common', 'dance', 'dog_park', 'firepit', 'fishing', 'fitness_centre', 'garden', 'golf_course', 'hackerspace', 'horse_riding', 'ice_rink', 'marina', 'miniature_golf', 'nature_reserve', 'park', 'picnic_table', 'pitch', 'playground', 'sports_centre', 'stadium', 'summer_camp', 'swimming_area', 'swimming_pool', 'water_park', 'wildlife_hide')) OR - (ways.tags?'amenity' AND ways.tags->'amenity' in ('animal_boarding', 'animal_shelter', 'arts_centre', 'baby_hatch', 'bank', 'bar', 'bicycle_rental', 'bicycle_repair_station', 'biergarten', 'blood_donation', 'boat_sharing', 'brothel', 'bus_station', 'cafe', 'car_rental', 'car_sharing', 'car_wash', 'casino', 'cinema', 'clinic', 'college', 'community_centre', 'courthouse', 'coworking_space', 'crematorium', 'crypt', 'dentist', 'dive_centre', 'doctors', 'dojo', 'driving_school', 'embassy', 'fast_food', 'ferry_terminal', 'fire_station', 'firepit', 'food_court', 'fountain', 'fuel', 'gambling', 'game_feeding', 'grave_yard', 'gym', 'hospital', 'hunting_stand', 'ice_cream', 'internet_cafe', 'kindergarten', 'kneipp_water_cure', 'language_school', 'library', 'marketplace', 'motorcycle_parking', 'music_school', 'nightclub', 'nursing_home', 'parking', 'parking_space', 'pharmacy', 'place_of_worship', 'planetarium', 'police', 'post_office', 'prison', 'pub', 'public_bookcase', 'public_building', 'ranger_station', 'recycling', 'rescue_station', 'restaurant', 'sauna', 'school', 'shelter', 'shower', 'social_centre', 'social_facility', 'studio', 'swingerclub', 'taxi', 'theatre', 'toilets', 'townhall', 'university', 'veterinary', 'waste_transfer_station')) OR - ways.tags?'building' - ) AND - ways.linestring IS NOT NULL AND - NOT ways.is_polygon AND - relation_members.member_id IS NULL AND - -- Avoid confusing warnings for invalid polygons. Any closed way with >3 nodes that doesn't match - -- is_polygon (with any of the tags above) must be an invalid polygon (which is checked elsewhere) - -- Note: use array_length instead of ST_NPoints as the former includes nodes outside of the extract - (NOT ST_IsClosed(ways.linestring) OR array_length(ways.nodes,1) = 3) -""" - class Analyser_Osmosis_Relation_Multipolygon(Analyser_Osmosis): def __init__(self, config, logger = None): @@ -220,13 +183,6 @@ def __init__(self, config, logger = None): detail = T_( '''Multipolygon does not define nature, several found on the outer role members.''')) - self.classs_change[4] = self.def_class(item = 1170, level = 1, tags = ['relation', 'fix:chair', 'geom'], - title = T_('Should be polygon, part of multipolygon or not having area tag'), - detail = T_( -'''The nature of the way indicates that it is a surface, the way would be -a polygon or a part of a multipolygon as outer role.'''), - fix = T_( -'''Close the way to make a polygon or add to a multipolygon.''')) self.callback10 = lambda res: {"class":1, "data":[self.relation_full, self.way_full, self.way_full, self.positionAsText]} self.callback20 = lambda res: {"class":2, "subclass":stablehash64(res[11]), "data":[self.relation_full, self.way_full, self.positionAsText], @@ -235,9 +191,6 @@ def __init__(self, config, logger = None): self.callback30 = lambda res: {"class":3, "subclass":1, "data":[self.relation_full, self.positionAsText], "text": {"en": u", ".join(map(lambda k: "{0}=({1})".format(*k), filter(lambda k: k[1], (("landuse",res[2]), ("natural",res[3]), ("waterway",res[4]), ("building",res[5])))))} } - self.callback40 = lambda res: {"class":4, "subclass":stablehash64(res[9]), "data":[self.way_full, self.positionAsText], - "text": {"en": u", ".join(map(lambda k: "{0}={1}".format(*k), filter(lambda k: k[1], (("area",res[2]), ("landuse",res[3]), ("natural",res[4]), ("waterway",res[5]), ("leisure",res[6]), ("amenity",res[7]), ("building",res[8])))))} - } def analyser_osmosis_common(self): self.run(sql30, self.callback30) @@ -247,7 +200,6 @@ def analyser_osmosis_full(self): self.run(sql11) self.run(sql12.format("", "", ""), self.callback10) self.run(sql20.format("", ""), self.callback20) - self.run(sql40.format(""), self.callback40) def analyser_osmosis_diff(self): self.run(sql10) @@ -258,4 +210,3 @@ def analyser_osmosis_diff(self): self.run(sql12.format("not_touched_", "not_touched_", "touched_"), self.callback10) self.run(sql20.format("touched_", ""), self.callback20) self.run(sql20.format("not_touched_", "touched_"), self.callback20) - self.run(sql40.format("touched_"), self.callback40) From 8bca1450a34081143caad33250c48cf9c0e0eee1 Mon Sep 17 00:00:00 2001 From: Famlam Date: Sat, 30 Aug 2025 17:00:38 +0200 Subject: [PATCH 10/13] Disable plugin --- plugins/{ => disabled}/Structural_UnclosedArea.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plugins/{ => disabled}/Structural_UnclosedArea.py (100%) diff --git a/plugins/Structural_UnclosedArea.py b/plugins/disabled/Structural_UnclosedArea.py similarity index 100% rename from plugins/Structural_UnclosedArea.py rename to plugins/disabled/Structural_UnclosedArea.py From 19738422dde51a28a28e1761da368669b8ab9635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Rodrigo?= Date: Thu, 4 Sep 2025 22:13:35 +0200 Subject: [PATCH 11/13] Switch to docker compose plugin --- docker/README.md | 34 +++++++++++++++--------------- docker/docker-compose-dev.yml | 2 -- docker/docker-compose-frontend.yml | 2 -- docker/docker-compose-readonly.yml | 2 -- docker/docker-compose.yml | 2 -- docker/public-jupyter.sh | 14 ++++++------ 6 files changed, 24 insertions(+), 32 deletions(-) diff --git a/docker/README.md b/docker/README.md index c2ab89d66..37633ee2b 100644 --- a/docker/README.md +++ b/docker/README.md @@ -5,7 +5,7 @@ osmose-backend can be run in a Docker container. This avoids setting up and configuring Python, Java and PostgreSQL on your system. Note : A PostgreSQL docker is automatically installed and run by -docker-compose and doesn't need be installed manually. +docker compose and doesn't need be installed manually. The osmose-frontend docker may also be run but is not mandatory. @@ -14,7 +14,7 @@ Setup To build the docker image run this command from the docker folder: ``` -docker-compose build +docker compose build ``` For production setup, you may fill the `SENTRY_DSN` field in @@ -32,8 +32,8 @@ chmod a+w ./work Taking Monaco (a quick and small one) as an example, once the docker image is built, you can run Osmose analyzers using: ``` -docker-compose --project-name monaco run --rm backend ./osmose_run.py --country=monaco -docker-compose --project-name monaco down # Destroy the loaded data base +docker compose --project-name monaco run --rm backend ./osmose_run.py --country=monaco +docker compose --project-name monaco down # Destroy the loaded data base ``` This will run interactively and you will see the output scrolling on your @@ -67,7 +67,7 @@ requiring extra configuration or upload password. Build the docker image with develop tools included: ``` -docker-compose -f docker-compose.yml -f docker-compose-dev.yml build +docker compose -f docker-compose.yml -f docker-compose-dev.yml build ``` @@ -80,7 +80,7 @@ chmod a+w ../modules/osm_pbf_parser/ Enter the container with: ``` -docker-compose -f docker-compose.yml -f docker-compose-dev.yml run --rm backend +docker compose -f docker-compose.yml -f docker-compose-dev.yml run --rm backend ``` On the first execution only, compile the OSM PBF parser: @@ -89,7 +89,7 @@ cd modules/osm_pbf_parser/ && make && cd - ``` Note: when exiting the backend, the dependency Database container will still be -running. You can stop it with `docker-compose stop`. +running. You can stop it with `docker compose stop`. ## Access to the Database @@ -109,7 +109,7 @@ osmose=> set search_path to monaco,public; You can Reset the Database and the docker containers with: ``` -docker-compose down -v +docker compose down -v ``` @@ -130,14 +130,14 @@ pytest plugins/TagFix_Housenumber.py Download and load a country into the Database: ``` -docker-compose -f docker-compose.yml -f docker-compose-dev.yml run -p 8888:8888 --rm backend ./osmose_run.py --no-clean --country=monaco --skip-analyser --skip-upload +docker compose -f docker-compose.yml -f docker-compose-dev.yml run -p 8888:8888 --rm backend ./osmose_run.py --no-clean --country=monaco --skip-analyser --skip-upload ``` You do not need to load the country each time. It remains in the Database. Then run the jupyter-notebook web server: ``` -docker-compose -f docker-compose.yml -f docker-compose-dev.yml run -p 8888:8888 --rm backend jupyter-notebook +docker compose -f docker-compose.yml -f docker-compose-dev.yml run -p 8888:8888 --rm backend jupyter-notebook ``` Note the `8888:8888`, which exposes port `8888` to localhost. @@ -152,7 +152,7 @@ own analyzer code. From docker container you can test all the analyzers using: ``` -docker-compose -f docker-compose.yml -f docker-compose-dev.yml run --rm backend +docker compose -f docker-compose.yml -f docker-compose-dev.yml run --rm backend ``` To test a specific analyzer: @@ -187,16 +187,16 @@ First time build git clone https://github.com/osmose-qa/osmose-frontend.git cd osmose-frontend/docker curl https://osmose.openstreetmap.fr/export/osmose-menu.sql.bz2 | bzcat > osmose-menu.sql -docker-compose build -docker-compose -f docker-compose.yml -f docker-compose-test.yml up -d postgres +docker compose build +docker compose -f docker-compose.yml -f docker-compose-test.yml up -d postgres # Wait fwe seconds for postgres ready -docker-compose -f docker-compose.yml -f docker-compose-test.yml run --rm api bash -c "cd web_api/static && npm run build" -docker-compose -f docker-compose.yml -f docker-compose-test.yml stop postgres +docker compose -f docker-compose.yml -f docker-compose-test.yml run --rm api bash -c "cd web_api/static && npm run build" +docker compose -f docker-compose.yml -f docker-compose-test.yml stop postgres ``` Run the frontend ``` -docker-compose -f docker-compose.yml -f docker-compose-test.yml up +docker compose -f docker-compose.yml -f docker-compose-test.yml up ``` For a detailed description of the procedure see @@ -205,7 +205,7 @@ https://github.com/osmose-qa/osmose-frontend/tree/master/docker To upload the results of the analysis to the frontend, use: ``` -docker-compose -f docker-compose.yml -f docker-compose-dev.yml -f docker-compose-frontend.yml run --rm backend bash +docker compose -f docker-compose.yml -f docker-compose-dev.yml -f docker-compose-frontend.yml run --rm backend bash ``` The result will be available at: http://127.0.0.1:8080/en/issues/open?item=xxxx&useDevItem=all diff --git a/docker/docker-compose-dev.yml b/docker/docker-compose-dev.yml index 881b2607b..f5d29b8a2 100644 --- a/docker/docker-compose-dev.yml +++ b/docker/docker-compose-dev.yml @@ -1,5 +1,3 @@ -version: '3.3' - services: backend: build: diff --git a/docker/docker-compose-frontend.yml b/docker/docker-compose-frontend.yml index cde868366..d80eb74ec 100644 --- a/docker/docker-compose-frontend.yml +++ b/docker/docker-compose-frontend.yml @@ -1,5 +1,3 @@ -version: '3.3' - services: backend: volumes: diff --git a/docker/docker-compose-readonly.yml b/docker/docker-compose-readonly.yml index d498beb56..2446d4284 100644 --- a/docker/docker-compose-readonly.yml +++ b/docker/docker-compose-readonly.yml @@ -1,5 +1,3 @@ -version: '3.3' - services: postgis: volumes: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index d7c29b513..ec61064de 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.3' - volumes: pgdata: diff --git a/docker/public-jupyter.sh b/docker/public-jupyter.sh index 46e7b0778..6452169d4 100755 --- a/docker/public-jupyter.sh +++ b/docker/public-jupyter.sh @@ -6,12 +6,12 @@ export COMPOSE_HTTP_TIMEOUT=300 mkdir local && chmod a+w local # Just build with docker-compose-dev.yml, not for run -docker-compose -f docker-compose.yml -f docker-compose-dev.yml build +docker compose -f docker-compose.yml -f docker-compose-dev.yml build -docker-compose down -v -docker-compose -f docker-compose.yml run -p 8888:8888 --rm backend ./osmose_run.py --no-clean --country=monaco --skip-analyser --skip-upload +docker compose down -v +docker compose -f docker-compose.yml run -p 8888:8888 --rm backend ./osmose_run.py --no-clean --country=monaco --skip-analyser --skip-upload -docker-compose down -docker-compose -f docker-compose.yml -f docker-compose-readonly.yml up -d -docker-compose -f docker-compose.yml -f docker-compose-readonly.yml exec postgis bash /postgres-readonly.sh -# docker-compose -f docker-compose.yml -f docker-compose-readonly.yml run -p 8888:8888 --rm backend jupyter-notebook +docker compose down +docker compose -f docker-compose.yml -f docker-compose-readonly.yml up -d +docker compose -f docker-compose.yml -f docker-compose-readonly.yml exec postgis bash /postgres-readonly.sh +# docker compose -f docker-compose.yml -f docker-compose-readonly.yml run -p 8888:8888 --rm backend jupyter-notebook From d9e8455cb0da30ddaf5657c51e5b1877ebd4dcd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Rodrigo?= Date: Thu, 4 Sep 2025 23:16:18 +0200 Subject: [PATCH 12/13] Upgrade Docker Postgres and Python version --- docker/Dockerfile | 4 ++-- docker/docker-compose.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 771f25e9b..0fa141a38 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11 +FROM python:3.13 RUN apt-get update && \ apt-get -y dist-upgrade && \ @@ -18,7 +18,7 @@ RUN apt-get update && \ libprotobuf-dev \ locales \ make \ - openjdk-17-jre-headless \ + openjdk-21-jre-headless \ pkg-config \ postgis \ postgresql-client \ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index ec61064de..d42cdefd9 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -4,7 +4,7 @@ volumes: services: postgis: shm_size: 1g - image: postgis/postgis:16-3.5-alpine + image: postgis/postgis:17-3.5-alpine volumes: - type: bind source: ./postgis-init.sh From f17c812e628d7c2a433e9d8919b4e7fce239b242 Mon Sep 17 00:00:00 2001 From: Kelson Vibber Date: Tue, 30 Sep 2025 21:49:47 -0700 Subject: [PATCH 13/13] =?UTF-8?q?Add=20cuisine=3Da=C3=A7a=C3=AD=20to=20the?= =?UTF-8?q?=20allowed=20exceptions=20from=20the=20usual=20format.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Several JOSM/Vespucci brand-name presets use this tag value. https://taginfo.openstreetmap.org/tags/cuisine%3Da%C3%A7a%C3%AD --- plugins/TagFix_BadValue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/TagFix_BadValue.py b/plugins/TagFix_BadValue.py index ee62d4c38..f37710d29 100644 --- a/plugins/TagFix_BadValue.py +++ b/plugins/TagFix_BadValue.py @@ -89,7 +89,7 @@ def init(self, logger): "electrified": ( "ground-level_power_supply" ), "religion": ( "self-realization_fellowship" ), "man_made": ( "MDF", "piste:halfpipe" ), - "cuisine": ( "tex-mex" ), + "cuisine": ( "açaí", "tex-mex" ), } self.allow_closed = { "area": ( "yes", "no", ),