As customers expectations for location-based services grow, firms will need to add spatial information to the databases. For example, increasingly tourists will expect to be able to use their mobile phone to locate services near to their current locations (e.g., Where is the nearest Italian restaurant?).
INSERT INTO political_unit VALUES ('Spain', 'es', 4.9); INSERT INTO political_unit VALUES ('Portugal','pt', 10); INSERT INTO political_unit VALUES ('Andorra','ad', .067); INSERT INTO political_unit VALUES ('United Kingdom','uk', 58.79); INSERT INTO boundary VALUES (3,ST_GeomFromText('POLYGON((12 12, 13 12, 13 11, 12 11, 12 12))'),'ad'); INSERT INTO boundary VALUES (4,ST_GeomFromText('POLYGON((1 10, 4 10, 4 9, 3 3, 1 3, 1 5, 0 5, 0 6, 1 8, 1 10))'),'pt'); INSERT INTO boundary VALUES (5,ST_GeomFromText('POLYGON((1 12, 3 13, 12 12, 12 11, 15 11, 15 11, 11 7, 11 5, 9 2, 5 1, 4 1, 3 3, 4 9, 4 10, 1 10, 1 12))'),'es'); INSERT INTO city VALUES ('Braga',ST_GeomFromText('POINT(2 10)'),'pt'); INSERT INTO city VALUES ('Porto',ST_GeomFromText('POINT(1 9)'),'pt'); INSERT INTO city VALUES ('Lisbon',ST_GeomFromText('POINT(1 5)'),'pt'); INSERT INTO city VALUES ('Santiago de Compostela',ST_GeomFromText('POINT(2 12)'),'es'); INSERT INTO city VALUES ('Oviedo',ST_GeomFromText('POINT(5 12)'),'es'); INSERT INTO city VALUES ('Santander',ST_GeomFromText('POINT(7 12)'),'es'); INSERT INTO city VALUES ('Vitori',ST_GeomFromText('POINT(8 11)'),'es'); INSERT INTO city VALUES ('Pamplona',ST_GeomFromText('POINT(9 11)'),'es'); INSERT INTO city VALUES ('Logrono',ST_GeomFromText('POINT(8 11)'),'es'); INSERT INTO city VALUES ('Valiadoti',ST_GeomFromText('POINT(6 10)'),'es'); INSERT INTO city VALUES ('Saragossa',ST_GeomFromText('POINT(10 10)'),'es'); INSERT INTO city VALUES ('Barcelona',ST_GeomFromText('POINT(13 10)'),'es'); INSERT INTO city VALUES ('Madrid',ST_GeomFromText('POINT(7 8)'),'es'); INSERT INTO city VALUES ('Toledo',ST_GeomFromText('POINT(7 7)'),'es'); INSERT INTO city VALUES ('Valencia',ST_GeomFromText('POINT(11 6)'),'es'); INSERT INTO city VALUES ('Murcia',ST_GeomFromText('POINT(10 4)'),'es'); INSERT INTO city VALUES ('Sevilla',ST_GeomFromText('POINT(4 3)'),'es'); INSERT INTO city VALUES ('Gibralta',ST_GeomFromText('POINT(5 1)'),'uk'); INSERT INTO city VALUES ('Andorra la Veila',ST_GeomFromText('POINT(12 11)'),'ad');
Notes:
SELECT ST_Distance(orig.cityloc, dest.cityloc)*75 as "Distance (kms)"
FROM city orig, city dest
WHERE orig.cityname = 'Lisbon'
AND dest.cityname = 'Madrid';
What is the furthermost Spanish city from Barcelona?
SELECT dest.cityname FROM city orig, city dest
WHERE orig.cityname = 'Barcelona'
AND ST_Distance(orig.cityloc, dest.cityloc) =
(SELECT MAX(ST_Distance(orig.cityloc, dest.cityloc))
FROM city orig, city dest
WHERE orig.cityname = 'Barcelona' AND dest.unitcode = (SELECT unitcode FROM political_unit WHERE unitname = 'Spain'));
SELECT cityname FROM city WHERE ST_Distance(cityloc, ST_GeomFromText('POINT(3 9)'))
= (SELECT MIN(ST_Distance(cityloc, ST_GeomFromText('POINT(3 9)'))) FROM city);
SELECT cityname FROM city WHERE ST_X(cityloc) < (SELECT ST_X(cityloc) FROM city WHERE cityname = 'Braga') AND unitcode = (SELECT unitcode FROM political_unit WHERE unitname = 'Spain');What about if you look for a city as far west as Braga?
SELECT ST_AREA(boundpath)*5625 as "Area (km^2)" from political_unit, boundary WHERE unitname = 'Portugal' AND political_unit.unitcode = boundary.unitcode;
SELECT south.cityname FROM city south
WHERE unitcode = (SELECT unitcode FROM political_unit WHERE unitname = 'Portugal')
AND NOT EXISTS
(SELECT * FROM city other WHERE ST_Y(other.cityloc) < ST_Y(south.cityloc)
AND unitcode = (SELECT unitcode FROM political_unit WHERE unitname = 'Portugal'));
You could need to use the Euclidean distance if the distance covered is not large (i.e., assume the earth is flat for distances of a few hundred kilometers or miles)
Distance = sqrt((x2 - x1)2 + (y2-y1)2)
Latitude and longitude are measured in degrees, minutes, and, seconds relative to Greenwich and the equator. For example, Narembeen in Western Australian is at Latitude : 32° 4' S Longitude : 118° 24' E. To use these data in MySQL, we would record the location in coordinate format as (-32.0667,114.4) (.0667 = 4/60). Conventionally, south and west are negative (think of the compass points relative to (0,0) in a coordinate system).
The database needs to store a time instant (when the score was made) and the appropriate datatype is TIMESTAMP.
This page is part of the promotional and support
material for Data Management (open edition) by Richard T. Watson For questions and comments please contact the author |