TTMSFMXNativeMKMapView
Usage
A TMSFMXNativeMKMapView
object provides an embeddable map interface, similar to the one
provided by the Maps application. You use this class as-is to display map information and to
manipulate the map contents from your application. You can center the map on a given coordinate, specify the size of the area you want to display, and annotate the map with custom information.
Methods
Method name | Description |
---|---|
AddAnnotation(ALatitude, ALongitude: Double): TTMSFMXNativeMKAnnotation | Adds and returns a new annotation based on a Latitude and Longitude . |
AddAnnotation(ALatitude, ALongitude: Double; ATitle, ASubTitle: String): TTMSFMXNativeMKAnnotation | Adds and returns a new annotation based on a Latitude , Longitude , Title and SubTitle . |
AddAnnotation(ALocation: TTMSFMXNativeMKMapLocation): TTMSFMXNativeMKAnnotation | Adds and returns a new annotaton based on a location. |
AddAnnotation(ALocation: TTMSFMXNativeMKMapLocation; ATitle, ASubTitle: String): TTMSFMXNativeMKAnnotation | Adds and returns a new annotation based on a location , Title and SubTitle . |
AddCircle(ALatitude, ALongitude: Double; ARadius: Double): TTMSFMXNativeMKOverlay | Adds and returns a new circle overlay shape based on a Latitude , Longitude and Radius parameter. The Radius parameter is in meters. |
AddCircle(ALocation: TTMSFMXNativeMKMapLocation; ARadius: Double): TTMSFMXNativeMKOverlay | Adds and returns a new circle overlay shape based on a Latitude , Longitude and Radius parameter. The Radius parameter is in meters. |
AddPolygon(ALocations: array of TTMSFMXNativeMKMapLocation): TTMSFMXNativeMKOverlay | Adds and returns a new polygon overlay shape based on an array of Locations . |
AddPolyline(ALocations: array of TTMSFMXNativeMKMapLocation):TTMSFMXNativeMKOverlay | Adds and returns a new polyline overlay shape based on an array of Locations . |
DeSelectAnnotation(AAnnotation: TTMSFMXNativeMKAnnotation) | Deselects the annotation with or without animation. |
function AddImage(AURL: String; ATopLeftLocation, ABottomRightLocation: TTMSFMXNativeMKMapLocation): TTMSFMXNativeMKOverlay; | Adds and returns a new overlay image at a specific topleft and bottomright coordinate. (iOS 7 or later) |
function AddTiling(AURL: String): TTMSFMXNativeMKOverlay; | Adds and returns a new overlay object that supports rendering tiles from a specific tile server. (iOS 7 or later) |
GetAnnotation(Annotation: MKAnnotion): TTMSFMXNativeMKAnnotatio | Returns the annotation collection item based on the native MKAnnotation . |
GetOverlay(Overlay: MKOverlay): TTMSFMXNativeMKOverlay | Returns the overlay collection item based on the native MKOverlay . |
GetRegion: TTMSFMXNativeMKMapRegion; | Returns the current region. |
GetUserLocation: TTMSFMXNativeMKMapLocation | Returns the current user location |
procedure GetDirections(AStartLocation, AEndLocation: TTMSFMXNativeMKMapLocation; AAlternateRoutes: Boolean = False; ATransportType: TTMSFMXNativeMKMapViewDirectionsTransportType = ttDirectionsTransportTypeAutomobile; ADepartureDate: TDateTime = -1; AArrivalDate: TDateTime = -1); | Starts a get directions request with a given start and end location and optional parameters such as the possibility to calculate alternate routes and a departure and arrival date. When calling this method, the OnGetDirections event is triggered. When an error occurred during the request, the OnGetDirectionsError event is triggered.There is a second overload that accepts latitude and longitude parameters for both the start and the end location as doubles. (iOS 7 or later) |
RemoveAllAnnotations | Removes all annotations from the collection and the MapView. |
RemoveAllOverlays | Removes all the overlays from the collection and the MapView |
RemoveAnnotation(AAnnotation: TTMSFMXNativeMKAnnotation) | Removes a specific annotation from the collection and the MapView. |
RemoveOverlay(AOverlay:TTMSFMXNativeMKOverlay) | Removes a specific overlay from the collection and the MapView. |
SelectAnnotaion(AAnnotation: TTMSFMXNativeMKAnnotation; AAnimated: Boolean) | Selects a specific annotation and shows the callout, with or without animation. |
SetCenterLocation(ALocation: TTMSFMXNativeMKMapLocation) | Centers the map at a specific location. |
SetRegion(ARegion: TTMSFMXNativeMKMapRegion; AAnimated: Boolean) | Sets the visible region of the MapView. |
SetRegion(ATopLeftLocation, ABottomRightLocation: TTMSFMXNativeMKMapLocation; AAnimated: Boolean) | Sets the visible region of the MapView with TopLeft and BottomRight coordinates. |
XYToCoordinate(X, Y: Single): TTMSFMXNativeMKMapLocation | Returns a latitude and longitude of an X and `Y coordinate on the map based on the current region of the MapView. |
ZoomToFitAnnotations(AIncludeUserLocation: Boolean = false; ALatitudeSpanOffset: Double = 0; ALongitudeSpanOffset: Double = 0); | Zoom the mapview to show/fit all annotations with optional parameters to include user location and additional region span offset. |
Events
Property name | Description |
---|---|
OnAnnotationDragStateChanged | Event called when a pin is being dragged to a new location. |
OnAnnotationLeftCalloutAccessoryTapped | Event called when the left callout accessory is tapped on an annotation. |
OnAnnotationRightCalloutAccessoryTapped | Event called when the right callout accessory is tapped on an annotation. |
OnClick | Event called when clicking on the map. The latitude and longitude of the position on the map are passed as parameters. |
OnDidDeselectAnnotationView | Event called when deselectin an annotation. |
OnDidFailLoadingMap | Event called when the map loading failed. |
OnDidFailToLocateUser | Event called when the map did fail to locate the user location when the user location is active. |
OnDidFinishLoadingMap | Event called when the map did finish loading. |
OnGetDirections | Event called when a directions request is finished and successfully found one or multiple routes. |
OnGetDirectionsError | Event called when a directions request is finished and an error occurred during the request. |
OnSelectAnnotationView | Event called when an annotation is selected. |
OnDidStopLocatingUser | Event called when the MapView stops locating the user. |
OnDidUpdateUserLocation | Event called when the user location is updated. |
OnLongPress | Event called when tap holding on the MapView for at least 1.5 seconds |
OnRegionDidChangeAnimated | Event called when the region of the MapView is changed. |
OnRegionWillChangeAnimated | Event called when the region of the MapView will change. |
OnWillStartLoadingMap | Event called when the MapView will start loading. |
OnWillStartLocatingUser | Event called when the MapView will start locating the user. |
Adding Annotations
Annotations can be added to the map by directly adding them to the collection, or through one of the AddAnnotation
overload methods. Below is a sample that demonstrates this.
In this sample, we drop a TMSFMXNativeMKMapView
control on the form and add the following code in a button click:
var
loc: TTMSFMXNativeMKMapLocation;
begin
loc := TMSFMXNativeMKMapView1.XYToCoordinate(TMSFMXNativeMKMapView1.Width / 2,
TMSFMXNativeMKMapView1.Height / 2);
TMSFMXNativeMKMapView1.AddAnnotation(loc, 'Hello World', 'Subtitle');
This code will return the correct coordinate of the center of the map, regardless of where the map is positioned. Clicking the button drops an annotation on the MapView:
If you pan the Map, and click the button, the pin will be dropped in the center of the MapView again, but on a different coordinate. The XYToCoordinate
functionality is using the current region, and zooming level of the MapView to return the correct coordinate.
Pin vs View
By default, the annotation that is added on the map displays a pin, but this can also be changed per annotation. On the annotation collection item, a Bitmap
property is available to customize the default view of an annotation. The sample below shows how to add a custom image for an annotation.
var
loc: TTMSFMXNativeMKMapLocation;
ann: TTMSFMXNativeMKAnnotation;
begin
loc := TMSFMXNativeMKMapView1.XYToCoordinate(TMSFMXNativeMKMapView1.Width / 2,
TMSFMXNativeMKMapView1.Height / 2);
ann := TMSFMXNativeMKMapView1.AddAnnotation(loc, 'Hello World', 'Subtitle');
ann.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0))+'pin.png');

Adding Overlays
Overlays are shapes that can be added to the map, there are different kinds of overlays, and each ovelay can be configured in stroke and fill color and opacity. The MapView exposes an overlay collection and a couple of functions that can be used to add an overlay to the map. Currently, a circle, polygon and polyline can be added to the MapView. Below is a sample of a circle and a polyline that is added to the MapView. Note that the code is wrapped with a BeginUpdate
and EndUpdate
. This is crucial to make sure the overlay shape has the correct position, and appearance when added.
//Center circle with 500 km radius
TMSFMXNativeMKMapView1.BeginUpdate;
c := TMSFMXNativeMKMapView1.AddCircle(TMSFMXNativeMKMapView1.XYToCoordinate(TMSFMXNativeMKMapView1.Width / 2,
TMSFMXNativeMKMapView1.Height / 2), 500000);
c.LineWidth := 3;
c.LineColor := TAlphaColorRec.Greenyellow;
c.Color := TAlphaColorRec.Darkgoldenrod;
c.Opacity := 0.5;
c.LineOpacity := 0.5;
TMSFMXNativeMKMapView1.EndUpdate;
//Bermuda triangle
TMSFMXNativeMKMapView1.BeginUpdate;
arr[0].Latitude := 25.774252;
arr[0].Longitude := -80.190262;
arr[1].Latitude := 18.466465;
arr[1].Longitude := -66.118292;
arr[2].Latitude := 32.321384;
arr[2].Longitude := -64.75737;
arr[3] := arr[0];
c := TMSFMXNativeMKMapView1.AddPolyline(arr);
c.LineColor := TAlphaColorRec.Red;
TMSFMXNativeMKMapView1.EndUpdate;
User Location
The MapView can also display the user location, to show the user location, you can set the property ShowsUserLocation
to true
. When the application shows the user location for the first time, the application asks if it is ok to allow access. After clicking ok, the user location is being displayed inthe MapView.
When the user location is displayed, the MapView does not automatically scroll to the location. The sample implements the OnDidUpdateUserLocation
to center the user location and log the latitude and longitude in a listbox.
Included in the distribution is a Map demo that demonstrates adding annotations, panning and zooming in the MapView as well as showing a callout accessory view to display additional information.
Directions (iOS 7 or later)
The MapView has built-in functionality to calculate directions between 2 locations. Below is a sample between San Francisco and Los Angeles with the optional parameter to calculate alternative routes.
TMSFMXNativeMKMapView1.GetDirections(37.774929499999999, -122.4194155, 34.054434999999998, -118.253393, true);
OnGetDirections
event is called with a
TTMSFMXNativeMKDirectionsResponse
record which contains information about the routes that were found. To visualize this data, you can add a polyline to the map that accepts an array of locations with the following code:
procedure TForm1.TMSFMXNativeMKMapView1GetDirections(Sender: TObject;
AResponse: TTMSFMXNativeMKDirectionsResponse);
var
r: Integer;
pl: TTMSFMXNativeMKOverlay;
begin
TMSFMXNativeMKMapView1.BeginUpdate;
for r := 0 to Length(AResponse.Routes) - 1 do
begin
pl := TMSFMXNativeMKMapView1.AddPolyline(AResponse.Routes[r].Locations);
pl.LineOpacity := 0.75;
if r = 0 then
pl.LineColor := TAlphaColorRec.Red
else if r = 1 then
pl.LineColor := TAlphaColorRec.Blue
else if r = 2 then
pl.LineColor := TAlphaColorRec.Purple;
end;
TMSFMXNativeMKMapView1.EndUpdate;
end;
Tiles (iOS 7 or later)
The MapView also supports the MKTileOverlay
, which implements an overlay that is
optimized for covering an area of the map using individual bitmap tiles. The bitmap tiles
are provided by a server through a specific URL. Below is a sample before and after
applying Google Maps and OpenStreetMap tiles with their specific formatted URL’s.
procedure TForm1.TMSFMXNativeUIButton1Click(Sender: TObject);
begin
TMSFMXNativeMKMapView1.BeginUpdate;
TMSFMXNativeMKMapView1.AddTiling('http://mt1.google.com/vt/lyrs=m@110&hl=pl&x={x}&y={y}&z={z}');
TMSFMXNativeMKMapView1.EndUpdate;
end;
procedure TForm1.TMSFMXNativeUIButton2Click(Sender: TObject);
begin
TMSFMXNativeMKMapView2.BeginUpdate;
TMSFMXNativeMKMapView2.AddTiling('http://tile.openstreetmap.org/{z}/{x}/{y}.png');
TMSFMXNativeMKMapView2.EndUpdate;
end;

Image overlay (iOS 7 or later)
When a specific area needs to be marked, you can add an image that is added on top of the map, bounded by a topleft and bottomright coordinate. Below is a sample that adds an image (added through the deployment window in your project) and renders it at the specific topleft and bottomright coordinate. It also centers and zooms the map on a specific coordinate to visualize the image.
TMSFMXNativeMKMapView1.BeginUpdate;
tl := MakeMapLocation(34.4311, -118.6012);
tr := MakeMapLocation(34.4311, -118.5912);
bl := MakeMapLocation(34.4194, -118.6012);
br := MakeMapLocation(34.4194, -118.5912);
mr := MakeMapLocation(34.4248, -118.5971);
splat := Abs(br.Latitude - tl.Latitude);
splon := Abs(br.Longitude - tl.Longitude);
rgn.Center.Latitude := mr.Latitude;
rgn.Center.Longitude := mr.Longitude;
rgn.Span.latitudeDelta := splat;
rgn.Span.longitudeDelta := splon;
TMSFMXNativeMKMapView1.SetRegion(rgn, True);
TMSFMXNativeMKMapView1.AddImage(ExtractFilePath(ParamStr(0)) + 'overlay_park.png', tl, br);
TMSFMXNativeMKMapView1.MapType := mtMapTypeHybrid;
TMSFMXNativeMKMapView1.EndUpdate;
TMSFMXNativeMKMapView1.MapType :=
mtMapTypeHybrid;
to have a better view of the added image.
![]() |
![]() |