I would like to make a iPhone mapping application. I know that the iPhone can give detailed longitude and latitude coordinates of the user's specific location. How do Google Maps and other mapping applications translate the user's location into the location on the map? There seems to be lots of things to consider. For example, what if the map is rotated, and it seems to me that it there is a lot of scaling and stuff to consider. How does Google Maps translate the user's current location into a specific point on the map and have it be so accurate (within 2 to 3 meters). I would really appreciate an answer or any help. Thanks!
The Google Maps application knows:
the way the Google Maps service has divided the map into tiles
the size and location (lat/lon) of every map tile
the user's selected zoom level
the size of the device screen
the position latitude and longitude reported by the device
With this information, the maps application can do some simple linear arithmetic to find out which tile(s) need to be displayed on the screen so that the user's location is shown in the middle of the screen (or wherever desired).
Your heading/rotation is irrelevant when determining your location. Your location is based on data received from the GPS satellites. There's multiple satellites, and based on how far you are from each, your location is narrowed down to one point. This point has a very detailed pair of coordinates (think 10 digits past decimal point). Every point on Google's provided map is associated with a pair of coordinates. So when your phone figures out your coordinates, it then checks to see where on the map it corresponds to, and places you there on the map. All other locations are also based on coordinates.
Now, the map also has a setting where the map rotates based on your heading. That feature uses the built-in compass that the phone has. The iPhone has had a built-in compass since the 3GS, I believe.
In short, think of the maps provided by Google as a giant, extremely high-resolution image provided by Google, where every pixel (or less) on this image corresponds to a pair of coordinates. After your coordinates are determined, your placed on the corresponding point on that image, regardless of zoom level.
Google maps uses a few different methods to get the location of the user including the location of the mobile network tower the user is connected to (sometimes Google uses triangulation of 2 or more towers to make this more accurate http://techcrunch.com/2007/11/28/google-mobile-maps-pinpoints-your-location-without-gps/), the location of the ISP if the user is connected to WiFi and GPS.
The most accurate is GPS which provides Google with Latitude and Longitude coordinates accurate to within (If I remember correctly) 10 meters. All the images in the Google maps system have GPS coordinates stored against them so all Google has to do is retrieve the right map image and plot the user's position on the image.
I think this is what you're after but if you need more detail about something or if I've misunderstood please leave a comment and I'll modify this answer.
Edit
Please see this page which gives a good introduction to using Google Maps on the iPhone https://developers.google.com/maps/articles/tutorial-iphone
You don't need to code the algorithm for placing a marker on the map to show the users location, it's a simple matter of calling a function/method in the Google Maps API and it does all the work for you. I would suggest having a thorough look through the Google Maps API documentation to find what you need (also found at the previous link).
I think this might be the precise snippet of code you're after:
https://developers.google.com/maps/documentation/javascript/overlays#Markers
Related
I want to create kind of a map view, just without the map..
Sound strange? I'll explain - I have a bunch of coordinates representing users location that I want to show on screen with there relative location from one another and from the user location (in center of the screen). But I don't want to show the map itself because I don't won't to expose the real address for privacy issues.
The map should look something like this:
I though of using the regular map kit so I have all of its functionality but I'm not sure how to do that. and I'm not sure if this is a violation of the google service license...
Any ideas?
You might want to consider to just ignore the mapkit and go with just location and images as pins. You can easily calculate where a person is standing in relation to another by just the longitude and latitude. it is not a violation of the terms as the gps from the iphone has nothing to do with google. Only the actual maps do.
(however if you are using google api related stuff without showing a map it might be a violation, for example you cannot query for altitude to google itself without showing a map. But then again the phone's gps gives you the altitude.)
Well, First of all it will be the violation of Google, as MKMapView by default will query map tiles from Google server behind your hidden Overlay. So don't do that,
What I would suggest is to look into third party customize map solution for iOS. Something like MapBox.
See : MapBox
iOS SDK of MapBox : SDK
In which you can customize the color and look and feel of your Maps and location. There are paid option and free options too. Regarding the privacy issue I suggest you shoot an Email to MapBox people and ask if you can just hide the street names from the App.
I'm testing GeoLocation on iPhone. The ideia is to have a WebApp that runs on iPhone and, based on my location, gives-me the shortest path to well known spots in my city/country.
My current position os always the starting point.
The end point is always the nearest spot.
Imagine my known spots as all Train Stations in my city.
How can i do such thing? I guess i'll use google maps api but where do i define the spots? How can i say to google to trace the route to the nearest spot?
Thank u ALL:
I hope, you are going to show the route between two latitude & longitude values.The stackoverflow link will help you..
I played for a while with the maps framework from the iphone os sdk and the routemap api from cloudmade and it was fairly easy to display the current location and other information on a map by using the data provided by the GPS.
I have the map of a building(airport, mall etc) transformed in tiles of some sort, my question is what would be the best approach to obtain the current position of a phone inside a building? I know that GPS is not accurate inside buildings or might not work at all.
Unless you have a strange sort of building (i.e. radio transparent roof), you will not get a GPS signal inside the building, unless you are close to a window, which there are usually very few of (in a mall anyway).
You will not get useful positional information from cell triangulation (not at mall/airport terminal scale anyway).
I'm afraid I can't see any way to do what you are trying.
EDIT: come to think of it, some malls do have a glass roof, so it might be possible to get a GPS fix in some places. And some small airport terminals have big glass walls, although you'd be unlikely to want a map if they were very small.
If you are able to install a few WiFi nodes inside a building, you can get your location inside this building with Navizon's Indoor Positioning System.
They have a demonstration video of their indoor navigation solution on an iPhone.
Since you can't use GPS or Cell towers, you'll need some other sort of RF sources, that have known positions (as GPS and Cell Towers do) Perhaps that's what you're targeting anyway, something like a mall or airport with a number of WiFi routers in known locations, that you could "ping" off. It's not that simple of course --- an interesting research paper on such a service is at Microsoft Research: In fact they write about possible applications such as malls or airports.
Indoor Atlas maps magnetic fields in buildings and then uses smartphone magnetometer data to geolocate indoor locations to within 2 meters. It's based on the fact that buildings have predictable magnetic fields due to the materials they are constructed with. It's the best solution I've seen for this. You can try it for free as see if they've mapped the particular buildings you're trying to geolocate inside of. Another solution I've seen requires bluetooth devices within the building to assist with the geolocation, not as good because of the infrastructure requirements.
In an iPhone application I'm developing I need to get GPS coordinates to perform some actions based on the values received. Users should have two possibilities of giving the location:
automatically from iPhone build-in GPS
by finding a specific point on a map (Google Maps)
I know how to user CLLocationManager to get current position coordinates and I know how to add Google Maps using JS API. What I would like to know if how can I get coordinates for a specific point on a map that user clicks. Is that possible with UIWebView or is there any other way of getting the values I need?
I'd suggest using MapKit framework (introduced in SDK 3.0) that uses google maps services. MKMapView and other classes will provide all functionality you want without the need to mess with java-script:
Displaying google maps
Showing and tracking user location
Easy converting between view coordinates and geo coordinates (see convertPoint:toCoordinateFromView: and convertCoordinate:toPointToView: functions)
Creating and showing custom map markers
Reverse geocoding
etc. :)
I have been programming an app using the mapkit and the SDK 3.0. Everything works allright except for one detail. I have noticed that when displaying the userlocation I get different user positions on the map dependent of the current network. I have read about this problem and understand that it is common? In my WLAN is the user position correctly displayed. When using the 3G net (T-mobile) the position is some 100 meters away from my actual position. I understand this has to do with the celluar phone net using triangulation and in WLAN is the GPS or WiFi hotspot used. So, to my question. Is there a way to go around this? My app shows positions in a town and also the distance to those positions. It is very obvious and also missleading if the position is false because of the short distances. Is there a way (in code) to set which method to be used for getting the user postion? I have tested all other apps on my iPhone using maps and the problem seem to be the same by all of them. (If someone wants to test my app it is in the app store for free under car2go also other comments are of course interesting)
Thanks in advance!
-loop-
Core Location provides information about the vertical and horizontal accuracy of the location that it is reporting. One should use that accuracy to report to the user if the location is suspect. Google maps does this by increasing the size of the blue circle around the location marker. There are other ways to indicate to the user that the location is suspect, alert boxes, not showing the location if it falls outside of some predetermined accuracy, etc.
See: http://developer.apple.com/iphone/library/documentation/CoreLocation/Reference/CLLocation_Class/CLLocation/CLLocation.html#//apple_ref/occ/instp/CLLocation/horizontalAccuracy
Use an alternate source for your location? Portable GPS units would do the trick.
The real question is how can you correct the data being specified by the 3G triangulation. I wonder if you can do a differential to correct for the 3G's location errors.
1) In a given city, calibrate the 3G location errors by plotting the city. This could be corrected by the 3G networks at any time, so you'd have to have a way to verify and re-calibrate.
2) Calibrate the 3G network's location using a known location - a 3G location along with a GPS location. Take that as a differential that can be applied to other 3G locations. This assumes a consistent offset in the triangulation calculation which probably isn't the reality.
3) Wait for the 3G networks to fix it and do nothing in the meantime.
4) Provide the 3G network provider with error information in their triangulation and see if it is a priority for them.
I can't think of any other viable options...
Perhaps you can use CoreLocation directly. CLLocationManager gives you CLLocation objects than include their accuracy. If you get an accuracy below 50 meters, it the location probably came from GPS.