PA94
2
Hallo Dennis,
Ja, hier ein Kurzrezept:
- Grenzen von hier als Polygone runterladen.
- Dann brauchst Du noch einen “Ist ein Punkt innerhalb eines Polygons”-Algorithmus:
– Anleitung: hier
– bzw. hier
– bzw. hier
– Fertig gibt es schon was in Java
– bzw. sogar schon bei OSM in Perl: “close-areas.pl” ab Zeile 906:
# expects point as lat/lon hash, and polygon as a list of segment ids
# which will be looked up in global $segments to get from/to node ids
# which will in turn be looked up in $nodes to get lat/lon
sub polygon_contains_point
{
my ($seglist, $point) = @_;
my $p1 = $nodes->{$segments->{$seglist->[0]}->{"from"}};
my $counter = 0;
foreach my $seg(@$seglist)
{
my $p2 = $nodes->{$segments->{$seg}->{"to"}};
if ($point->{"lat"} >= $p1->{"lat"} || $point->{"lat"} >= $p2->{"lat"})
{
if ($point->{"lat"} < $p1->{"lat"} || $point->{"lat"} < $p2->{"lat"})
{
if ($point->{"lon"} < $p1->{"lon"} || $point->{"lon"} < $p2->{"lon"})
{
if ($p1->{"lat"} != $p2->{"lat"})
{
my $xint = ($point->{"lat"}-$p1->{"lat"})*($p2->{"lon"}-$p1->{"lon"})/($p2->{"lat"}-$p1->{"lat"})+$p1->{"lon"};
if ($p1->{"lon"} == $p2->{"lon"} || $point->{"lon"} <= $xint)
{
$counter++;
}
}
}
}
}
$p1 = $p2;
}
return ($counter%2);
}
- Dann Einfach über alle Punkte und Bundesländer/Landkreise iterieren → Fertig!
HTH
PA94