Kreise Zeichnen?

Hallo,

ich wollte die OpenstreetMap’s dafür nutzen um kreise um einen punkt zuzeichen

also freund a hat ein cb funk gerät mit 2 km reichweite
nun gebe ich seine adresse ein und zeichne einen kreis mit 2 km radius um sein haus

dann hat freund b ein funkgerät mit 10 km reichweite nun möchte ich halt einen kreis mit 10 km zeichnen

gibt es eine funktion wie ich auf einer OpenStreetMap zeichne ohne das andere sehen? ich möchte das origenal matieral nicht versauen.

mein plan war das in meiner internet seite mit einzubetten und per parameter das dann zuübergeben
ist das möglich wenn ja wie?

gibs dazu anleitungen?

unter was muss ich da suchen?

VG Annette

moin,

erstmal herzlich Willkommen hier!

Neulich hat jemand eine Karte mit “Fahrzeitradien” für Rettungsfahrzeuge gebaut, ist ja im Prinzip, was du willst. Mehr fällt mir im Moment nicht ein :frowning:

VG

Jörk

Also wenn Dir die einfache Lösung (Screenshot einer OSM Karte machen und die Kreise per Malprogramm
einzeichnen) nicht zusagt, solltest Du dich mal mit OpenLayers beschäftigen.

Grüße
Chris

sowas gehört sowieso nicht direkt in die DB.

Aber mit openlayers ist sowas machbar.

schau mal diese Site an: http://toolserver.org/~ti/distance-o-meter/
zoome rein und wähle rechts oben irgendetwas an… ich nehme an, Kreise in dieser Art suchst Du.

dann kannst Du Dir den Quelltext dieser Site anschauen und Dir damit dann selber eine Map basteln. Was Du dann nur noch zusätzlich brauchst (da das in obigem Beispiel nicht benötigt wird), ist eine Datei, welche die Details der verschiedenen Funker enthält.

schau mal hier rein: http://wiki.openstreetmap.org/wiki/Fx99_spielwiese
Die Position der Kreiszentren (Funker) steht in einer GPX Datei.

Annette, ich möchte Dir ja nicht gleich den Mut nehmen, aber die ganze Sache wird wohl mehr eine sehr “theoretische Spielerei”.
Es mag zwar jetzt nicht ganz hier in’s Forum passen, aber da ich seit fast 20 Jahren KW- und und UKW-Funk betreibe, möchte ich mal kurz etwas dazu sagen.:

Sofern nicht jeder deiner Funkfreunde eine Stationsantenne an einem 100m hohen Mast betreibt, wirst du kaum von einer auch nur annähernden kreisförmigen Ausbreitung der Funkwellen ausgehen können.
Diese würde man theoretisch nur auf dem Wasser (Meer) erreichen.
Zu Land wird die Ausbreitung (Bodenwelle) durch topografische Faktoren beeinflußt, ebenso wie durch jegliche Zivilisationsbauten.
Desweiteren ist die Strahlungscharakteristik einer Antenne (auch wenn sie als Rundstrahler bezeichnet wird) niemals exakt kreisförmig.

mfG Michael

hi Michael

du das weiss ich
das geht deswegen ja auch dadrum durch die erfahrungen eine datenbank aufzubauen.

genau ein kreiß soll es ja nicht sein
zudem muss ich eine einfärbung haben

ich muss dazu wohl erstmal ein beispiel bauen und mich weiter schlau machen

mir ist auch klar das es wohl eine menge programmier aufwand ist
da das ganze über ein php formular die daten in eine mysql datenbank gespeicherwert werden wollen und dann visuell auf einer karte dagestellt werden

zumal man dann auch so richtig schön fuchsjagt machen kann :stuck_out_tongue:

ich will mir halt erstmal die möglichkeiten der karten ansehen
über sinn und unsinn ist hier nicht die frage

weil ein vorteil hat das
ich habe mich wieder etwas weiter gebildet!

@efred

ja genua sowas suche ich

nun muss ich erstmal genau schauen wie ich sowas mache

Als Erweiterer des Distance-O-Meters muss ich jetzt auch was dazu sagen… :wink:

Meine Karte nimmt die Punkte aus der Datenbank und berechnet die Kreislinie direkt im PHP-Script, z.B. hier. Wenn Du nur wenige Antennen-Standorte hast, dann kannst Du die Punkte direkt ins Java-Script einbauen:

var circle =
OpenLayers.Geometry.Polygon.createRegularPolygon(feature.geometry,
10000, 50)
layer.addFeatures(new OpenLayers.Feature.Vector(circle));

the function expects 4 parameters of which I supply 3:

    1. The point where circlecenter must be at
    1. The radius in unit’s of the map (in my case meters)
    1. The number of sides (50 makes a nice circle)

Quelle

Hallo t-i,

magst du mir die PHP scripte geben?

weil ich möchte das unbedingt dynamisch haben.
es soll halt autonom arbeiten ohne das ich immerwieder was anpassen muss.

ich würde halt gerne einpaar gute beispiele dazu finden wie ich das denn umsetzen kann. sprich wie ich mit den openlayers umgehe

Das Script greift auf die toolserver-Datenbank zu, um dort die amenities ‘live’ aus dem System zu holen - das wäre bei Dir aber nicht nötig, da Du die Antennen ja nicht in die Datenbank schreiben möchtest?! Bei weniger als 100 Koordinaten lohnt sich mMn auch der Umweg über eine lokale Datenbank nicht.

Was meinst Du mit ‘dynamisch’ genau? Wer fügt die Antennen hinzu? Wie oft? …

ach antennen werden mehr mals wöchentlich geändert hinzugefügt oder gelöscht

das soll dann von den usern selber gemacht werden.

datenbank etc ist kein problem
ich habe schon eine datenbank aufgebaut wo die user das selber einpflegen können
die geben einfach die adresse der antenne an und fertig

nun gibt es noch zwei offene todo’s

  • aus der adresse die koordinate ermitteln
  • und den kreis zeichnen

mir würde hier ein beispiel reichen

hmm ich habe nun echt alles fertig

nur das mit den kreis bekomme ich nicht hin
hat hier jemand etwas code schnipsel für mich

also ein beispiel

ich möchte gern per Openlayer einen kreis zeichnen der einen radius von 2 km hat
und das um die adresse

Schliemannstraße 36 22609 Hamburg (ist nur ein beispiel)

kann mir da jemand weiterhelfen?
einfach mal das per script fertig machen?

So meine eigenen Versuche

Test html, body, #basicMap { width: 100%; height: 100%; margin: 0; }

mit der Funktion createRegularPolygon sollte ich doch einfach ein Polygon erstellen
und den füge ich dann mit addlayer ein?
oder ?

zur Funktion
createRegularPolygon

OpenLayers.Geometry.Polygon.createRegularPolygon = function(	origin,
	radius,
	sides,
	rotation	)

erleuterung:
origin Position des punktes x und y
radius durchmesser
sides ecken (anbesten 20 angeben)
rotation ???

aber irgendwie geht bei mir garnix

wo ist das problem?
was übersehe ich ?

wie kann ich so schöne kreise zeichnen wie bei den anderen?

ich glaub ich bin zublond

Hier ist ein Schnipsel aus http://hwri.hw.funpic.de/OSM_circle/GPXCIRC.js , der Kreise berechnet und darstellt.

	var pointList = [];
	var radius=this.radius /(Math.cos(3.14159* llat/180));   
        var npoin=32;
	for (var k = 0; k < npoin; k++ ) {
			var ff= new OpenLayers.Geometry.Point(feature.x + Math.cos(2.0*3.14159/npoin * k)* radius ,
									  feature.y + Math.sin(2.0*3.14159/npoin * k)* radius  );
			pointList.push(ff);  //	alert (k+":"+ff);
		}
	var ff= new OpenLayers.Geometry.Point(feature.x + radius, feature.y ); // alert (npoin+":"+ff);
	pointList.push(ff);
	if ( bifill == true ) { 
	    featureRTE.push(new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LinearRing(pointList),null,style_green));
        } else {
	    featureRTE.push(new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(pointList),null,style_green)); 
        }       
    };
this.addFeatures(featureRTE);

Ich würde aber empfehlen, die Kreise extern zu halten, z.B. als GPX ode SVG Datei, dann kannst Du die Form einfacher an die Realität anpassen,
ähnlich wie im distance-o-meter.

ja ich möchte das ja so machen wie beim distance-o-meter

aber ich finde nirgendswo code schnipsel
das ist ja grad mein problem

und ich muss morgen fertig sein :frowning:
ich hab es versprochen

ach mensch
alles drum herrum ist schon fertig nur die kreise nicht

@antispeer… fx99 hat ja jetzt den Codeschnipsel angefügt um die Kreise zu machen. Siehe:

Oder was für ein Codeschnipsel meinst Du?

hmmm… am 26.09. hast Du zum ersten mal nach sowas gefragt und hast nur bis am 29.09. zeit dafür? naja, ist schon ein bisschen kurzfristig das Ganze… Ich erinnere mich an die Feuerwehrkarte, da war man 2 oder 3 Wochen dran, bis dies hingehauen hat (oder sogar noch länger)…

jap nun ist es aufeinmal kurzfristig

ich hätte wirklich nicht gedacht das es soein aufwand ist

naja die nacht ist ja noch lang
was ich bei den bespiel noch nicht verstehe ist wie ich den kreis in die karte bringe?

ich habe oben einen versuch geschrieben wie ich die karte eingebunden habe
ich sehe da nicht wie ich den kreis einbilde und ich sehe nicht wie ich den kreis an die richtige stelle bringe

das ist mein problem zur zeit

ich glaube gerne das das alles funktioniert
aber ich kann es halt nicht einbinden

Wenn Du mir die Koordinaten schickst ( einfache ASCII Tabelle) mache ich ein GPX File draus. Das kannst Du dann wie in
http://wiki.openstreetmap.org/wiki/Fx99_spielwiese beschrieben in die Karte reinbinden.

Das Einarbeiten in Openlayers ist ziemlich kompliziert.

lieb von dir aber das bringt mir einfach nix

hach

also ich brauch einfach eine x und eine y koordinate oder?

das ganze muss leider zur echtzeit passieren
ich kann eigentlich sehr gut quellcode lesen wenn man mir drei kommentare hinterschreibt

den link oben habe ich schon x mal durchgelesen

aber gefordert ist eine funktion die eher das macht was http://toolserver.org/~ti/distance-o-meter/ macht
einen kreis ziehen der eingefärbt ist.

gibt es da keine fertige funktion
das kann von miraus erstmal star sein

einfach ein beispiel in berlin mitte oder hamburg mitte

ich glaub ich verstehe das grad einfach nicht

VG Annette

sooo soweit bin ich

also kreiszeichnen geht
dummerweise der kreis ist in atlantik und ich bin in berlin

warum ist das so?
habe doch das selbe angegeben

Circle Test p { width: 500px; } var map, vectorLayer, polygonFeature, selectControl, selectedFeature;
    function init(){
        map = new OpenLayers.Map('map');
        var layer = new OpenLayers.Layer.OSM();
        map.addLayer(layer);
        map.addControl(new OpenLayers.Control.MousePosition());
        map.addControl(new OpenLayers.Control.ScaleLine({bottomOutUnits: "km"}));
        map.setCenter(new OpenLayers.LonLat(13.41,52.52).transform(
           new OpenLayers.Projection("EPSG:4326"), // transform from WGS 1984
           new OpenLayers.Projection("EPSG:900913") // to Spherical Mercator Projection   map.Geometry.Polygon.createRegularPolygon = function(13.41,52.52,10000,20,1)
           ),15);
        vectorLayer = new OpenLayers.Layer.Vector("Circle");

       createCircle(13.41,52.52,111121.21,'#FF0000','#FF0000');
      

      };
             
    /////
    var EARTH_RADIUS_KM     = 6371.0088;
    var EARTH_RADIUS_METERS = EARTH_RADIUS_KM * 1000.0;
            /* degrees to radians */
     function geoRadians(deg){
         return deg * (Math.PI / 180.0);
     };

   /* radians to degrees */
    function geoDegrees(rad){
       return rad * (180.0 / Math.PI);
    };
    
    function createCircle(lat,lng,radiusKM,line,fill){
        var rLat = geoRadians(lat);  // radians
        var rLon = geoRadians(lng);  // radians
        var d    = radiusKM / EARTH_RADIUS_KM;
        var pointList = [];
        for (x = 0; x < 360; x += 5) {
            var xrad = geoRadians(x);// radians
            var tLat = Math.asin(Math.sin(rLat) * Math.cos(d) + Math.cos(rLat) * Math.sin(d) * Math.cos(xrad));
            var tLon = rLon + Math.atan2(Math.sin(xrad) * Math.sin(d) * Math.cos(rLat), Math.cos(d)-Math.sin(rLat) * Math.sin(tLat));
                    Cx = geoDegrees(tLon);
                    Cy = geoDegrees(tLat);
                    var newPoint = new OpenLayers.Geometry.Point(Cx,Cy);
                    pointList.push(newPoint);
       }

      var myStyle = {strokeColor: line, fillColor: fill, fillOpacity: 0.4, strokeWidth: 1, pointRadius: 6, pointerEvents: "visiblePainted"};
               
      pointList.push(pointList[0]);
      var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
      polygonFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([linearRing]),null,myStyle);
      map.addLayer(vectorLayer);
      vectorLayer.addFeatures([polygonFeature]);
      };

</script>