01 #!/usr/local/bin/perl -w 02 use strict; 03 use XML::Simple qw( XMLin ); 04 use Algorithm::Cluster qw/kcluster/; 05 06 my $file = "microformat.xml"; 07 08 my $data = XMLin( $file ); 09 10 binmode STDOUT, ":utf8"; 11 12 my $placemarks = 13 $data->{ Folder }->{ Placemark }; 14 15 my $coords = []; 16 my $mask = []; 17 my $weights = [ 1, 1 ]; 18 my @names = (); 19 20 for my $name ( keys %$placemarks ) { 21 22 my $latlong = $placemarks->{ $name }-> 23 { Point }->{ coordinates }; 24 25 my( $lon, $lat ) = split ',', $latlong; 26 27 push @$coords, [ $lon, $lat ]; 28 push @names, $name; 29 push @$mask, [ 1, 1 ]; 30 } 31 32 my %params = ( 33 nclusters => 12, 34 transpose => 0, 35 npass => 100, 36 method => 'a', 37 dist => 'e', 38 data => $coords, 39 mask => $mask, 40 weight => $weights, 41 ); 42 43 my ($clusters, $error, $found) = 44 kcluster( %params ); 45 46 my @by_cluster = (); 47 48 for( my $i = 0; $i < scalar @$clusters; 49 $i++ ) { 50 51 my $id = $clusters->[ $i ]; 52 push @{ $by_cluster[ $id ] }, 53 [ $names[ $i ], 54 @{ $coords->[ $i ] } ]; 55 } 56 57 for my $cluster ( @by_cluster ) { 58 print "Cluster: \n"; 59 for my $park ( @$cluster ) { 60 print " @$park\n"; 61 } 62 }