iPhone - can I use MapKit without displaying a Map? - iphone

I am writing an app that will use Reverse Geocoding to translate the user's current location into something like a Street Address or City. It seems the only way to get this kind of information is via MapKit (specifically the Placemark class).
Can I use this without having to display a map to the user?
The reason I am asking this is because in the Google HTTP Reverse Geocoding documentation it states:
Note: the geocoding service may only be used in conjunction with displaying results on a Google map; geocoding results without displaying them on a map is prohibited. For complete details on allowed usage, consult the Maps API Terms of Service License Restrictions.
I'm wondering if this holds true for the MapKit API as well or if Google and Apple worked something out.

I answer my own question way too much around here -
10.12 use or display the Content without a corresponding Google map, unless you are explicitly permitted to do so in the Maps API Documentation, the Street View API Documentation, or through written permission from Google (for example, you must not use geocodes obtained through the Service except in conjunction with a Google map, but the Street View API Documentation explicitly permits you to display Street View imagery without a corresponding Google map); or
via Google Maps iPhone TOS

The Map Kit framework provides an embeddable map interface for your application. Use it to display map or satellite imagery from the windows and views of your custom applications. You can also use the framework to annotate your maps with points of interest and other custom information.
What was stated above about using Googles HTTP API for reverse geocoding would be a better way to display the information you are looking for and using a text box to read the information.

Related

Supply path data to OpenStreetMaps or Bing Maps

Bing is comprehensive and it isn't Google. Also I was given to understand that Bing maps integrates OpenStreetMaps data. An answer for OpenStreetMaps would also be acceptable; it's the capability that matters: construct a URL that causes a browser to show a path on a map.
I don't want to embed Bing maps as a control in a web application. I want to construct an HTTP request (GET or POST) to launch Bing maps in its own right in another tab or browser supplying a small series of points (probably GPX format) to be shown as a route on the map.
It's the structure of the URL (and payload if applicable) that interest me. If you want to put code in an answer Javascript, Typescript or server side C# are all no problem.
When I research this I find loads of info on using an API to request a route between two points. This would be fabulous if I were trying to create yet another nav app but the requirement here is simply show this series of points as a path on a map.
I can do it for a single point (sample lifted from another question's answer) https://www.bing.com/maps/?v=2&cp=53.0210235~-1.48398532&lvl=16&dir=0&sty=c&sp=point.53.0210235_-1.48398532_My%20Phone
The Microsoft APIs documented here all require a registration and key because they're intended for Enterprise applications that support embedded maps in branded apps with the enterprise paying for use.
My application is FOSS and is intended for a private individual to plonk half a dozen points on a map in the course of trying to figure out where a phone was lost without consenting to being tracked by Google or a phone manufacturer.
The example above launches Bing maps and passes a point. Is there some kind of URL based way to get Bing maps to launch in its own right - not hosted in another app - and show a series of points for display as a path? If so, what search terms should be used when looking for details? The answer from which I lifted the sample has a link but it no longer produces the docs.
If you want to just open the bing maps website with some information drawn on the map, the documentation for that is here: https://learn.microsoft.com/en-us/bingmaps/articles/create-a-custom-map-url
To draw a polyline on the map, take a look at the section titled "collections" which describes how to add points, lines, or polygons to the map. As a quick example, this URL will create a simply polyline: https://bing.com/maps/default.aspx?sp=Polyline.47.68_-122.12_48.68_-123.12_49.68_-122.12_LINE_some%20notes_http://bing.com__%2300ff00__4px_Single_Solid

Draw route in Apple map in ios 6

I want to draw a route between two places. I have the GPS value of those places. I can get the GPS route values between those places from the google api http://maps.google.com/maps?output=dragdir&saddr=&daddr=.
I want to know that will google reject my app. Because I found that "the Directions API may only be used in conjunction with displaying results on a Google map; using Directions data without displaying a map for which directions data was requested is prohibited. Additionally, calculation of directions generates copyrights and warnings which must be displayed to the user in some fashion. For complete details on allowed usage, consult the Maps API Terms of Service License Restrictions"
Ple give me clarification on this.
You may not use the Google Maps API unless you use it with a Google Map. To use the direction data you would have to use a UIWebView with a javascript based Google Map.

How does Urbanspoon display map?

I've looked at Google's map API, which is all javascript and terribly slow on the iPhone. I then tried using the link option available at maps.google.com. That is fast but I can't see having much control over it. It also displays a little search box at the top of the map. Google's API says you must use maps in a website, which the iPhone isn't. I'm not sure about licensing for maps.google.com.
Urbanspoon's scope option does everything I want with maps in regards to displaying nearby businesses based on your location. Given the limited set of tools available for Google maps without mapkit, I don't know how they are doing it. It looks as though they have somehow integrated with mapkit. Clicking an annotation shows the callout and another click pushes a new view with details from that pin. Any ideas how this can be done?
-- EDIT --
Just to be clear, mapkit doesn't display surrounding businesses. That's the crux of the problem and I'm not sure how Urbanspoon got past it.
You can also use the Google AJAX Search API: http://code.google.com/apis/ajaxsearch/
It's a Javascript library, but for Flash, and other Non-Javascript environments, the API exposes a raw RESTful interface that returns JSON encoded results.
And within this API, what you want is the 'Local Search' if you are looking for nearby businesses based on the location.
Urbanspoon probably gets the data for the locations of nearby businesses via some other method than the MapKit API.
Then its likely that they use the MapKit API to display custom MapKit Annotations at those locations.
If you are looking for a business data provider you could look into yelp's API.

how to get latitude and longitude from the address in MKMapkit?

I have implemented one application .In which i want to get latitude and longitude from the address.I dont want to use java script.Is it possble then please help me.
AFAIK, MKMapKit does not support this.
MapKit has no geocoding support (only reverse geocoding) but Google offers a HTTP Geocoding service that's very easy to use – assuming you comply with their license terms:
Note: the geocoding service may only be used in conjunction with a Google map; geocoding results without displaying them on a map is prohibited.
Use the example from Apple’s «Location Awareness Programming guide: Geocoding Location Data» to pinpoint your location on the map, then call Google Geocoding Service (post a request, parse the result json/xml data) to get the address.

Integrate Google Maps API into an iPhone app

Update: iPhone SDk 3.0 now addresses the question here, however the NDA prevents any in depth discussion. Log in to the iPhone Dev Center if you need more info.
Ok, I have to admit I'm a little lost here.
I am fairly comfortable with Cocoa, but am having trouble picking up the bit of javascript needed to solve this problem.
I am trying to send a request to Google for a reverse geo code.
I have looked over the Google documentation I have viewed here:
http://code.google.com/apis/maps/documentation/index.html
http://code.google.com/apis/maps/documentation/geocoding/
Even after a rough reading, I am missing a basic concept:
How do I talk to google? In some examples, they show a url being sent to google (which seems easy enough), but in others they show javascript. It seems for reverse geocoding, the request might be be harder than sending the url with some parameters (but I hope I am wrong).
Can someone point me to the correct way to make a request? (In objective-C, so I can wrap my head around it)
UPDATE - iPhone 0.3 includes MapKit, which will hopefully be significantly faster than using the JS API. The blurb says that it will include reverse geocoding.
You can't make a request directly in objective-C, at least not within the terms of the Google API. The Google API is written in Javascript. You could use an objective-c to JS bridge, as the Google Maps Component does, but that doesn't really solve the issue - you're still making JS calls!
Unfortunately, that means you
a) need to use a webview
b) need to use the JS API which is slow... compare with the Google Maps application which uses a completely different OTA protocol (try packet sniffing it).
The Google Maps Component is, however, a useful tutorial in how to make simple calls to the API.
I have created SVGeocoder, a simple forward and reverse geocoder class for iOS. It uses the Google Geocoding API, returns SVPlacemark objects (an MKPlacemark subclass with a coordinate property) and uses blocks.
This is how you geocode an address string:
[SVGeocoder geocode:addressString
completion:^(NSArray *placemarks, NSError *error) {
// do something with placemarks, handle errors
}];
You can also reverse geocode a coordinate like this:
[SVGeocoder reverseGeocode:CLLocationCoordinate2DMake(45.53264, -73.60518)
completion:^(NSArray *placemarks, NSError *error) {
// do something with placemarks, handle errors
}];
The easiest way to get a Google map using Cocoa is to use the "Static Maps API". In practice, you need to prepare an NSURL that you use to contact Google. You get back your map as NSData, that you transform to an NSImage. Note that you can do both geocoding and reverse geocoding. You can also embed markers on the map. However, you loose the full controls you have access to if you use their JavaScript API.
Take a look at their reference guide here:
http://code.google.com/apis/maps/documentation/staticmaps/
Now that apple have release the MapKit API for OS 3.0, I think your question has been answered. Having looked at the API docs, I can see a heck of a lot of potential! I still would like to see reverse geocoding webservice from Google, but Yahoo will do in the meantime.
For your information: The reverse geocoding API from Google for requests by XML isn't public, so it's illegal to use. The only legal way is going through their JavaScript-API, which as you found out is harder to do in Cocoa than to simply send an HTTP request.
Alternatives: Reverse geocoding with simple XML/JSON requests is also available from Geonames or Yahoo.
Since iOS5 we have the following options as stated in the development doc:
* "A geocoder object uses a network service to convert between latitude and longitude values and a user-friendly placemark, which is a collection of data such as the street, city, state, and country information. Reverse geocoding is the process of converting a latitude and longitude into a placemark. Forward geocoding is the process of converting place name information into a latitude and longitude value. Reverse geocoding is supported in all versions of iOS but forward geocoding is supported only in iOS 5.0 and later."*
You can now use a CLGeocoder object.
Also try to take a look at google maps component.
Actually, I did not meant reverse geocoding as "translating a point into a human-readable address", but rather visualizing a point using a Google Map (that can also, depending on the accuracy level, show a human-readable address). This is the basic functionality that was required.
In practice, I just wanted to suggest the static maps API as a clean and fast way to:
1) given the coordinates obtained from the iPhone GPS sensor, retrieve a Google Map showing the point
2) given an address, transform it in the corresponding geographical coordinates and then use the coords to retrieve a Google Map showing the address given
Both are possible using simple NSURLs involving the staticmap and geo services
http://maps.google.com/staticmap?
http://maps.google.com/maps/geo?
passing of course the needed parameters to provide a suitable query string.
Kind regards
The big issue of course, is that the license agreement of both google and yahoo state you can't use these API's in "commercial applications". would hate to pub an app on the app store only to have it taken down and sued by yahoo or google. In reading the iPhone 3.0 map api and associated license this isn't mentioned but if you want an app to run on phones not upgraded....
Is there an answer for this that won't get one in trouble?
http://blog.cloudmade.com/2009/06/12/how-to-get-forward-geocoding-in-iphone-mapkit/
CloudMade seems to be an open-source map/location provider - the above blog post lists details on how to get forward geocoding.