You are not logged in.

Announcement

*** NOTICE: forum.openstreetmap.org is being retired. Please request a category for your community in the new ones as soon as possible using this process, which will allow you to propose your community moderators.
Please create new topics on the new site at community.openstreetmap.org. We expect the migration of data will take a few weeks, you can follow its progress here.***

#1 2015-08-13 20:32:35

edward17
Member
Registered: 2013-08-26
Posts: 1,849
Website

Filterung in Overpass nach der Zahl der Objekten

Hallo zusammen!

Erst, entschuldiget ihr mir bitte, wenn solches Thema schon existiert.

Also, ich brauche, im bestimmten Gebiet Polygonen mit dem Tag place=village, in deren es jeweils weniger als 20 Häuser gibt, zu finden. Mithilfe von dem Overpass. Wie kann ich das machen?

Vielleicht gibt es jetzt keine Weise, das zu tun. Wenn ja, könnet ihr vorschlägen, wie diese Option aussiehen kann und wie man sie in Overpass implementieren kann?

Ich siehe es so:

{{geocodeArea:Thüringen}}->.a;    //zum Beispiel

relation
  (area.a)
  [place=village]
->.b;

map_to_area -> .c;

foreach.c -> .d (
  way
    (area.d)
    [building]
    (count<20)(    // if count of objects in this input set is smaller than 20, then print .d
      .d out meta;
    );
);

P. S. Ich suche Dörfer, wo es in OSM keine oder zu wenig Häuser gibt, um dort Häuser zu mappen.

P. P. S. Entschuldigung, wenn ich Verben mit "ihr" falsch schreibe smile

Viele Grüße
Eduard


Все жители частного сектора, вешающие таблички с названием улицы и номером дома, попадают в рай без очереди.

Offline

#2 2015-08-13 21:44:14

edward17
Member
Registered: 2013-08-26
Posts: 1,849
Website

Re: Filterung in Overpass nach der Zahl der Objekten

So wäre es besser:

{{geocodeArea:Thüringen}}->.a;    //zum Beispiel

relation
  (area.a)
  [place=village]
->.b;

map_to_area -> .c;

foreach.c -> .d (
  way
    (area.d)
    [building]
  ->.e;

  // Sintaxis is similar to "(user:*)" and "foreach":
  // if condition in first parentheses is satisfied,
  // Overpass must run code in second parentheses.
  // This repeats for each object in input set.

  (count_less:20).e(    // if count of objects in input set ".e" is smaller than 20, then print an input set ".d"
    .d out meta;
  );
);

Все жители частного сектора, вешающие таблички с названием улицы и номером дома, попадают в рай без очереди.

Offline

#3 2015-08-15 12:04:26

stephan75
Member
Registered: 2008-05-28
Posts: 2,918

Re: Filterung in Overpass nach der Zahl der Objekten

Hallo Eduard,

mal ganz abgesehen von der Formuliering der Abfrage im teschnischen:

Bist du dir denn bewusst, ob in deinem Testgebiet die ganzen Objecte mit place=village wirklich auch als Relation erfasst sind, und nicht "nur" als eine einzige geschlossene Linie mit z.B. landuse=* oder als einzelner Node?

Und inwieweit bist du dir sicher, dass bei allen Dörfern mit place=village auch wirklich schon alle Häuser in den OSM-Daten enthalten sind? Denn was machst du mit Orten, die in der realen Welt dreißig Häuder haben, davon sind aber bisher nur 5 in OSM drin?

Offline

#4 2015-08-15 12:14:41

edward17
Member
Registered: 2013-08-26
Posts: 1,849
Website

Re: Filterung in Overpass nach der Zahl der Objekten

Hallo Stephan,

vielen Dank für die Antwort.

stephan75 wrote:

Bist du dir denn bewusst, ob in deinem Testgebiet die ganzen Objecte mit place=village wirklich auch als Relation erfasst sind, und nicht "nur" als eine einzige geschlossene Linie mit z.B. landuse=* oder als einzelner Node?

Relation und Linie - das kann man später korrigieren und ergänzen. Die oben genannte Abfrage ist nur Beispiel.

stephan75 wrote:

Und inwieweit bist du dir sicher, dass bei allen Dörfern mit place=village auch wirklich schon alle Häuser in den OSM-Daten enthalten sind? Denn was machst du mit Orten, die in der realen Welt dreißig Häuder haben, davon sind aber bisher nur 5 in OSM drin?

Ich suche genau diese Orten, um dort alle Häuser zu malen.


Все жители частного сектора, вешающие таблички с названием улицы и номером дома, попадают в рай без очереди.

Offline

#5 2015-08-15 13:10:40

mmd
Member
Registered: 2010-11-06
Posts: 2,150

Re: Filterung in Overpass nach der Zahl der Objekten

Hallo,

Hier ein Beispiel, das im Umkreis von 1000m die Zahl der Buildings für alle place=village Nodes im Saarland ermittelt:

[out:csv(::id, name, ::count)];
{{geocodeArea:Saarland}};

node(area)[place=village];

foreach (
  out;
  way(around:1000)[building];
  out count;
);
  

http://overpass-turbo.eu/s/aXr  (bzw. http://overpass-turbo.eu/s/aXt)

Alles andere funktioniert leider nicht. Eine Diskussion dazu ist am besten auf Github oder auf der Overpass Dev-List aufgehoben. Hier im Forum geht das schlicht und einfach unter.

Gruß,
mmd

Last edited by mmd (2015-08-15 13:16:40)

Offline

#6 2015-08-15 13:26:07

edward17
Member
Registered: 2013-08-26
Posts: 1,849
Website

Re: Filterung in Overpass nach der Zahl der Objekten

Hallo mmd,

danke, aber über "out count;" weiß ich schon. Man kann natürlich deine Abfrage nutzen und dann selbstständig die Orte, wo es wäniger als 20 Häuser gibt, aussuchen. Ich möchte diesen Prozeß ein bisschen automatisieren.

Über GitHub und Mailing-List - danke, vestanden. Werde dort schreiben.

Grüße,
Eduard


Все жители частного сектора, вешающие таблички с названием улицы и номером дома, попадают в рай без очереди.

Offline

#7 2015-08-15 15:58:38

MHohmann
Member
From: Tartu, Estonia
Registered: 2009-06-07
Posts: 1,600
Website

Re: Filterung in Overpass nach der Zahl der Objekten

edward17 wrote:

Man kann natürlich deine Abfrage nutzen und dann selbstständig die Orte, wo es wäniger als 20 Häuser gibt, aussuchen. Ich möchte diesen Prozeß ein bisschen automatisieren.

Du könntest die Daten, die du als CSV bekommst, z.B. mit einem Python- oder AWK-Skript einlesen und nur die Orte Filtern, die weniger als 20 in der Spalte "count" stehen haben.


SotM Baltics, 3.-4. August 2013, Tartu, Estonia: amenity=university, mappers=yes

Offline

#8 2015-08-15 18:01:24

edward17
Member
Registered: 2013-08-26
Posts: 1,849
Website

Re: Filterung in Overpass nach der Zahl der Objekten

MHohmann wrote:

Du könntest die Daten, die du als CSV bekommst, z.B. mit einem Python- oder AWK-Skript einlesen und nur die Orte Filtern, die weniger als 20 in der Spalte "count" stehen haben.

Danke, das ist ja klar. Das sieht aber unschön smile wegen der größer Anzahl der Schritten.

Nebenbei gesagt:
Wenn ich diese Abfrage (http://overpass-turbo.eu/s/aXr) starte, bekomme ich die Ergebnis in Form:

@id	name	@count
<id>	<name>
		<count>

Das bedeutet, dass <count> nicht an der Zeile mit <id> und <name> steht, sondern an nächster Zeile. Wie kann man <count> in richtige Zeile setzen?


Все жители частного сектора, вешающие таблички с названием улицы и номером дома, попадают в рай без очереди.

Offline

#9 2015-08-15 18:19:38

mmd
Member
Registered: 2010-11-06
Posts: 2,150

Re: Filterung in Overpass nach der Zahl der Objekten

edward17 wrote:

Wie kann man <count> in richtige Zeile setzen?

Das geht heute nur über Post-Processing. Über die Query selbst lässt sich das nicht beeinflussen.

Gruß,
mmd

Offline

#10 2015-08-15 18:23:54

edward17
Member
Registered: 2013-08-26
Posts: 1,849
Website

Re: Filterung in Overpass nach der Zahl der Objekten

mmd wrote:

Das geht heute nur über Post-Processing. Über die Query selbst lässt sich das nicht beeinflussen.

Shade.
Na, danke für die Information!

Grüße
Eduard


Все жители частного сектора, вешающие таблички с названием улицы и номером дома, попадают в рай без очереди.

Offline

#11 2015-08-15 18:29:06

mmd
Member
Registered: 2010-11-06
Posts: 2,150

Re: Filterung in Overpass nach der Zahl der Objekten

Post-Processing ist nicht soo schwierig:

tail -n +2 result.csv | paste - - -d"\t"

...und die beiden Extra-Tabs lassen sich bestimmt auch gut rauswerfen:

tail -n +2 result.csv | sed 's/\t\t//g' | paste - - -d"\t" | sort -t$'\t' -k3 -n

Last edited by mmd (2015-08-15 18:37:52)

Offline

Board footer

Powered by FluxBB