Bedrijf en klant aan elkaar koppelen
Uiteindelijk kan de klant doormiddel van postcode en huisnummer een offerte van dit bedrijf ontvangen als het binnen het werkgebied valt (afstand ingegeven door t bedrijf)
Iemand enig idee of hier al een (basis) script van is of hoe ik hier aan kan beginnen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$sql= sprintf("
SELECT latitude, longitude, ( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance FROM tabel
HAVING distance < '%s'
ORDER BY distance
LIMIT 0 , 20",
mysqli_real_escape_string($con,$latitude),
mysqli_real_escape_string($con,$longitude),
mysqli_real_escape_string($con,$latitude),
mysqli_real_escape_string($con,'25'));
mysqli_query($con,$sql);
?>
$sql= sprintf("
SELECT latitude, longitude, ( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance FROM tabel
HAVING distance < '%s'
ORDER BY distance
LIMIT 0 , 20",
mysqli_real_escape_string($con,$latitude),
mysqli_real_escape_string($con,$longitude),
mysqli_real_escape_string($con,$latitude),
mysqli_real_escape_string($con,'25'));
mysqli_query($con,$sql);
?>
Ik heb deze query zelf gevonden met wat Google-werk en heb het niet getest. Maar ik hoop dat je hier wat mee kan.
Gewijzigd op 15/02/2016 21:37:38 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
// Marker van een bedrijf op de map plaatsen
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(53, -2.5),
title: 'Een bedrijf'
});
// Radius
var circle = new google.maps.Circle({
map: map,
radius: 10000, // 10 kilometer
fillColor: '#AA0000'
});
circle.bindTo('center', marker, 'position');
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(53, -2.5),
title: 'Een bedrijf'
});
// Radius
var circle = new google.maps.Circle({
map: map,
radius: 10000, // 10 kilometer
fillColor: '#AA0000'
});
circle.bindTo('center', marker, 'position');
Voor meer informatie: https://developers.google.com/maps/
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$query_zoek = sprintf("SELECT bedrijfsnaam, latitude, longitude, werkgebied, ( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance FROM bedrijven HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20", mysqli_real_escape_string($link,$latitude),
mysqli_real_escape_string($link,$longitude),
mysqli_real_escape_string($link,$latitude),
mysqli_real_escape_string($link,'25'));
?>
$query_zoek = sprintf("SELECT bedrijfsnaam, latitude, longitude, werkgebied, ( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance FROM bedrijven HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20", mysqli_real_escape_string($link,$latitude),
mysqli_real_escape_string($link,$longitude),
mysqli_real_escape_string($link,$latitude),
mysqli_real_escape_string($link,'25'));
?>
Nu wil ik alleen dat waar nu 25 staat dat hier uit de database uit de kolom werkgebied de afstand gehaald wordt. Hoe krijg ik dit voor elkaar?
In deze kolom staat dus het aantal kilometers wat het werkgebied is van dit bedrijf.
Gewijzigd op 26/02/2016 10:03:09 door -Mirkin -
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
Google Maps Distance Matrix API.
In waterland Nederland kun je namelijk op 1 km afstand van elkaar zitten maar wel 25 km moeten omrijden omdat er een kanaal of rivier in de weg zit.
Ik zou eerder uitgaan van de reisafstand en reistijd. Dat kan mooi met de In waterland Nederland kun je namelijk op 1 km afstand van elkaar zitten maar wel 25 km moeten omrijden omdat er een kanaal of rivier in de weg zit.
Randy vsf op 26/02/2016 10:06:18:
Je krijgt toch de distance van je query?
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
Distance is de afstand tussen het gevonden bedrijf en de invoer van de klant. Hier heb ik dus niets aan, als het bedrijf zich aanmeldt geven ze een werkgebied aan dus bijvoorbeeld wij werken binnen een straal van 75 km. Dit wordt in de kolom "Werkgebied" ingevuld. En de invoer van die kolom wil ik op de plek waar nu "25" staat.
Uiteindelijk moet hij alleen de bedrijven weergeven die qua afstand kunnen (als dit binnen hun werkgebied valt).
Gewijzigd op 26/02/2016 12:57:31 door -Mirkin -
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
"SELECT bedrijfsnaam, latitude, longitude, werkgebied,
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
FROM bedrijven
WHERE ( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) < kolomafstand
ORDER BY distance
LIMIT 0 , 20";
?>
"SELECT bedrijfsnaam, latitude, longitude, werkgebied,
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
FROM bedrijven
WHERE ( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) < kolomafstand
ORDER BY distance
LIMIT 0 , 20";
?>
-Mirkin - op 26/02/2016 12:56:54:
Distance is de afstand tussen het gevonden bedrijf en de invoer van de klant. Hier heb ik dus niets aan, als het bedrijf zich aanmeldt geven ze een werkgebied aan dus bijvoorbeeld wij werken binnen een straal van 75 km. Dit wordt in de kolom "Werkgebied" ingevuld. En de invoer van die kolom wil ik op de plek waar nu "25" staat.
Uiteindelijk moet hij alleen de bedrijven weergeven die qua afstand kunnen (als dit binnen hun werkgebied valt).
Randy vsf op 26/02/2016 10:06:18:
Je krijgt toch de distance van je query?
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
Distance is de afstand tussen het gevonden bedrijf en de invoer van de klant. Hier heb ik dus niets aan, als het bedrijf zich aanmeldt geven ze een werkgebied aan dus bijvoorbeeld wij werken binnen een straal van 75 km. Dit wordt in de kolom "Werkgebied" ingevuld. En de invoer van die kolom wil ik op de plek waar nu "25" staat.
Uiteindelijk moet hij alleen de bedrijven weergeven die qua afstand kunnen (als dit binnen hun werkgebied valt).
Je hebt de formule, en je hebt de data neem ik aan?
Wat is dan het probleem, en wat heb je al geprobeerd?
Randy vsf op 26/02/2016 16:14:59:
Je hebt de formule, en je hebt de data neem ik aan?
Wat is dan het probleem, en wat heb je al geprobeerd?
-Mirkin - op 26/02/2016 12:56:54:
Distance is de afstand tussen het gevonden bedrijf en de invoer van de klant. Hier heb ik dus niets aan, als het bedrijf zich aanmeldt geven ze een werkgebied aan dus bijvoorbeeld wij werken binnen een straal van 75 km. Dit wordt in de kolom "Werkgebied" ingevuld. En de invoer van die kolom wil ik op de plek waar nu "25" staat.
Uiteindelijk moet hij alleen de bedrijven weergeven die qua afstand kunnen (als dit binnen hun werkgebied valt).
Randy vsf op 26/02/2016 10:06:18:
Je krijgt toch de distance van je query?
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
Distance is de afstand tussen het gevonden bedrijf en de invoer van de klant. Hier heb ik dus niets aan, als het bedrijf zich aanmeldt geven ze een werkgebied aan dus bijvoorbeeld wij werken binnen een straal van 75 km. Dit wordt in de kolom "Werkgebied" ingevuld. En de invoer van die kolom wil ik op de plek waar nu "25" staat.
Uiteindelijk moet hij alleen de bedrijven weergeven die qua afstand kunnen (als dit binnen hun werkgebied valt).
Je hebt de formule, en je hebt de data neem ik aan?
Wat is dan het probleem, en wat heb je al geprobeerd?
Het probleem is zoals ik al beschreef dat die 25 de maximale afstand is een straal van de locatie van het bedrijf, maar voor elk bedrijf kan die straal anders en die informatie wil ik uit de tabel halen waar de gegevens van het bedrijf in staan..
Even ter verduidelijking, deze 25:
Gewijzigd op 26/02/2016 16:19:56 door -Mirkin -
Die gegeven afstand (werkbare afstand die bedrijf opgaf) van het bedrijf moet je tegen de formule houden om te zien of hij voldoet.
Die formule is trouwens redelijk complex.
Ik weet niet of het om 1000-en records gaat? Want dan kan de query mogelijk traag worden.
Je moet namelijk voor elk record in de tabel bedrijven de berekening uitvoeren.
Misschien is het eenvoudiger om een vierkant te nemen voor de formule ipv iets wat een cirkel is en rekeing houdt met de kromming van de aarden.
Neem aan dat het geen probleem is als de afstand soms 27.2 km is.
Gewijzigd op 26/02/2016 16:23:43 door Ivo P
WHERE ...
<makkelijke berekening (vierkant)>
AND
<moeilijke berekening (cirkel)>
Dan voer je <moeilijke berekening> volgens mij alleen uit over de subset die uit <makkelijke berekening> rolt, dit kan je query volgens mij al een stuk versnellen.
Lazy evaluation ftw.
Ik heb je post gezien, ik ga hem vanavond even testen en kijken wat hiervan t resultaat is. Alvast bedankt voor het meedenken!
Thomas van den Heuvel op 26/02/2016 16:26:32:
@Ivo, of je kijkt eerst of iets binnen een vierkant valt en dan pas binnen de cirkel.
WHERE ...
<makkelijke berekening (vierkant)>
AND
<moeilijke berekening (cirkel)>
Dan voer je <moeilijke berekening> volgens mij alleen uit over de subset die uit <makkelijke berekening> rolt, dit kan je query volgens mij al een stuk versnellen.
Lazy evaluation ftw.
WHERE ...
<makkelijke berekening (vierkant)>
AND
<moeilijke berekening (cirkel)>
Dan voer je <moeilijke berekening> volgens mij alleen uit over de subset die uit <makkelijke berekening> rolt, dit kan je query volgens mij al een stuk versnellen.
Lazy evaluation ftw.
Dat gaat op indien je kan zeggen:
Code (php)
1
2
3
2
3
WHERE latitude BETWEEN $min_lat AND $max_lat
AND longitude BETWEEN $min_long AND $max_lng
HAVING distance <= 25
AND longitude BETWEEN $min_long AND $max_lng
HAVING distance <= 25
Waarbij je die 4 variabelen vooraf kunt bepalen.
TS zegt echter dat dit moet gebeuren op basis van gegevens uit de tabel, dus dan lijkt het mij dat je geen voordeel haalt door de bounding box on the fly uit te rekenen en daarna nog eens de afstand.
Ik zou hier eerder overwegen om het werkgebied op te splitsen in 4 kolommen waarin de min/max latitude en longitude komen te staan.
Ger van Steenderen op 27/02/2016 12:20:34:
TS zegt echter dat dit moet gebeuren op basis van gegevens uit de tabel, dus dan lijkt het mij dat je geen voordeel haalt door de bounding box on the fly uit te rekenen en daarna nog eens de afstand.
Ik denk dat dat sterk afhangt van het totaal aantal afstanden wat je anders (zonder bounding box) zou berekenen. En de spreiding, uiteraard.