WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Räkna ut avstånd mellan 2 adresser (https://www.wn.se/forum/showthread.php?t=1054466)

Kekke 2012-08-09 13:43

Räkna ut avstånd mellan 2 adresser
 
Hejsan,

Finns det något API där man kan räkna ut ett köravstånd i km baserat på 2 adresser?

Hörde att google har det, men man får endast använda det om man använder det i samband med deras kartor, jag vill endast ha ut ett värde i kilometer från 2 adresser.

Någon som gjort något liknande?

Mvh

zenda 2012-08-09 13:45

Om du får fram koordinaterna så kan du använda en formel för att få fram avståndet.

Kekke 2012-08-09 15:13

Mjo zenda det har jag läst, men skulle behöva köravståndet mellan 2 adresser.

tartareandesire 2012-08-09 15:54

Det är mycket data som behövs för en sådan tjänst. Att samla in denna kostar en hel del tid / pengar, därav att du inte får använda de tjänster som finns hur du vill. Ett enklare alternativ är att du jämför kördistans / fågelvägen och tar fram koefficienter som du kan använda dig utav. Sen får du antagligen dela upp landet i delar, ta hänsyn till större sjöar osv. Det är som du kanske förstår inte helt enkelt :)

Conny Westh 2012-08-10 06:20

Det finns matematiska formler för det, men det krävs att man anger GPS-koordinater, enligt exempelvis enligt formatet WGS 84 (http://sv.wikipedia.org/wiki/World_Geodetic_System_1984).

Om du söker på Google så finns det formler i SQL som beräknar avståndet hyfsat aproximativt med koordinater (jag har testat i SQL-Server och det funkar bra).

Det finns ju även kartsystem som mäter avstånd efter vägasvtåndet, som Eniro.se och hitta.se, de bygger sin information på Vägverkets kartsystem över vägarna.

Conny Westh 2012-08-10 06:34

se på sjutton vi har tydligen diskuterat det på WN tidigare så jag hade lite testkod i min WNtest-databas:

Kod:

CREATE TABLE [dbo].[geographic]
(
        [GEOGRAPHIC_ID] [int] NOT NULL,
        [LONG] [float] NOT NULL,
        [LAT] [float] NOT NULL,
        [location_geography] [geography] NULL
)

Kod:

CREATE PROCEDURE [dbo].[CreateRandomPositions]
AS
BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        DECLARE @start INT
        DECLARE @stop INT
        DECLARE @count INT
        DECLARE @seed float

        SET @count = 0
        SET @start = 1
        SET @seed = RAND( (DATEPART(mm, GETDATE()) * 100000 )
          + (DATEPART(ss, GETDATE()) * 1000 )
          + DATEPART(ms, GETDATE()) );
       
        set @stop=@start+400000
        WHILE (@count <= @stop)
        BEGIN
                INSERT INTO [dbo].[geographic] ([GEOGRAPHIC_ID],[LONG], [LAT]) VALUES ((SELECT ISnull(MAX([GEOGRAPHIC_ID]),1) as c from geographic)+1,RAND()*180.0-90.0, RAND()*180.0-90.0)
                set @count = @count + 1
        END
END



Kod:

CREATE PROCEDURE [dbo].[spGetNearLocations]
    @latitude decimal(18,14),   
    @longtitude decimal(18,14),
    @pDist Float
AS
BEGIN   
    SET NOCOUNT ON;   
    -- @p1 is the point you want to calculate the distance from which is passed as parameters   
        declare @p1 geography = geography::Point(@latitude,@longtitude, 4326);   
    SELECT *
    FROM
    (
                SELECT *       
                ,@p1.STDistance(geography::Point([LAT], [LONG], 4326)) as [DistanceInKilometers]   
                FROM [geographic]
    ) as geo
        WHERE [DistanceInKilometers] < @pDist
END

GO

Kod:

CREATE PROCEDURE [dbo].[TestDistance]
AS
BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        declare @stop Datetime
        declare @start Datetime
        set @start = GetDate()
        EXEC GetDist -84.093177, 35.922934, 8.2;
        set @stop = GetDate()
        SELECT DateDiff(ms,@start,@stop) AS PerformanceTime
       
       
        set @start = GetDate()
        EXEC TestLatLonRadiusDistanceCalculation -84.093177, 35.922934, 8.2;
        set @stop = GetDate()
        SELECT DateDiff(ms,@start,@stop) AS PerformanceTime
       
       
        set @start = GetDate()
        EXEC [dbo].[spGetNearLocations] -84.093177, 35.922934, 8.2;
        set @stop = GetDate()
        SELECT DateDiff(ms,@start,@stop) AS PerformanceTime
       
END


Kod:

CREATE PROCEDURE [dbo].[TestLatLonRadiusDistanceCalculation]
        -- Add the parameters for the stored procedure here
        @pLong float,
        @pLat float,
        @pDist float
AS
BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        SELECT *
        FROM
        (
                select *, dbo.LatLonRadiusDistance(long,lat,@pLong,@pLat) as distance
                FROM geographic
                --WHERE (LAT < (@x+1)) AND (LAT >(@x-1)) AND (LONG <(@y+1)) AND (LONG > (@y-1))
        ) as dist
        WHERE distance < @pDist
        ORDER By distance
END


tartareandesire 2012-08-10 08:26

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20447002)
Det finns matematiska formler för det, men det krävs att man anger GPS-koordinater, enligt exempelvis enligt formatet WGS 84 (http://sv.wikipedia.org/wiki/World_Geodetic_System_1984).

Om du söker på Google så finns det formler i SQL som beräknar avståndet hyfsat aproximativt med koordinater (jag har testat i SQL-Server och det funkar bra).

Det finns ju även kartsystem som mäter avstånd efter vägasvtåndet, som Eniro.se och hitta.se, de bygger sin information på Vägverkets kartsystem över vägarna.

Det är det senare som efterfrågas. Att beräkna avstånd fågelvägen är ju som sagt var inga problem.

elitasson 2012-08-10 16:14

Har php-funktioner för att enkelt räkna ut kör-avstånd (km) och kör-tid mellan två adresser om det skulle vara intressant.

Dock använder sig funktionerna av Google.

EDIT: Var i APIt står det att man bara får använda tjänsterna i samband med deras karttjänster?

Kekke 2012-08-12 18:11

Citat:

Ursprungligen postat av elitasson (Inlägg 20447057)
Har php-funktioner för att enkelt räkna ut kör-avstånd (km) och kör-tid mellan två adresser om det skulle vara intressant.

Dock använder sig funktionerna av Google.

EDIT: Var i APIt står det att man bara får använda tjänsterna i samband med deras karttjänster?

Lite luddigt, men folk har pekat på denna punkt:
Citat:


(g) No Use of Content without a Google Map. You must not use or display the Content without a corresponding Google map, unless you are explicitly permitted to do so in the Maps APIs Documentation, or through written permission from Google. In any event, you must not use or display the Content on or in conjunction with a non-Google map. For example, you must not use geocodes obtained through the Service in conjunction with a non-Google map. As another example, you must not display Street View imagery alongside a non-Google map, but you may display Street View imagery without a corresponding Google map because the Maps APIs Documentation explicitly permits you to do so.

Erik Stenman 2012-08-12 19:13

Väldigt ofta går det att lägga in en google-karta som på något sätt lägger till ett mervärde så försök komma på en användning för en karta så är det lugnt att använda köravståndet via googles api.


Alla tider är GMT +2. Klockan är nu 04:11.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson