Bedrijf en klant aan elkaar koppelen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

-Mirkin -

-Mirkin -

15/02/2016 21:02:36
Quote Anchor link
Misschien dat dit script al ergens bestaat, maar ik ben voor iemand opzoek naar een script waar een bedrijf zich kan aanmelden en daarin aangeeft waar het zich bevindt en kan aangeven binnen hoeveel afstand hun werk gebied is (km).

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?
 
PHP hulp

PHP hulp

21/11/2024 14:30:59
 
- Ariën  -
Beheerder

- Ariën -

15/02/2016 21:31:55
Quote Anchor link
Een kant en klaar script kan ik niet vinden, maar de beschikbare bedrijven kan je met deze query opzoeken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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 -
 
Armor King

Armor King

15/02/2016 21:42:42
Quote Anchor link
Je zou met behulp van de Google Maps API een leuke webapplicatie kunnen maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');


Voor meer informatie: https://developers.google.com/maps/
 
-Mirkin -

-Mirkin -

26/02/2016 10:02:24
Quote Anchor link
Ik heb nu deze code in gebruik en hij werkt prima

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'));
?>


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 -
 
Randy vsf

Randy vsf

26/02/2016 10:06:18
Quote Anchor link
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
 
Ward van der Put
Moderator

Ward van der Put

26/02/2016 10:26:39
Quote Anchor link
Ik zou eerder uitgaan van de reisafstand en reistijd. Dat kan mooi met de 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.
 
-Mirkin -

-Mirkin -

26/02/2016 12:56:54
Quote Anchor link
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

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 -
 
Ivo P

Ivo P

26/02/2016 16:02:47
Quote Anchor link
Kun je de kolom "afstand" niet in de where zetten?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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"
;

?>
 
Randy vsf

Randy vsf

26/02/2016 16:14:59
Quote Anchor link
-Mirkin - op 26/02/2016 12:56:54:
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

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?
 
-Mirkin -

-Mirkin -

26/02/2016 16:18:55
Quote Anchor link
Randy vsf op 26/02/2016 16:14:59:
-Mirkin - op 26/02/2016 12:56:54:
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

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
mysqli_real_escape_string($link,'25'));
Gewijzigd op 26/02/2016 16:19:56 door -Mirkin -
 
Ivo P

Ivo P

26/02/2016 16:22:48
Quote Anchor link
je hebt mijn post ook gezien?

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
 
Thomas van den Heuvel

Thomas van den Heuvel

26/02/2016 16:26:32
Quote Anchor link
@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.
 
-Mirkin -

-Mirkin -

26/02/2016 16:26:53
Quote Anchor link
Ik heb je post gezien, ik ga hem vanavond even testen en kijken wat hiervan t resultaat is. Alvast bedankt voor het meedenken!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/02/2016 12:20:34
Quote Anchor link
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.

Dat gaat op indien je kan zeggen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
WHERE latitude BETWEEN $min_lat AND $max_lat
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

27/02/2016 16:02:43
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.