Ik heb onderstaande JS-code toegepast ten behoeve van een store locator.
De store locator geeft een overzicht van shops op basis van reisafstand vanaf locatie.
Zie hier de link naar de demo-page: http://optimax.apphb.com/demo.html
Mijn vraag heeft betrekking op de foutieve weergave van de afstand.
Als je 'London' invoert in het zoekveld dan wordt bij de eerste hit '11 miles' weergegeven, waar dit 1.1 mile zou moeten zijn.
Bij lange afstanden treedt deze fout ook op. Bij een afstand boven de 1000 miles wordt deze door Google-maps weergeven als bijvoorbeeld 1,161 miles terwijl JS 1.161 mile genereert, alsof de afstand dus minder dan 2 mile zou zijn.
Mogelijk verduidelijkt onderstaande mijn vraag:
Voorbeeld A
Daadwerkelijke afstand: 1,1 mile
Notificatie Google: 1.1 mile
JS genereert foutief: 11 miles
Voorbeeld B
Daadwerkelijke afstand: 1161 miles
Notificatie Google: 1,161 miles
JS genereert foutief: 1.161
Gevolg: deze shop wordt als eerste weergeven (alsof de afstand minder dan 2 mile is) in de resultaten, terwijl deze pas achteraan genoemd zou moeten worden.
Wie zou mij kunnen helpen met de aanpassing in waarschijnlijk JS?
Thanks alvast!
Hieronder de JS-code: Plaatscode: 142479
mod edit: als dit code is van de oorspronkelijke makers en deze is vrij beschikbaar hoef je die hier niet opnieuw te posten. Een link naar de site / het origineel volstaat.
11 antwoorden
Gesponsorde links
Thomas - 17/10/2015 22:07 (laatste wijziging 17/10/2015 22:09)
Moderator
Heb je code gewijzigd in het origineel? Ik kan mij niet voorstellen dat hier nog grote fouten in zitten?
Is dit niet gewoon een interpretatie-fout aan jouw zijde?
In de engelse "locale" is een komma een scheidingsteken voor duizendtallen, en een punt geeft het scheidingsteken aan tussen gehele getallen en decimalen.
Bij ons is het juist andersom. (een . als scheidingsteken voor duizendtallen, en een , voor de scheiding tussen geheel en decimaal).
Weet je zeker dat er daardoor geen misverstanden ontstaan? Met enig logisch redeneren had je toch wel een zekere trend kunnen bespeuren in het bovenstaande?
Heb je gekeken of er ergens instellingen verkeerd zijn of dat je mogelijk iets anders fout doet? Waar is de documentatie? Die site is niet bepaald toegankelijk...
Die trend was mij opgevallen. Ik ging ervan uit dat de oplossing gezocht moest worden in een aanpassing van JS, maar nu begrijp ik dat het ook aan bepaalde instellingen zou kunnen liggen. Waar zou ik hierbij aan kunnen denken?
Hierbij ook een link naar de volledige documentatie. Link
De demo-page waar ik in mijn vorige post naar verwees - demo page - is het het origineel, hier is niets aan veranderd.
Als ik op de demo-page Hannover invoer dan wordt 'Optimax Laser Eye Surgery - Aberdeen' als dichtsbijzijndste shop genoemd, terwijl deze het verste weg ligt.
---------
Op deze website heb ik wel zelf enige aanpassingen gedaan. Zo heb ik in JS het volgende veranderd om de afstand te weergeven in kilometers:
unitSystem: google.maps.UnitSystem.IMPERIAL [origineel]
unitSystem: google.maps.UnitSystem.METRIC [ipv het origineel]
Als ik op deze website Eindhoven invoer treden de volgende twee fouten op:
1) Optimax Laser Eye Surgery - Glasgow wordt weer als dichtsbijzijndste resultaat weergeven terwijl deze het verste weg ligt.
2) Men's Suits uit Den Bosch wordt als derde weergeven, terwijl deze winkel het meest in de buurt ligt. In de resultaten bedraagt de afstand 368 km, terwijl dit 36,8 km zou moeten zijn.
---------
De fout zal inderdaad te maken hebben met de verschillende vormen van scheidingstekens. Alleen kom ik er niet uit wat ik waar zou moeten aanpassen.
Verder klopt het inderdaad dat ik ook een thread elders heb geopend. Eerder heb ik nog niet actief deelgenomen aan een forum en ging ervan uit dat het geen probleem is om meerdere threads te openen, omdat mij is opgevallen dat bepaalde vragen op meerdere fora worden gesteld. Uit jouw opmerking denk ik echter impliciet te kunnen afleiden dat dit niet de bedoeling is.
Dat mag best hoor, zolang je, als het probleem is opgelost, dit maar overal aangeeft. Dat laatste gebeurt lang niet altijd, waarbij je dus nodeloos mensen aan het werk zet of aan het werk laat.
Het wordt ook gewaardeerd dat je -als je dit zelf hebt opgelost of elders is opgelost- aangeeft wat dan de oplossing is, zodat anderen die met soortgelijke problemen kampen hier mogelijk ook iets aan hebben.
---
Om een of andere reden is die Aberdeen winkel ook in Den Bosch gesitueerd ?
Misschien gaat Google er vanuit dat je (toch) in Nederland zit ofzo, indien je een Nederlands adres invult, en dat dan je resultaten beperkt/geinterpreteerd worden als nederlands adresssen?
Daarnaast werkt deze API met rij-afstanden geloof ik, niet met hemelsbrede afstanden.
Waar wordt bepaald welke ooglaser-filialen getoond moeten worden? Mogelijk zitten er fouten/onnauwkeurigheden in je bronmaterial (lat/lon coordinaten)?
In de handleiding van The Google Maps Distance Matrix API lees ik onderstaande:
Citaat:
Unit Systems
Distance Matrix results contain text within distance fields to indicate the distance of the calculated route. The unit system to use can be specified:
units=metric (default) returns distances in kilometers and meters.
units=imperial returns distances in miles and feet.
* Note: this unit system setting only affects the text displayed within distance fields. The distance fields also contain values which are always expressed in meters.
Vervolgens wordt onderstaande voorbeeld code gegeven:
Waarschijnlijk ligt het antwoord op mijn vraag besloten in de wijze waarop de value wordt weergegeven als text. Maar zeker weten doe ik dat niet. Mogelijk ligt het ergens anders aan.
Thomas - 19/10/2015 14:11 (laatste wijziging 19/10/2015 14:14)
Moderator
Eerste bericht
Als ik op de demo-site http://optimax.apphb.com/demo.html London invoer is mijn dichtstbijzijnde resultaat 1.1 miles (Victoria), op de tweede plaats 2.6 Liverpool Street. Ik zien geen resultaten met hele grote afstanden. Het klinkt in jouw geval alsof JavaScript de betekenis van de punten en komma's verwisselt, dit zou het gedrag wat je ondervindt kunnen verklaren.
De default lat/lon (zie code) is Northhampton, in het midden van Engeland.
De code die je plaatst zijn enkel de definities, maar niet jouw aanroep/initialisatie. Hoe luidt deze? (EDIT: oh, dat ik ook met alle default waarden, je geeft geen afwijkende optie-waarden mee :/)
Daarnaast, in de code staat ook: "Please enter valid UK address address or postcode", wellicht is deze niet geschreven voor buiten UK (althans niet zonder enige aanpassingen)?
Tweede bericht
Als ik op de demo-page Hannover invoer vind ik Maidstone als dichtstbijzijnste filiaal (471 miles).
Als ik op onontdekt.com Eindhoven invoer, is de dichtstbijzijnste store "Jan Aberdeen", er staat weliswaar een adres in Aberdeen, maar de marker bevindt zich in Den Bosch (36.8 km). Ook resultaat #2 (Men's Suits, Den Bosch, 36.8 km) lijkt mij te kloppen? Dit stemt overeen met je stores in data/stores.xml. Je hebt daar voor de store van Aberdeen dezelfde lat/lon ingevuld als de store in Den Bosch.
Ik weet niet of/wat je ondertussen gewijzigd hebt, maar de variant op onontdekt.com lijkt gewoon zijn ding te doen?
Je ontwikkelt hopelijk wel met browsercache uit neem ik aan? Als je veel dingen in JavaScript bestanden wijzigt komen deze wijzigingen niet altijd direct door als je geen harde refreshes doet/cache uit zet.
(Ik neem ook aan dat je niet vergeet je wijzigingen te uploaden voordat je deze test, om nog maar een dwarsstraat te noemen)
Kortom: ik kan op dit moment het gedrag wat jij constateert in je eerste twee berichten niet (meer) reproduceren, ook lijken de afstandsberekeningen op onontdekt.com te kloppen. Spelen er nu nog ergens problemen?
Toen ik vandaag onontdekt.com bezocht via een andere desktop bleek het inderdaad wel te kloppen.
Echter als ik via andere apparaten, zoals laptops en telefoons de website bezoek dan blijven eerder genoemde fouten zich voordoen. Ik heb van beide situaties een print screen gemaakt. Screenshot foutieve en correcte weergave.
Heb je al geprobeerd een refresh te forceren op die apparaten?
Desnoods kun je dit doen door bijvoorbeeld een random hash ofzo achter je js-bestand te zetten, dan denkt je browser dat deze elke keer met een ander bestand van doen heeft. Dit is overigens niet de meest ideale oplossing want dit bestand wordt dan dus nooit gecached - beter is om dit dus op een andere manier op te lossen.
Dat is een reguliere expressie die alle karakters die geen cijfer 0..9 of punt zijn stript uit de invoer (een afstand).
Het enige wat ik daar aan zou veranderen is dat 'ie komma's ook ontziet, al zie ik niet helemaal hoe dat de werking zou moeten bevorderen. Ik kan mij vergissen, maar volgens mij kan JavaScript daar niet mee rekenen, tenzij dit "locale" strings zijn.
Dus ik zou ofwel /[^0-9.]/ vervangen door /[^0-9.,]/ of het gewoon (en wellicht beter) ongewijzigd laten. Je kunt het natuurlijk altijd proberen...
Thomas - 29/10/2015 11:17 (laatste wijziging 29/10/2015 11:18)
Moderator
Ik zou in eerste instantie er vanuit gaan dat alle externe code klopt.
Dan zou ik teruggaan naar alle default aangeleverde code. Ik zou dus die UnitSystem terugveranderen naar IMPERIAL. Mogelijk zorgde deze wijziging voor problemen in combinatie met bovengenoemde functie (GoogleMapDistanceTextToNumber).
Kijk of dit dan wel werkt, ook al wordt alles dan weergegeven in mijlen. Als dit werkt dan heb je dus enerzijds (min of meer) getoetst dat de oorspronkelijke code werkt en anderzijds heb je je probleem gereduceerd tot een weergave-kwestie (je wilt kilometers tonen in plaats van mijlen).
Je kunt dan helemaal aan het einde van de rit, nadat de API en alles wat er aan vasthangt zijn werk heeft gedaan, een hulpfunctie aanroepen die in plaats van mijlen kilometers afdrukt (dit zal een simpele omreken-functie zijn).
Als je helemaal aan het einde van dit proces een af te drukken gegeven wijzigt, is de kans dat dit onderweg (tijdens het uitvoeren van berekeningen enzo) op een of andere manier een ongewenste interactie tot gevolg heeft (dit kan een mogelijke oorzaak zijn van de problematiek die je ondervindt) in het geheel afwezig.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.