How to properly triangulate GSM cell towers to get a location?

48,033

I can help you with a bit of the theory.

Triangulation is basically finding the intersection point of 3 circles.

Each mobile tower is the center of a circle. The size of the circle is relative to the signal strength of that tower.

The place where the 3 circles overlap is where the user is.

You can do some very basic triangulation as follows:

3 Towers at 
 tx1,ty1 
 tx2,ty2 
 tx3,ty3

With signal strengths s1, s2, s3

We calculate the weight of each signal. Essentially a number from 0 to 1 for each tower where the sum of the weights adds up to 1.

Weighted signal w1, w2, w3 where:
 w1 = s1/(s1+s2+s3)
 w2 = s2/(s1+s2+s3)
 w3 = s3/(s1+s2+s3)


User will be at
x: (w1 * tx1 + w2 * tx2+ w3 * tx3)
y: (w1 * ty1 + w2 * ty2+ w3 * ty3)

Here is a working example using the values from your question:


s1 = 80
s2 = 55
s3 = 55
s4 = 55
s5 = 21

w1 = 80 / ( 80 + 55 + 55 + 55 + 21 ) 
w2 = 55 / ( 80 + 55 + 55 + 55 + 21 ) 
w3 = 55 / ( 80 + 55 + 55 + 55 + 21 ) 
w4 = 55 / ( 80 + 55 + 55 + 55 + 21 ) 
w5 = 21 / ( 80 + 55 + 55 + 55 + 21 ) 

w1 = 0.3007519
w2 = 0.2067669
w3 = 0.2067669
w4 = 0.2067669
w5 = 0.0789474

1. Longitude: 14.2565389
1. Latitude: 48.2248439

2. Longitude: 14.2637736
2. Latitude: 48.2331576

3. Longitude: 14.2488966
3. Latitude: 48.232513

4. Longitude: 14.2488163
4. Latitude: 48.2277972


5. Longitude: 14.2647612
5. Latitude: 48.2299558


Location Longitude = 
 14.2565389 * 0.3007519 + 
 14.2637736 * 0.2067669 + 
 14.2488966 * 0.2067669 +
 14.2488163 * 0.2067669 +
 14.2647612 * 0.0789474

Location Latitude: = 
 48.2248439 * 0.3007519 + 
 48.2331576 * 0.2067669 + 
 48.232513 * 0.2067669 +
 48.2277972 * 0.2067669 +
 48.2299558 * 0.0789474

Result Longitude: 14.255507
Result Latitude: 48.2291628

Share:
48,033
kmp
Author by

kmp

SO Careers Profile: http://careers.stackoverflow.com/kevinphillips LinkedIn: http://www.linkedin.com/in/kevinphillips

Updated on March 26, 2020

Comments

  • kmp
    kmp about 4 years

    First of all, I am trying to do all this disaster in c# (.net 4) so if you come up with some code to help me that would be appreciated but really anything would help at this point.

    I have a situation where I have a device that can only get GSM Cell information (incidentally via the AT+KCELL command) so I have a collection of values about cell towers (each has LAC, MCC, MNC, Cell ID, Signal Strength and the first Timing Advance). I think, therefore, I am in a good place to be able to come up with some sort of longitude and latitude coordinate (albeit inaccurate, but, well meh). This is where I am reaching out for help because now my little brain is confused...

    I can see various services that provide cell code resolution (Google, Open Cell ID, etc) and they take LAC,MCC etc as arguments and return a coordinate. I figure that what they return would, therefore, be the coordinate of the given tower I pass in. So in my case I could send off all the LACs etc that I have and get back a collection of longitude and latitudes. Brilliant, but that is not where my device is. Now I think I need to do some kind of triangulation and this is where my lack of knowledge is hurting me.

    So am I right so far? Assuming I am, how do I perform this calculation (is there something out there that will tell me what to do with all these numbers or, even better, some open source library I can reference and feed all this stuff into to get something sensible)?

    I'm assuming that I would need to use the timing advance to work out some approximate distance from a cell tower (maybe using the signal strength somehow) but what do I have to do? As you can tell - I am way out of my depth here!

    For example, this is something I might get back from the aforementioned AT command:

    5,74,33,32f210,157e,8101,50,0,79,3,32f210,157e,80f7,37,64,5,32f210,157e,810b,37,55,32,32f210,157e,9d3,27,41,33,32f210,157e,edf8,15
    

    breaking it up and parsing it I would get (I hope I parse this right - there is a chance there is a bug in my parsing routine of course but it looks reasonable):

    Number of cells: 5
    

    Cell 1

    LAC: 5502
    MNC: 1
    MCC: 232
    Cell ID: 33025
    Signal: 80
    ARFCN: 74
    BSIC: 33
    Timing advance: 0
    Longitude: 14.2565389
    Latitude: 48.2248439
    

    Cell 2

    LAC: 5502
    MNC: 1
    MCC: 232
    Cell ID: 33015
    Signal: 55
    ARFCN: 79
    BSIC: 3
    Longitude: 14.2637736
    Latitude: 48.2331576
    

    Cell 3

    LAC: 5502
    MNC: 1
    MCC: 232
    Cell ID: 33035
    Signal: 55
    ARFCN: 64
    BSIC: 5
    Longitude: 14.2488966
    Latitude: 48.232513
    

    Cell 4

    LAC: 5502
    MNC: 1
    MCC: 232
    Cell ID: 2515
    Signal: 39
    ARFCN: 55
    BSIC: 32
    Longitude: 14.2488163
    Latitude: 48.2277972
    

    Cell 5

    LAC: 5502
    MNC: 1
    MCC: 232
    Cell ID: 60920
    Signal: 21
    ARFCN: 41
    BSIC: 33
    Longitude: 14.2647612
    Latitude: 48.2299558
    

    So with all that information how do I find, in the most accurate way, where I actually am?