I want to create a polygon, which represents the administrative boundary of a city.
It is specified by a relation, which consists of ways
<member type="way" ref="25657490" role="outer"/>
<member type="way" ref="209124836" role="outer"/>
<member type="way" ref="119880388" role="outer"/>
<member type="way" ref="119880389" role="outer"/>
<member type="way" ref="119983752" role="outer"/>
<member type="way" ref="136380499" role="outer"/>
<member type="way" ref="120024176" role="outer"/>
<member type="way" ref="209124834" role="outer"/>
<member type="way" ref="77909008" role="outer"/>
In order to get all buildings inside that boundary using the method described here, I need to convert these ways to an ordered list of points such that every point is connected to its successor.
Example 1
I have way 119880388, whose last point is 132.100403,43.3959161
, hence, it must be followed by a way, which starts there (way 209124836 in this case).
119880388;132.1469949,43.504065|132.1439962,43.4906939|132.1400282,43.4747441|132.1402881,43.4739524|132.1397559,43.4733796|132.139471,43.4710427|132.1324332,43.4650797|132.1321001,43.4625553|132.1273123,43.4602785|132.1268996,43.4611024|132.1262186,43.4615517|132.1250473,43.4606504|132.1253362,43.4590926|132.1199706,43.4567557|132.1181958,43.4534|132.1165449,43.4536997|132.1151003,43.4558569|132.1122111,43.4550479|132.1120048,43.4568456|132.1106349,43.456653|132.1074084,43.4565518|132.1045214,43.4568074|132.1018878,43.457799|132.1045918,43.45418|132.1045214,43.4533315|132.1049016,43.4526109|132.0974329,43.4515698|132.0970943,43.4510349|132.0962379,43.4508758|132.0956005,43.4499071|132.0965565,43.4495456|132.100208,43.4491561|132.096659,43.4434507|132.098349,43.4423872|132.0988278,43.440833|132.0981518,43.4397695|132.099194,43.4388083|132.0939234,43.4347791|132.0934023,43.4339098|132.0915574,43.4311281|132.0898252,43.4291849|132.0888394,43.4281416|132.0866256,43.4271254|132.0844248,43.4271615|132.0837273,43.4275697|132.0837273,43.4262298|132.0852483,43.4242149|132.0850934,43.4232227|132.0822767,43.4233557|132.0820373,43.4226294|132.0811501,43.4219032|132.083854,43.4190391|132.0911773,43.4176683|132.0920223,43.4173205|132.0863045,43.4153769|132.0873467,43.4135355|132.0895155,43.4113666|132.0937405,43.4059441|132.0943038,43.4036522|132.0952051,43.4011965|132.0967132,43.3988428|132.0991074,43.3975125|132.100403,43.3959161|
209124836;132.100403,43.3959161|132.0973611,43.3915157|132.0945444,43.3876676|132.0947698,43.3862962|132.0962344,43.3844129|132.0891928,43.3825706|132.0861226,43.3815675|132.0843482,43.3835532|132.0826018,43.3824273|132.0823202,43.381158|132.0812181,43.3793895|132.0799157,43.3777247|132.0783487,43.3754872|132.0775037,43.3725185|132.076884,43.3713105|132.0734759,43.3689559|132.0715324,43.3696725|132.0686313,43.3693654|132.0671666,43.3700206|132.0670821,43.3692425|132.0649696,43.3681778|132.0646316,43.3658435|132.0619981,43.3665295|132.0613643,43.3651985|132.0623502,43.3648913|132.0608851,43.3614618|132.0596304,43.360689|132.0584397,43.359838|132.0568436,43.3605808|132.0524573,43.3620336|132.0516256,43.3627178|132.0467659,43.3583303|132.0505899,43.3557236|132.0502911,43.3542031|132.0457676,43.3518866|132.0457395,43.350668|132.0445706,43.3502788|132.0457676,43.3470836|132.0464436,43.3469607|132.0466971,43.3455064|132.046345,43.3446358|132.0472089,43.342042|132.0438833,43.3408081|132.043113,43.3408202|132.0429138,43.3413996|132.0405483,43.3413749|132.0393135,43.3412952|132.0381384,43.3409041|132.0377749,43.3393052|132.0369876,43.3385224|132.0374383,43.3363304|132.0392269,43.3357363|132.0392019,43.3313722|
Example 2
There are ways 25657490 and 77909008, which both end in point 132.0638277,43.3156504
. Hence the correct order is 25657490, 77909008'
where 77909008'
is the inverted list of points of way 77909008 (132.0638277,43.3156504; 132.0641092,43.3159; ...
).
25657490;132.0392019,43.3313722|132.0440197,43.3311274|132.0473289,43.3308512|132.0508932,43.3302733|132.0528244,43.3296177|132.0532452,43.3290625|132.0534252,43.3291183|132.0536528,43.3295151|132.0540176,43.3294683|132.0547127,43.3293056|132.0556996,43.3292972|132.0561718,43.3297738|132.0578026,43.3296177|132.0592617,43.3291807|132.0595621,43.3283378|132.0597767,43.327651|132.0608925,43.3269642|132.061665,43.3273076|132.0623516,43.3275573|132.0628666,43.3273388|132.0628666,43.3264023|132.063442,43.3254975|132.063507,43.3251849|132.0634183,43.3248517|132.0633476,43.3245859|132.0636823,43.3243424|132.0639065,43.3243493|132.0640514,43.3245921|132.0643604,43.3245921|132.0643422,43.3244722|132.0645664,43.3243798|132.065056,43.3230585|132.0654247,43.322644|132.065562,43.3219696|132.0655105,43.3216699|132.0657594,43.3212203|132.0653989,43.3213951|132.0650127,43.3217448|132.0648496,43.3223005|132.0648239,43.3225503|132.064223,43.3218947|132.0638111,43.3208893|132.0635333,43.3200936|132.0635103,43.3191278|132.0638536,43.3185658|132.0647549,43.3177852|132.0635103,43.315943|132.0638277,43.3156504|
77909008;132.1112088,43.3053453|132.1109191,43.305439|132.1103183,43.3058684|132.1100501,43.3059386|132.1093419,43.3059308|132.1090415,43.305962|132.1088377,43.3061182|132.10843,43.3068755|132.1073678,43.3069848|132.1070567,43.3069302|132.1067563,43.3067662|132.106134,43.3064617|132.1052113,43.3061963|132.1050397,43.306165|132.1042136,43.3064695|132.1039132,43.3070238|132.1035055,43.3071722|132.1032372,43.3073439|132.1030763,43.3075704|132.1030012,43.3078358|132.1030012,43.308312|132.1027223,43.3084682|132.1024004,43.3085853|132.1019927,43.3086399|132.1014992,43.308679|132.1011237,43.3088351|132.1002761,43.3091708|132.0999757,43.3092333|132.0997611,43.3094753|132.0996967,43.3096704|132.0989886,43.3104043|132.0984736,43.3104589|132.0975939,43.31074|132.0971647,43.310982|132.0966712,43.3111225|132.0953623,43.311185|132.09474,43.3111225|132.0941177,43.311021|132.0936886,43.311021|132.0932594,43.3111147|132.0930556,43.3112474|132.092959,43.3114192|132.0929054,43.3116143|132.0927337,43.3117549|132.0923475,43.311872|132.0918754,43.3122076|132.0917467,43.3122935|132.091339,43.312395|132.0909313,43.312395|132.0907274,43.3124262|132.0904485,43.3124184|132.0902983,43.3124262|132.0899764,43.3123638|132.089912,43.3124418|132.089397,43.3125902|132.0891181,43.312598|132.088528,43.3124965|132.08841,43.3125121|132.0878521,43.3127229|132.0876053,43.3127385|132.0872942,43.3126916|132.0869831,43.3127229|132.0861677,43.3130273|132.0860496,43.3132147|132.0857278,43.3133474|132.0855561,43.3133318|132.0851055,43.3135113|132.0848158,43.3137377|132.0844403,43.3138626|132.083818,43.3142061|132.0836786,43.3143388|132.0836035,43.3145418|132.0836464,43.3146589|132.0834211,43.3148228|132.0833996,43.3149945|132.0830027,43.3151585|132.0828095,43.315338|132.0824555,43.3153458|132.0820907,43.3152209|132.0817903,43.3152756|132.0810286,43.3153146|132.0808354,43.315377|132.0805994,43.3155566|132.0804921,43.31558|132.0803741,43.3155644|132.0802883,43.3155019|132.0801917,43.3153146|132.0801059,43.3152443|132.0799664,43.3152131|132.0797733,43.3152365|132.0796231,43.3152834|132.0794192,43.3154239|132.0792583,43.3154629|132.0791295,43.3154629|132.0790115,43.3154083|132.078797,43.3149243|132.0786575,43.3148618|132.0785073,43.314893|132.0784,43.3149555|132.0781103,43.3150179|132.0777455,43.3151428|132.0774344,43.3153146|132.0771018,43.3155253|132.076619,43.3156893|132.0762328,43.3159078|132.0757607,43.3160093|132.0751277,43.3160562|132.0745161,43.316142|132.0739261,43.3163996|132.0717588,43.31711|132.0699349,43.3178203|132.0687011,43.3184448|132.0679286,43.3187726|132.0674244,43.3189053|132.0670596,43.3189522|132.0666412,43.3189522|132.0663408,43.3188585|132.0661369,43.3186868|132.0660511,43.3184838|132.0660082,43.3182106|132.0658043,43.3178359|132.0650748,43.3172427|132.0641092,43.3159|132.0638277,43.3156504|
Are there any ready-made routines (ideally in Java), which do that (append points of ways to each other, inverting them where necessary).