Elke rij waarden bij invullen uit het functie resultaat van waarden uitdezelfde rij

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Leeuwarden Friesland

Leeuwarden Friesland

30/10/2019 15:18:16
Quote Anchor link
Goedenavond,

Ik kom niet uit het volgende. Mocht iemand me even kunnen helpen, bedankt.

Ik wil waarden zetten in rijen van mijn tabel die gegenereerd worden uit waarden uitdezelfde rijen. Hier gebruik ik de PHP functie getting_the_closest(53.2045314315038,5.77743964367885); voor die resulteert in dit voorbeeld als output: 391.28,53.206656065508,5.7821233028534

Ik gebruik deze functie om de waarden uit de kolommen lat en lng van elke rij in te lezen.

Zegmaar als voorbeeld:

lat lng
53.2045314315038 5.77743964367885

Afbeelding

De output van deze functie wil ik in dezelfde rij krijgen gezet in de kolommen meters_closest lat_closest lng_closest zoals in dit voorbeeld.

Zegmaar:

meters_closest lat_closest lng_closest
391.28 53.206656065508 5.7821233028534


De waarden in lat en lon staan dus al vast en de overige rijen van mijn kolommen meters_closest, lat_closest en lng_closest moeten dus gevuld worden met de berekening die getting_the_closest maakt met input van waarden uit elke zelfde rij van de table1. Het is de bedoeling dat ik alle rijen in de tabel table1 zo gevuld krijg.

Afbeelding

Bedankt,

grid
Gewijzigd op 30/10/2019 15:23:01 door Leeuwarden Friesland
 
PHP hulp

PHP hulp

18/04/2024 18:58:03
 
Thomas van den Heuvel

Thomas van den Heuvel

30/10/2019 16:06:46
Quote Anchor link
Waar loop je vast want je hebt al een complete specificatie van wat er moet gebeuren? Wat je waarschijnlijk nog moet doen is alle coordinatenparen doorlopen en dan kijken wat de kleinste meters_closest is?

En kan het ook niet voorkomen dat een specifieke lat, lng combinatie meerdere "closest" coordinaten heeft? Dus misschien zou je een aparte "closest" tabel moeten introduceren voor een-op-veel relatie?
 
Rob Doemaarwat

Rob Doemaarwat

30/10/2019 16:11:29
Quote Anchor link
Nou, gezien de precisie van lat/lon ga er vanuit dat er altijd 1 de closeste is. Misschien scheelt het maar een mm, maar dan heeft ie toch gewonnen ;-)
 
Leeuwarden Friesland

Leeuwarden Friesland

30/10/2019 16:14:21
Quote Anchor link
Ik heb niet de ervaring om de rijen door te lopen en op te vullen. De functie getting_the_closest heb ik al in PHP geschreven. Dit is een aangepaste versie van https://www.geodatasource.com/developers/php Ik gebruik mysql meestal gewoon vanuit navicat of phpmyadmin voor dit soort dingen. Alleen ik ben nu afhankelijk van de functie waarbij ik ook PHP nodig heb.

Ik heb uiteraard wel een database verbinding en mogelijkheid voor queries te maken enzo. In dit geval PDO maar alles is welkom.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
require("../googlemaps/data/database.php");
$db = new PDO( "mysql:host=" . $servername . ";dbname=" . $database, $username, $password );

$results = $db->query("")->fetchAll(PDO::FETCH_ASSOC);
Gewijzigd op 30/10/2019 16:17:48 door Leeuwarden Friesland
 
Thomas van den Heuvel

Thomas van den Heuvel

30/10/2019 16:33:05
Quote Anchor link
Maar je zult alle coordinatenparen af moeten lopen om te kunnen constateren welke relatief gezien het dichtste bij is ten opzichte van een opgegeven coordinatenpaar? Dit kun je prima in PHP doen. Haal alle lat-lon paren op, bereken de afstand ten opzichte van dit opgegeven paar en onthoud de laagste afstand die je tegenkomt, en welk record hier bij hoort. Vervolgens kun je een UPDATE doen op het record met het dichtsbijzijnde paar. Of ik begrijp niet hoe je al deze paren wenst te combineren.

Idealiter refereer je aan dit record via een (intern auto-increment) id, en niet de specifieke lat-lon waarden.

Stel echter dat je de coordinatenparen A, B en C in je database hebt zitten.

Vervolgens heb je een paar X, waarvan je wilt weten of deze het dichtst bij A, B of C ligt. Hier komt bijvoorbeeld B uit. Maar nu heb je een ander paar Y, verschillende van X, waarbij de uitkomst ook B is. Wordt X dan door Y vervangen als Y dichterbij is, of zijn beide resultaten relevant en zul je dus de mogelijkheid moeten hebben om meerdere paren op te hangen aan B?

Rob Doemaarwat op 30/10/2019 16:11:29:
Nou, gezien de precisie van lat/lon ga er vanuit dat er altijd 1 de closeste is. Misschien scheelt het maar een mm, maar dan heeft ie toch gewonnen ;-)

Zeg nooit nooit :). En wie zegt dat een verschil onder, ik zeg maar wat, de vijf(tig) meter inhoudt dat beide coordinaten "gelijkwaardig" zijn? Als dit bijvoorbeeld bushaltes en openbare toiletten zijn ofzo, dan zijn beide relevant, en maakt het niet zoveel uit welke je kiest. Je sluit dan in ieder geval niet op voorhand een keuze uit.
Gewijzigd op 30/10/2019 16:38:52 door Thomas van den Heuvel
 
Leeuwarden Friesland

Leeuwarden Friesland

30/10/2019 17:01:00
Quote Anchor link
Thomas, achter de functie getting_the_closest hangen een aantal lengte en breedtegraad punten van kantoren. Als ik die functie dus vergelijk met een lengte en breedtegraad uit de tabel dan zal automatisch het dichtsbijzijnde kantoor gekoppeld worden. Dus het aantal meters en de lengte en breedtegraad punten. Als die eenmaal in de tabel staan kan ik die weer met een JOIN koppelen aan de adressen hier van.
Gewijzigd op 30/10/2019 17:01:16 door Leeuwarden Friesland
 
Thomas van den Heuvel

Thomas van den Heuvel

30/10/2019 17:11:24
Quote Anchor link
Zou je de kantoren dan niet als uitgangspunt moeten nemen? Waar komen deze lengte- en breedtegraden in de tabel vandaan dan, en wat voor relevantie hebben deze? En zou je die coordinaten dan niet aan een kantoor(id) moeten koppelen in plaats van de lengte- en breedtegraden van de desbetreffende kantoren?
Gewijzigd op 30/10/2019 17:15:41 door Thomas van den Heuvel
 
Leeuwarden Friesland

Leeuwarden Friesland

30/10/2019 17:18:32
Quote Anchor link
Thomas, dit zijn gewoon kadastrale adressen. Er zijn ook nog meerdere kolommen. De tabel table1 heeft bijvoorbeeld al een kolom ID Maar om de complexiteit te beperken van de vraag heb ik die uitgesloten in dit onderwerp.
Gewijzigd op 30/10/2019 17:18:45 door Leeuwarden Friesland
 
Thomas van den Heuvel

Thomas van den Heuvel

30/10/2019 17:54:15
Quote Anchor link
Het databaseontwerp zou in ieder geval voort moeten vloeien uit een functionele spec, en in dienst moeten staan van de dingen die je hier mee wilt kunnen doen.

Zolang je niet aangeeft wat dit alles zou moeten doen kunnen we je met geen goed fatsoen adviseren wat te doen. Hierbij helpt het dus om een (zo) volledig (mogelijk) plaatje te schetsen, anders wordt het zo'n schaakspel om informatie los te peuteren.

Ik kijk in eerste instantie naar aanpak, en geef niet zomaar een directe "oplossing", simpelweg omdat het heel vaak niet vaststaat of het wel een oplossing is, of dat de ingeslagen oplossingsrichting uberhaupt een juiste/slimme is.

Met de onvolledige informatie die ik nu hebt lijkt het er op dat de database nog niet helemaal (of helemaal niet) uitgenormaliseerd is, of die functie getting_the_closest() moet informatie vissen uit een andere tabel waar we geen weet van hebben.

En als je dan verbanden hebt tussen informatie in verschillende tabellen, dan lijkt het mij het beste om deze verbanden echt vast te leggen in (foreign) keys / constraints, zodat je uiteindelijk ook echt een relationele database hebt, in plaats van tabellen die als los zand aan elkaar hangen via coordinatenparen.
 
Rob Doemaarwat

Rob Doemaarwat

30/10/2019 19:14:14
Quote Anchor link
Ik weet niet hoeveel coördinaten er in je tabel zitten, maar om te voorkomen dat je steeds getting_the_closest() voor elk coördinaten paar door moet rekenen zou je ook in je query al een hele grove benadering kunnen doen, en dan de top zoveel ophalen. Alleen met die top zoveel ga je dan de closeste op 6 cijfers achter de komma bepalen (en dus meteen de meters_closest).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
select * from tabel
order by power(lat - :lat_kantoor,2) + power(lon - :lon_kantoor,2)
limit 10
Gewijzigd op 31/10/2019 11:28:38 door Rob Doemaarwat
 



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.