私は何について話しているのですか?
物語は、 Google Maps JavaScript API V3 (サービスの操作のすべての例はここから取得されます)、そしてもちろん、1c:Enterprise 8.2プラットフォームに基づいています。 この例で使用されているコンポーネント1cはバージョン8.1にも存在するため、次のすべてが高い確率で機能します。
Google.Mapsの詳細
プラットフォームの3番目のバージョンには2つの用途があります。
- クライアント側でJavascriptライブラリを使用する、いわゆる「クライアント側ジオコーディング」。 この方法は、Googleが主なものとして位置付けています。
- サーバーの使用、「サーバー側のジオコーディング」。 この方法は、ユーザーとのインタラクティブな作業がないシステムに適しています。
Googleは両方の方法に制限を課しています。1つのIPアドレスに対して1日あたり2500件の座標を求める要求です。 ただし、これらはすべて元のリンク(上記のリンク)で読むことができます。
最初のメソッドに基づいてサンプルが作成されます。
そして、約1秒
シッククライアント1で機能する通常のフォームモードを使用します。 このメソッドは、変更なしでバージョン8.2に登場したフォームを操作する新しい管理モードでは機能しません。
正確に何をしますか:
- マップを操作するためのJavaScript関数を含むHTMLファイルを作成します
- 地図を表示し、座標または住所で見つかったラベルを表示できるコントロールを持つ1の外部処理を作成します
要するに:
1. htmlファイルを作成します
このサービスを使用するには、必要なjavascript関数を含み、1から開くファイルが必要です。 彼らが私のためにここでそれをしたので、私は彼の例を挙げません: Hello world! 、説明に進みます。
HTMLドキュメントを開くときに、「モスクワ」アイテムの座標を取得し、自動配置でマップを初期化する関数を追加します。
var map = null;
function initialize()
{
getLocation('', function (results, status)
{
if (status == google.maps.GeocoderStatus.OK)
{
GoogleLocation = results[0].geometry.location;
initializeMap(GoogleLocation);
addMarkerForLocation(GoogleLocation.lat(), GoogleLocation.lng());//
addMarkerForAddress(' ');//
} else alert(' ');
});
}
//GoogleLocation - ,
function initializeMap(GoogleLocation)
{
if (GoogleLocation != null)
{
var latlng = new google.maps.LatLng(GoogleLocation.lat(), GoogleLocation.lng());
var myOptions = {
zoom: 10,//
center: latlng,//
mapTypeId: google.maps.MapTypeId.ROADMAP//
};
map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
} else alert(' ');
}
次の場所の地理座標を返す関数:
//address - , ', '
//checkResult -
function getLocation(address, checkResult)
{
var geocoder = new google.maps.Geocoder();
geocoder.geocode({ address: address }, checkResult);
}
マップにラベルを追加する関数:
//
function addMarkerForLocation(lat, lng)
{
if ((lat != null)&&(lng!=null))
{
var marker = new google.maps.Marker(
{
position: new google.maps.LatLng(lat, lng),
map: map,
title: ' , ',
icon: 'http://google-maps-icons.googlecode.com/files/factory.png'
});
var infoWindow = new google.maps.InfoWindow;
bindInfoWindow(marker, infoWindow, ' html');
} else alert(' ');
}
// ,
function addMarkerForAddress(address)
{
if (map != null)
{
getLocation(address, function (results, status)
{
if (status == google.maps.GeocoderStatus.OK)
{
var marker = new google.maps.Marker(
{
position: new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng()),
map: map,
title: address,// ,
icon: 'http://google-maps-icons.googlecode.com/files/factory.png'//
});
} else alert(' ');
});
} else alert(' ');
}
そしてもちろん、情報ウィンドウにラベルの説明を表示できる機能:
//marker - ,
//infowindow - google.maps.InfoWindow
//html - html,
function bindInfoWindow(marker, infoWindow, html)
{
if (map != null)
{
google.maps.event.addListener(marker, 'click', function ()
{
infoWindow.setContent(html);
infoWindow.open(map, marker);
});
} else alert(' ');
}
2. 1秒で処理を作成します
処理フォーム1cで、タイプ「Field HTML Document」のコントロールを追加します(「Field HTML Doc」と呼びます)-以前に作成したhtmlファイルを表示します(「google.html」と呼びます)。 実際には、Microsoft Web Browser ActiveXオブジェクトを使用することもできますが、特にIEが使用されることを考えると、それはあなたの好みです。
ドキュメントのHTMLフィールドを追加した後、処理が開かれたときにマップを自動的に開く必要があります。 これを行うには、「開く」フォームハンドラを追加して、フォームエレメント、HTMLフィールドDoc。Go( "c:\ google \ google.html");に追加します。
これで十分です。外部処理を1秒で開始すると、htmlファイルが自動的に開き、ページが読み込まれると、Initialize()関数が開始され、マップを埋めて中央に配置します。
すべて問題なければ、イベントタグを1秒で追加する機能を追加しましょう。
これを行うには、フォームに入力テキストフィールド「住所」、「緯度」、「経度」、および「住所でラベルを追加」と「座標でラベルを追加」の2つのボタンを追加します。
そしてもちろん、ボタンに対応するハンドラー:
.HTML..parentWindow.eval("addMarkerForAddress('" + + "')");
.HTML..parentWindow.eval("addMarkerForLocation(" + (, "=") + "," + (, "=") + ")");
既に理解したように、ボタンがクリックされると、両方のハンドラーがhtmlファイルで設定したJavascript関数を呼び出し、地図上にマーキングを作成します。 実際、最初のバージョンではこれで十分です。
間違いなく、実際には、この方法を改善することができます-たとえば、ドキュメントのHTMLフィールドのメソッドを使用して1秒でhtmlファイルを使用せずに行うことができます。外部HTMLファイル。
また、Googleが座標を決定するためのリクエストの数を制限していることも考慮する価値があります。1つのIPから1日あたり2500件のリクエストです。 最も使用される座標のデータベースにストレージを追加することは論理的であり、クエリを保存することに加えて、フォーム内の追加機能、たとえば、特定の中心に関連する特定の地理座標内で必要なラベルを選択および表示する機会を提供します。